小林coding面试题笔记(四)

Java 中 final 关键字的作用

final 是 Java 中的重要关键字,常见于面试中考察其对类、方法和变量的修饰作用。

1. 修饰类

final 修饰的类不能被继承,确保类的行为不可更改。例如,String 类是 final 的,保证了其不可变性。

1
2
3
public final class MyFinalClass {
// 类的内容
}

面试重点

  • 为什么 String 类是 final 的?
  • 使用 final 修饰类的实际场景。

2. 修饰方法

final 修饰的方法不能被子类重写,确保核心逻辑不被篡改。

1
2
3
4
5
class ParentClass {
public final void display() {
System.out.println("This is a final method.");
}
}

面试重点

  • final 方法如何影响多态?
  • JVM 对 final 方法的优化。

3. 修饰变量

final 修饰的变量在赋值后不可更改。

基本数据类型

1
2
final int num = 10;
// num = 20; // 编译错误

引用数据类型

1
2
final StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 合法

面试重点

  • final 修饰引用类型的行为。
  • finalstatic 的区别。

深拷贝和浅拷贝

面试中的常见问题

  1. 浅拷贝和深拷贝的区别?

    • 浅拷贝:复制对象本身,引用类型字段共享。
    • 深拷贝:递归复制对象及其引用字段,完全独立。
  2. 如何实现深拷贝?

    • 实现 Cloneable 接口。
    • 使用序列化。
    • 手动递归复制。

示例代码

浅拷贝

1
2
3
4
5
6
7
8
9
class ShallowCopyExample implements Cloneable {
int value;
int[] array;

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 浅拷贝
}
}

深拷贝

1
2
3
4
5
6
7
8
9
10
11
class DeepCopyExample implements Cloneable {
int value;
int[] array;

@Override
protected Object clone() throws CloneNotSupportedException {
DeepCopyExample copy = (DeepCopyExample) super.clone();
copy.array = array.clone(); // 深拷贝
return copy;
}
}

面试重点

  • 深拷贝的实现方式及其优缺点。
  • 序列化方式的性能和适用场景。

泛型

面试中的常见问题

  1. 泛型的作用是什么?

    • 提高代码复用性。
    • 提供编译时类型检查,避免运行时错误。
  2. 泛型的限制?

    • 不能使用基本数据类型。
    • 运行时类型擦除。

示例代码

1
2
3
private static <T extends Number> double add(T a, T b) {
return a.doubleValue() + b.doubleValue();
}

面试重点

  • 泛型的类型擦除机制。
  • List<?>List<Object> 的区别。

Java 创建对象的方式

面试中的常见问题

  1. 有哪些方式可以创建对象?

    • 使用 new 关键字。
    • 使用反射(Class.newInstance())。
    • 使用 clone() 方法。
    • 通过反序列化。
  2. 各方式的优缺点?

    • 反射的性能开销。
    • clone() 的局限性。

反射

面试中的常见问题

  1. 反射的作用是什么?

    • 动态加载类。
    • 操作类的私有字段和方法。
  2. 反射的性能问题?

    • 反射操作较慢,如何优化?

示例代码

1
2
Class<?> clazz = Class.forName("com.example.MyClass");
Object obj = clazz.getDeclaredConstructor().newInstance();

面试重点

  • 反射的实际应用场景。
  • 如何避免反射带来的性能问题?

注解

面试中的常见问题

  1. 注解的原理是什么?

    • 注解是继承自 Annotation 接口的特殊接口。
    • 运行时通过反射解析。
  2. 如何自定义注解?

    • 使用 @interface 定义。
    • 指定元注解(如 @Retention@Target)。

示例代码

1
2
3
4
5
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value();
}

面试重点

  • 注解的作用域和生命周期。
  • 注解在框架中的应用(如 Spring 和 JUnit)。