Java 关键字面试解释指南
一、final 关键字
核心含义
"不可变"的修饰符
3 种用法和解释
- final 变量 = 常量(值不能改)
final int MAX_VALUE = 100; // 基本类型,值不能变
MAX_VALUE = 200; // ❌ 编译错误
final List list = new ArrayList<>(); // 引用类型
list.add("hello"); // ✅ 可以,list指向的对象内容可变
list = new ArrayList<>(); // ❌ 错误,引用不能指向新对象
面试解释:
"final 修饰变量时,如果是基本类型,值不能改;如果是引用类型,引用不能指向新对象,但对象内容可以改。"
- final 方法 = 不能被子类重写
class Parent {
public final void show() { // 子类不能重写这个方法
System.out.println("父类方法");
}
}
class Child extends Parent {
// public void show() { } // ❌ 编译错误
}
面试解释:
"final 修饰方法,表示这个方法被子类继承,但不能被子类重写。比如工具类的方法,设计时就不希望被修改。"
- final 类 = 不能被继承
final class StringUtils { // 这个类不能被继承
// ...
}
// class MyUtils extends StringUtils { } // ❌ 编译错误
面试解释:
"final 修饰类,表示这个类设计是完整的,不希望被继承。比如 String 类就是 final 的,防止被修改行为。"
二、static 关键字
核心含义
"属于类,不属于对象"
4 种用法和解释
- static 变量 = 类变量(所有对象共享)
class Counter {
static int count = 0; // 类变量
public Counter() {
count++; // 每创建一个对象,count增加
}
}
// 使用
Counter c1 = new Counter(); // count=1
Counter c2 = new Counter(); // count=2
System.out.println(Counter.count); // 2,通过类名访问
面试解释:
"static 变量属于类,所有对象共享一份。比如记录创建了多少个对象,用 static 变量。"
- static 方法 = 类方法(不用创建对象就能调)
class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
// 使用
int result = MathUtils.add(1, 2); // 不用 new MathUtils()
面试解释:
"static 方法属于类,不用创建对象就能调用。工具类方法通常用 static,比如 Math.abs()。但 static 方法不能访问非 static 成员。"
- static 代码块 = 类加载时执行一次
class Config {
static {
System.out.println("类加载时执行");
// 初始化配置
}
}
面试解释:
"static 代码块在类加载时执行一次,用于初始化 static 变量,比如加载配置文件。"
- static 内部类 = 不依赖外部类实例
class Outer {
static class Inner { // 静态内部类
// 可以直接 new,不用 Outer 实例
}
}
// 使用
Outer.Inner inner = new Outer.Inner();
面试解释:
"static 内部类不依赖外部类实例,可以直接创建。普通内部类会隐式持有外部类引用。"
三、this 关键字
核心含义
"当前对象的引用"
3 种用法和解释
- 区分同名变量
class Person {
private String name;
public Person(String name) {
this.name = name; // this.name 是成员变量,name 是参数
}
public void setName(String name) {
this.name = name; // 明确指成员变量
}
}
面试解释:
"当成员变量和局部变量同名时,用 this 区分。this.name 指当前对象的成员变量。"
- 调用本类其他构造方法
class Person {
private String name;
private int age;
public Person() {
this("匿名", 0); // 调用另一个构造方法
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
面试解释:
"在构造方法中,用 this() 调用本类的其他构造方法,必须放在第一行。"
- 返回当前对象(链式调用)
class Person {
private String name;
public Person setName(String name) {
this.name = name;
return this; // 返回当前对象
}
}
// 使用
Person p = new Person().setName("张三").setAge(20);
面试解释:
"返回 this 可以实现链式调用,让代码更简洁。"
四、super 关键字
核心含义
"父类对象的引用"
3 种用法和解释
- 访问父类成员
class Parent {
String name = "父类";
public void show() {
System.out.println("父类方法");
}
}
class Child extends Parent {
String name = "子类";
public void print() {
System.out.println(super.name); // 访问父类变量
super.show(); // 调用父类方法
}
}
面试解释:
"当子类和父类有同名成员时,用 super 访问父类的成员。"
- 调用父类构造方法
class Parent {
public Parent(String name) {
// ...
}
}
class Child extends Parent {
public Child(String name) {
super(name); // 必须第一行,调用父类构造
}
}
面试解释:
"子类构造方法中,用 super() 调用父类构造方法,必须在第一行。如果不写,编译器会自动加上 super()。"
- 重写时调用父类实现
class Parent {
public void save() {
// 公共的保存逻辑
}
}
class Child extends Parent {
@Override
public void save() {
// 1. 先做父类的逻辑
super.save();
// 2. 再做子类特有逻辑
doExtra();
}
}
面试解释:
"子类重写父类方法时,可以在子类方法中先调用 super.方法() 执行父类逻辑,再添加子类特有逻辑,实现功能增强而不是完全覆盖。"
五、对比总结
关键字 核心含义 典型用途
final 不可变 常量、防止重写、防止继承
static 属于类 工具方法、共享变量、初始化块
this 当前对象 区分同名、构造方法重载、链式调用
super 父类对象 访问父类成员、调用父类构造、方法增强
六、面试回答技巧
不要背定义
- ❌ 错误:"final 是 Java 关键字,表示不可变..."
- ✅ 正确:"我们项目里用 final 定义配置常量,比如数据库连接超时时间,防止被误改。"
结合实际项目
- final:定义系统常量、工具类
- static:工具类方法、全局计数器
- this:Builder 模式、避免命名冲突
- super:框架基类、模板方法模式
解释设计意图
- final:安全(防止被修改)
- static:共享(节省内存,方便调用)
- this:明确(消除歧义)
- super:复用(利用父类功能)
常见问题准备
- static 能重写吗?
"不能。static 方法属于类,父子类各自独立。这叫隐藏,不是重写。" - final 和 finally 区别?
"final 是修饰符,finally 是异常处理代码块,完全没关系。" - this 和 super 能同时用吗?
"不能。this() 和 super() 调用构造方法时,都必须第一行,所以不能同时出现。" - 什么时候必须用 super?
"当父类没有无参构造,子类构造方法必须显式调用 super(...)。"
一句话总结:这4个关键字都是为了更清晰、更安全、更灵活地编写代码,理解它们能写出更好的面向对象程序。