1. Java基础核心面试题解析
1.1 数据类型与三大特性
Java作为一门面向对象的编程语言,其基础数据类型和面向对象特性是面试必考内容。Java的八大基础数据类型包括:
- 数字型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8字节)
- 字符型:char(2字节)
- 布尔型:boolean(JVM规范未明确规定大小,通常1字节)
注意:在实际开发中,对于整型优先使用int,浮点型优先使用double,除非有明确的内存空间限制需求。
Java的三大特性是面向对象编程的核心:
封装:通过private关键字将对象的属性和实现细节隐藏起来,仅对外暴露必要的访问方法(getter/setter)。这样做的好处是:
- 防止外部直接修改对象内部状态
- 可以在方法中添加校验逻辑
- 修改内部实现不影响外部调用
继承:子类extends父类,获得父类的属性和方法。继承实现了代码复用,但要注意:
- Java是单继承,一个类只能有一个直接父类
- 继承应该符合"is-a"关系
- 慎用继承,优先考虑组合
多态:同一行为在不同子类中有不同实现。实现方式有两种:
- 编译时多态:方法重载
- 运行时多态:方法重写+向上转型
1.2 方法重载与重写详解
方法重载(Overload)和方法重写(Override)是多态性的两种表现:
| 特性 | 重载 | 重写 |
|---|---|---|
| 发生位置 | 同一类中 | 父子类之间 |
| 方法名 | 必须相同 | 必须相同 |
| 参数列表 | 必须不同 | 必须相同 |
| 返回类型 | 可以不同 | 相同或是其子类 |
| 访问修饰符 | 可以不同 | 不能比父类更严格 |
| 异常 | 可以不同 | 不能比父类抛出更多异常 |
java复制// 重载示例
class OverloadExample {
void show(int a) { System.out.println(a); }
void show(String s) { System.out.println(s); } // 参数类型不同
}
// 重写示例
class Parent {
protected Number getNumber() throws IOException { return 1; }
}
class Child extends Parent {
@Override
public Integer getNumber() throws FileNotFoundException { // 返回类型是子类
return 2; // 异常是子异常
}
}
1.3 访问修饰符作用域
Java的四种访问修饰符控制着类成员的可见性:
-
public:全局可见
- 类:任何包都能访问
- 成员:任何类都能访问
-
protected:包内及子类可见
- 成员:同包类或不同包子类可访问
-
default(不写):包内可见
- 类/成员:仅同包类可访问
-
private:类内可见
- 成员:仅本类可访问
实际开发建议:成员变量尽量private,通过public方法暴露;工具类方法可以用public static;需要被子类重写的方法用protected。
1.4 ==与equals深度解析
==和equals的区别是Java基础中的经典问题:
-
==:
- 基本类型:比较值是否相等
- 引用类型:比较内存地址是否相同
-
equals:
- Object类默认实现与==相同
- 可被重写,通常用于比较对象内容
- 重写equals必须遵守规范:
- 自反性:x.equals(x)必须true
- 对称性:x.equals(y)与y.equals(x)结果相同
- 传递性:x.equals(y)且y.equals(z)则x.equals(z)
- 一致性:多次调用结果相同
- 非空性:x.equals(null)必须false
java复制// String的equals实现
public boolean equals(Object anObject) {
if (this == anObject) return true;
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
