跳至主要內容

Java基础常见面试题总结(中)

Mr.XuJava约 1385 字大约 5 分钟

1.int 和 Integer 有什么区别?

int 和 Integer的区别主要体现在以下几个方面:

  1. 数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型;
  2. 默认值不同:int 的默认值是 0,而 Integer 的默认值是 null;
  3. 内存中存储的方式不同:int 在内存中直接存储的是数据值,而 Integer 实际存储的是对象引用,当 new 一个 Integer 时实际上是生成一个指针指向此对象;
  4. 实例化方式不同:Integer 必须实例化才可以使用,而 int 不需要;
  5. 变量的比较方式不同:int 可以使用 == 来对比两个变量是否相等,而 Integer 一定要使用 equals 来比较两个变量是否相等。

2. Integer 有什么优点?Integer 可以使用 == 进行比较吗?为什么?

  • 包装类 Integer 的优点是解决了基本数据类型无法做到的事情泛型类型参数、序列化、类型转换、高频区间数据缓存等问题。
  • Integer 不能使用 == 比较,因为 Integer 本身是对象,而 == 比较的是对象地址,所以不能使用== 比较。

3. 普通类和抽象类有哪些区别?

  1. 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  2. 抽象类不能直接实例化,普通类可以直接实例化。

4. 抽象类必须要有抽象方法吗?

不需要,抽象类不一定非要有抽象方法。

5. 抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类。

6. 抽象类和接口有什么区别?

接口和抽象类都是用来定义对象的公共行为的,但二者有以下 7 点不同:

  1. 定义的关键字不同;
  2. 子类继承或实现关键字不同;
  3. 类型扩展不同:抽象类是单继承,而接口是多继承;
  4. 方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符;
  5. 属性方法控制符:抽象类无限制,而接口有限制,接口默认的是 public 控制符;
  6. 方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法不能有实现,但在 JDK 8 中的 static 和 defualt 方法必须有实现;
  7. 静态代码块的使用不同:抽象类可以有静态代码块,而接口不能有。

7. Java 中 this 和 super 有什么区别?

this 和 super 都是 Java 中的关键字,都起指代作用,当显式使用它们时,都需要将它们放在方法的首行(否则编译器会报错)。this 表示当前对象,super 用来指代父类对象,它们有四点不同:

  1. 指代对象:super 指代的是父类,是用来访问父类的;而 this 指代的是当前类;
  2. 查找访问:super 只能查找父类,而 this 会先从本类中找,如果找不到则会去父类中找;
  3. 本类属性赋值:this 可以用来为本类的实例属性赋值,而 super 则不能实现此功能;
  4. 配合 synchronized 使用不同:因为 this 表示当前对象,所以this 可用于 synchronized(this){....} 加锁,而 super 则不能实现此功能。

8. 为什么返回类型不算方法重载?

因为不同的返回值类型,JVM 没办法分辨到底要调用哪个方法,JVM 调用方法是通过方法签名来判断到底要调用哪个方法的,而方法签名 = 方法名称 + 参数类型 + 参数个数组成的一个唯一值,这个唯一值就是方法签名。

从方法签名的组成可以看出,返回类型不是方法签名的组成部分,所以不同的返回类型也就不算方法重载了,因为它不能让 JVM 确定要调用的具体方法。

9. 方法重写时需要注意什么问题?

Java 中的方法重写(Override)是在子类重新定义父类已有方法的过程,它是面向对象编程中多态的具体表现。我们可以通过 @Override 关键字重写父类中的某个方法,但在重写的过程中需要注意以下 5 个问题:

  1. 子类方法的权限控制符不能变小;
  2. 子类方法返回的类型只能变小;
  3. 子类抛出异常的类型只能变小;
  4. 子类方法名必须和父类保持一致;
  5. 子类方法的参数类型和个数必须和父类保持一致。

10. Comparator与Comparable有什么区别

  • 一个是自己完成比较,一个是外部程序实现比较。
  • 用Comparator是策略模式,就是不改变对象自身,而是一个策略对象来改变它的行为,比如:你想对整数采用绝对值大小来排序,Integer的不符合要求,你不需要去修改Integer类去改变它的排序行为,只需要使用一个实现了Comparator接口的对象来实现控制它的排序就行了