Java基础/面试题

(针对某一部分常见的面试题或重点提问)

1.谈谈Java面向对象的理解(面向对象的三大特性),与面向过程的对比?

(1)对面向对象的理解:面向对象是将现实世界某一具体的事物抽象成一类事物,每一个具体的事物是这一类事物的一个实例对象。
(2)面向对象的三大特性:封装、继承、多态。
①封装:是指将对象的属性和实现细节隐藏起来,通过对象的共有方法暴露对象的功能、访问对象的属性。
②继承:子类通过继承父类,来拥有父类的所有属性和方法,实现软件复用。(对于私有属性、私有方法只能拥有,无法访问。)
③多态:指一个对象在调用同一个方法时可能会有不同的行为特征,分为运行时多态(如重写)和编译时多态(如重载)。
(3)面向过程:关注实现的函数的调用,指的是对调用的函数的过程。耦合性高、复用性差、拓展难。

2.关键字:static、final、super、transient

(1)static:可以用来修饰变量(静态变量/类变量)、方法(静态方法/类方法)、类;可以直接通过类调用访问类变量、类方法,类变量和类方法属于类,不属于任何类的实例对象。
(2)final:可以用来修饰变量(常量)、方法、类。修饰的变量即为常量(值不可以修改,如果是引用类型,引用的对象地址不可以改变,但是对象可以改变),修饰的方法不可以被重写,修饰的类不可以被继承。
(3)super:一般用于调用父类对应的方法。
(4)transient:修饰用于阻止序列化。

3.重载和重写

(1)重载:发生在一个类中,指的是该类中对于两个同名不同参的方法,在进行方法调用的时候根据参数列表进行调用,发生在编译时。
(2)重写/覆盖:发生在两个类(父类和子类)中,指子类中有一个与父类中同名同参的方法,在进行方法调用的时候会调用子类中的方法,发生在运行期。

4.String(为什么设计成不可变的)、StringBuilder、StringBuffer

(1)String设计为不可变的原因主要从三个方面考虑:
①运行时常量池:如果一个字符串对象在创建时,若在运行时常量池中存在该字符串字面量,则直接将对象指向运行时常量池中的字符串字面量,如果不存在,则在堆中创建一个新的字符串对象。
②安全性:一般而言,字符串作为多个类和类库的参数,如url、文件路径、反射的参数等,为了避免字符串被引用后修改,影响原先的引用。另外,在进行参数传递时,在另一个方法内部修改了该字符串,如果可变,则会直接改变了原方法的字符串,这可能是我们所不希望的。
③考虑到hashCode散列码的计算:作为如hashmap等的主要键值,不可变性保证了该字符串的hashcode的唯一性,不用在进行修改后需要重新进行散列计算对应的hashcode值。
(2)StringBuider是一个可变的字符串类,内部是一个char类型的数组,默认长度为16,满后创建新的数组,长度+16。
(3)StringBuffer是线程安全的,与StringBuilder相似,但添加了synchronized加锁保证。

5.基本数据类型和包装类、什么是自动装箱、拆箱,为什么要有包装类,自动装箱和拆箱的意义是什么?

基本数据类型:
图片说明
(1)自动装箱、拆箱:基本数据类型在与对应的包装类进行运算或赋值操作时自动将基本数据类型装箱成包装类或将包装类拆箱成基本数据类型。
(2)Integer内部有一个数组缓存了-127~128范围的Integer对象,如果某个Integer的值在该范围,则指向该对象。
(3)为什么需要包装类:Java身为面向对象的语言,一切皆对象,所有的类都继承自Object,但是对于基本数据类型来说,既不是引用类型,也不是Object的子类,那么需要包装类去保证面向对象的完整性。对于一个包装类而言,它的值可以为null,另外,java集合能接收的类型只有Object类型,想要去存放基本数据类型是无法做到的,所以只能通过包装类做到。

6.接口与抽象类、接口interface与继承extends

(1)接口可以实现理论上的多继承、而抽象类不能。
(2)接口里的方法都必须是抽象方法、抽象类里可以有具体的实现方法。
(3)接口不能有构造函数、抽象类可以定义构造函数。

7.==与equals()、equals()与hashCode()

(1)==对于基本数据类型而言,比较的是值是否相等;对于引用数据类型而言,比较的是引用地址是否相等。
(2)equals()未重写时在Object类中内部实现就是直接==,在String中进行了重写,先进行==判断,如果引用地址相等则直接返回true,否则判断两个字符串的长度是否相等,相等则比较具体的字符串值。
(3)hashCode()多用于在hashmap、hashset中进行散列快速确定键值的位置,以减少equals()的次数。
(4)为什么重写equals()必须重写hashCode():因为规定如果两个元素equals()返回true,则他们的hashCode必须相等,如果不重写,则在进行散列后得到的值可能就不相等,但equals()返回true了,也就是说重写hashCode()是为了让对象与对象地址产生关联。

8.值传递与引用传递

(1)值传递:对于基本数据类型传递的是值的拷贝,对引用类型传递的是引用地址的拷贝。(形参只是得到了实参的拷贝值)
(2)引用传递:传递的是引用。(形参是实参的引用)

9.什么是反射?反射的优缺点?反射的应用?

(1)反射:在类加载时,在堆中生成了一个可以访问方法区中运行时数据结构的class对象,反射是指在运行期间,通过该class对象来获取所有属性和方法,进而调用对应的方法。
(2)缺点:反射破坏了原有的封装性,导致原本不想暴露的属性方法被获取到了,另外反射加载带来了额外的性能开销。

10.浅拷贝与深拷贝

(1)浅拷贝:创建新对象,复制原对象的非静态属性(基本数据类型拷贝值,引用数据类型拷贝对象地址)。
(2)深拷贝:不仅复制对象本身,还复制对象属性中包含的引用 所指向的那些对象。

11.泛型

12.注解

13.异常处理

(1)Throwable分为两类:Exception异常和Error错误,Exception又分为RuntimeException运行时异常、CheckedException检查时异常,前者会在运行时抛出异常,常见的有NullPointException空指针异常、ArrayIndexOutOfBounds数组越界异常等,后者在编译前就需要显示try-catch捕获处理或throw/throws抛出,如IOException等。Error是由于虚拟机内部引起的错误,常见的有OutOfMemoryError内存溢出错误、StackOverFlowError栈溢出错误等。
(2)throw和throws的区别:throw在方法体内部抛出具体的异常对象,throws在方法头中抛出异常类。

14.jdk1.8新特性:lambda表达式

全部评论
优秀优秀
点赞 回复 分享
发布于 2021-07-14 21:42

相关推荐

点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务