面试题-Java基础(新更新版)
前言
Java基础部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,希望对大家起到一定的帮助。
修改记录
日期 | 修改内容 |
---|---|
20240822 | 优化7题答案 |
20240823 | 增加16题访问级别;增加17题类重名问题 |
Java基础
什么是面向对象编程?
面向对象编程是指使用类作为代码组织的基本单元,并将封装、继承、多态作为代码设计和实现的基石。面向对象编程和面向过程编程有什么区别?
和面向对象相比,面向过程的代码组织基本单元是方法,数据和方法是相分离的,并且不支持面向对象的特性,比如:封装继承多态等等Java ⾯向对象编程三⼤特性: 封装 继承 多态
- 封装:安全性(对代码自身来说);易用性(对代码调用者来说)
- 继承:解决代码复用的问题
- 多态:提高代码的扩展性和复用性,以遍历数据结构为例
- 如果没有多态,print方法的参数需要传递不同的数据结构,编写多个;有了多态,直接传递接口即可---》提高了代码的复用性
- 有多态,我们要添加新的数据结构时,只需要编写一个新的类实现接口即可,不需要修改print的代码。---》提高了代码的可扩展性
重载和重写的区别?
- 重载是指 同一个类中可以有多个方法名相同,但参数不同的方法。使用重载的目的是当方法功能相同而参数不同时,程序员不需要记忆很多不同的方法名,方便程序员调用方法。
- 重写是指 子类可以对父类的非final且可访问的方法功能进行重新编写。使用重写的目的一般都是子类为了扩展父类的方法功能。(注意:重写抛出的异常不能大于父类的异常,访问级别不能低于父类的访问级别)
构造器是否可以重写?
构造器不可以被重写,但可以被重载。
String、StringBuilder和StringBuffer的区别?
- String是不可变的,另外两个都是可变的。
- String不变所以线程安全,Buffer因为加了sync锁,所以也线程安全;builder不是线程安全的。
- 如何应用?
- 如果不需要构造大量变化字符串数据,使用String就好
- 如果需要构造大量变化字符串,单线程的用Builder,多线程的用Buffer
在 Java 中定义⼀个不做事且没有参数的构造⽅法的作⽤?
- 无参数构造方法的作用:设置默认值
- 当编写的类没有提供任何构造方法时,系统会自动添加一个无参数构造方法,并且数值型设置为0,把布尔型设置为false,对象设置为null
- 报错的情况:当类中至少提供了一个构造器,且没有提供无参数构造器时
- 实例化时没有提供参数就会出错
- 子类实例化前会先实例化父类,如果没有显示调用super,系统会默认调用无参构造器,这时也会出错
接⼝和抽象类的区别是什么?
- 抽象类最主要是为了解决代码复用的问题,子类和抽象父类是is-a的关系。(具体项目中,我把协议中的相同部分抽取出来,编写了AbstraceCommand和AbstraceMessage,里面包含了所有指令相同的部分,包括:消息头、类型字段等等,每个子类也有自己的成员属性,在子类构造方法中会调用一个父类的抽象方法来进行子类成员属性具体的解码;父类的构造方法中负责解码相同的部分。)
- 接口最主要是用于适应需求变动带来的实现变化问题,实现类和接口是has-a关系。如果需求几乎不会改变或者只有一种实现,可以考虑直接用实现类。(具体项目中,发送指令的驱动类就设计成了接口,提供了一种发送指令的方法,因为需要兼容不同的协议;利用一个工厂类来实现根据协议类型自动选择不同的驱动发送类实现,或者也可以使用spring容器,利用不同的协议类型名来获取实现类也可以)
- 抽象类代表了一种自下而上的编程思路,先有了重复的子类,后有抽象的父类;接口代表了一种自上而下的编程思路,编程时先关注接口对应的功能,后考虑具体的实现。
== 与 equals(重要)
- == 如果是基本数据类型,比较的是值;如果是引用类型,比较的是地址
- 基本数据类型没有equals方法;引用类型,如果不重写,和==的语义一样;具体实践中应该依照具体的业务需求来重写。
为什么会有hashcode方法?hashcode方法和equals方法的关系是什么?
hashcode方法可以返回对象的hash值,使用hash值可以用O(1)的时间复杂度来找到插入位置并且判断是否有冲突。
hashcode和equals方法用在Hash相关的数据结构中,比如hashmap,判断逻辑是,先hashcode找到位置,然后判断位置上是否有元素,如果没有直接插入;如果有再比较equals。
为什么 Java 中只有值传递?
值传递指的是,传递方法参数时,传递的是原始数据的拷贝。针对引用数据类型来说,拷贝的是一个地址,指向的还是原来的对象。
final关键字可以用在哪里,分别有什么作用呢?
- final关键字可以用于类,变量和方法上。
- 用于类:代表这个类不可以继承,并且所有的成员方法都会被隐式的加入一个final修饰
- 用于变量:
- 如果是基本数据类型:代表这个变量初始化后就不能再修改值
- 如果是引用类型:这个引用类型引用的对象在初始化后不能修改
- 用于方法:
- 防止继承类重写这个方法
- final关键字可以用于类,变量和方法上。
简单说说,Java中的异常处理?
在java中,所有的异常都有一个共同的父类,Throwable类,下面有两个重要的分支
- error:程序无法处理的错误
- exception:程序可以处理的异常
在catch和finally语句中,是否可以更改返回值?
- finally中有return的话,就以finally中的return为准。
- finally中没有return,如果finally修改的是基础类型,那么不会修改成功;修改的是引用类型的成员变量,那么可以修改成功。
深拷⻉ vs 浅拷⻉
- 浅拷贝:原始对象和clone后的对象引用指向同一个对象
- 深拷贝:原始对象和clone后的对象引用指向的是不同的对象
说说Java中访问级别的作用
- 访问级别是用来控制类本身 类中的成员 对其他类的可见性
- 对类来说,有两种访问级别:public 和 包访问级别
- 如果是包访问级别,那么意味着只有同包的类可以访问,包外的类不可以访问
- 如果是public,意味着除了包内类可以访问,其他包的类也可以访问这个类
- 对类中的成员来说,访问级别有四种:private,包访问级别,protected,public
- private:只有类内部可见
- 包访问级别:在private基础上,增加同包的类可见
- protected:在包访问级别的基础上,增加子类可见
- public:在protected访问级别基础上,增加其他包的类可见
如果使用*语句导入多个包,且导入的多个包中存在同名类,写代码时会有什么问题,如何解决?
- 问题:编译器会不清楚使用的是哪个包的类,需要明确。
- 如果只使用其中某一个类,那么再加入一条import语句,明确要使用的是哪个包中的类即可。如:import java.util.Date
- 如果两个同名类都需要使用,那么需要在代码中写出完整名称:
- java.util.Date deadline = new java.util.Date();
- java.sql.Date today = new java.sql.Date(...);
面试题-Java基础(新更新版)的更多相关文章
- 测开-面试题-Java基础
1 垃圾回收机制? 答: 一.手动垃圾回收机制(C/C++)手动:使用过的对象必须要程序员自己来回收 缺点: 1.若程序员忘记及时回收--对象会一直在内存中,若程序运行时间很长,内存中存在大量垃圾,空 ...
- 面试题-Java基础-面向对象
1.面向对象软件开发的优点有哪些? 代码开发模块化,更易维护和修改.代码复用.增强代码的可靠性和灵活性.增加代码的可理解性.面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象.下面的章节我们会 ...
- 面试题-Java基础-集合和数组
1.Java集合类框架的基本接口有哪些? 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许.Java集 ...
- 面试题-Java基础-线程部分
1.进程和线程的区别是什么? 进程是执行着的应用程序,而线程是进程内部的一个执行序列.一个进程可以有多个线程.线程又叫做轻量级进程. 2.创建线程有几种不同的方式?你喜欢哪一种?为什么? 有三种方式可 ...
- 蓝桥网试题 java 基础练习 十六进制转八进制
- -------------------------------------------------------------------------------------------------- ...
- JAVA面试题——JAVA基础篇
1.JAVA多态的实现方式:继承.重载.覆盖 2.JAVA有8种基本数据类型:byte.short.int.long.float.double.boolean.char 3.final.finally ...
- 面试题-Java基础-垃圾回收
1.Java中垃圾回收有什么目的?什么时候进行垃圾回收? 垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源. 2.System.gc()和Runtime.gc()会做什么事情? 这两个方 ...
- 面试题-Java基础-开发环境
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设 ...
- 面试题-Java基础-Applet部分
java applet是能够被包含在HTML页面中并且能被启用了java的客户端浏览器执行的程序.Applet主要用来创建动态交互的web应用程序.
- 面试题-Java基础-异常部分
1.Java中的两种异常类型是什么?他们有什么区别? Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常.不受检查的异常不需要在方法或者是构造函数上声明,就算方 ...
随机推荐
- VUE3基础环境搭建
VUE3基础环境搭建 1. 安装vue.js npm install vue -g 安装webpack Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bun ...
- [LC1161]最大层内元素和
题目概述 给你一个二叉树的根节点 root.设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推. 请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那 ...
- 高通Android工程释放ADSP侧GPIO给AP侧(HLOS)解决uart只能收或者发,gpio 无法配置成输入或者输出
在许多sensor的调试过程中总是会遇到各种GPIO被占用的情况,特别是以下几种情况:UART 只能发或收,GPIO 配置了pinctl output但是gpio依旧为输入. 1.判断GPIO口状态 ...
- 《计算机体系结构与SoC设计》(二)
1. 多指令流单数据流 多指令流单数据流(Multiple Instruction Stream, Single Data Stream,简称 MISD)是一种处理器设计概念,它允许处理器在单个时钟周 ...
- 微服务实战系列(五)-注册中心Eureka与nacos区别-copy
1. 场景描述 nacos最近用的比较多,介绍下nacos及部署吧,刚看了下以前写过类似的,不过没写如何部署及与eureka区别,只展示了效果,补补吧. 2.解决方案 2.1 nacos与eureka ...
- Java虚拟机调优-垃圾回收算法-工具
背景: 垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对 ...
- w3cschool-微信小程序开发文档-云开发
微信小程序云开发 介绍 2020-07-24 16:19 更新 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的原生云端支持和微信服务支持,弱化 ...
- 分布式配置中心--Apollo
分布式配置中心--Apollo Apollo(阿波罗)是携程开源的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,支持配置热发布并实时推送到应用端,并且具备规范的权限及流程治理等特性,适用 ...
- C语言实现高阶阶乘(1000的阶乘C语言实现)
由于C语言的变量的大小的限制,使用已有变量无法保存阶乘结果,所以使用数组保存结果,从而使得无法保存的结果得以保存. #include <stdio.h> void Print_Factor ...
- Confusion pg walkthrough Intermediate
namp ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.188.99 Starting Nmap 7.94SVN ( https://nmap.org ) at ...