1. Java面向对象核心概念精讲
Java作为一门成熟的面向对象编程语言,其三大核心特性(封装、继承、多态)构成了整个体系的基石。让我们先从一个实际案例开始理解这些概念的价值:
java复制public class BankAccount {
private String accountNumber; // 封装:私有属性
private double balance;
// 多态:方法重载
public BankAccount(String accountNumber) {
this(accountNumber, 0.0); // 调用另一个构造方法
}
public BankAccount(String accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
// 封装:通过公共方法访问私有属性
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
}
class SavingsAccount extends BankAccount { // 继承
private double interestRate;
public SavingsAccount(String accountNumber, double interestRate) {
super(accountNumber);
this.interestRate = interestRate;
}
// 多态:方法重写
@Override
public void deposit(double amount) {
super.deposit(amount);
balance += amount * interestRate; // 储蓄账户有额外利息
}
}
关键理解:封装不是简单的getter/setter,而是对数据完整性的保护;继承应遵循"is-a"关系;多态让代码更灵活。实际开发中,滥用继承会导致"脆弱的基类问题",推荐多用组合少用继承。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 包与访问控制深度解析
Java包机制远不止解决命名冲突那么简单,它实质上是项目模块化的基础。现代IDE如IntelliJ IDEA会自动将包结构映射为目录层级,但背后的设计哲学值得深入探讨:
- 默认包(无package声明)是危险的,会导致类加载问题
import static可以导入静态成员,但过度使用会降低可读性- 访问控制符的实际应用场景:
private:内部状态和实现细节- 默认(包私有):模块内部组件间通信
protected:框架扩展点设计public:稳定API接口
JAR打包的最佳实践:
bash复制# 包含MANIFEST.MF的规范打包方式
javac -d target/classes src/main/java/com/example/*.java
jar cvfm app.jar META-INF/MANIFEST.MF -C target/classes .
3. String深度剖析与性能优化
String的底层实现经历了从Java 8的char[]到Java 9的byte[]+编码标记的演变,这种优化体现了对内存效率的极致追求。关键知识点:
- 字符串常量池(String Pool)是堆内存的特殊区域,通过
intern()方法可以手动入池 - JDK对
+操作符的优化:- 编译期常量折叠:
"a" + "b"直接变为"ab" - 非常量场景自动转为StringBuilder(Java 5+)
- 编译期常量折叠:
- 正则表达式预编译:
java复制private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$"); // 比直接String.matches()高效得多
StringBuilder与StringBuffer的选择策略:
- 单线程:始终用StringBuilder(快10%-15%)
- 多线程共享:用StringBuffer或外部同步
- 预估容量:
new StringBuilder(initialCapacity)避免扩容开销
4. Object类方法重写规范
equals和hashCode的重写必须遵循严格契约,否则会导致集合类行为异常。完整实现模板:
java复制@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(age, person.age) &&
Objects.equals(salary, person.salary);
}
@Override
public int hashCode() {
return Objects.hash(name, age, salary); // 保证equals为true时hashCode相同
}
@Override
public String toString() {
return new StringJoiner(", ", Person.class.getSimpleName() + "[", "]")
.add("name='" + name + "'")
.add("age=" + age)
.add("salary=" + salary)
.toString();
}
警示:
hashCode计算应避免可变字段,否则在HashSet/HashMap中会出现元素"丢失"
5. 包装类缓存机制揭秘
Java对部分包装类实现了缓存优化,但不同版本有差异:
| 类型 | 缓存范围 | Java 5+扩展缓存 |
|---|---|---|
| Integer | -128~127(可通过JVM参数调整) | 是 |
| Long | -128~127 | 是 |
| Characte |
