Final:不可变的承诺
在Java中,final关键字如同一个坚定的承诺,代表着“不可变”的核心原则。它主要约束三种场景:
1.变量:被final修饰的变量一旦赋值便无法更改,成为常量。例如 final double PI = 3.14; ,后续任何修改尝试都会触发编译错误。
2.方法:final方法禁止被子类重写,确保方法逻辑在继承体系中保持不变。
3.类:final类无法被继承,彻底封闭扩展可能(如Java内置的String类)。
理解final的关键在于认识到它通过限制灵活性来增强代码的可靠性与安全性。
抽象:现实世界的代码映射
抽象是Java连接现实世界与代码世界的桥梁。其核心在于“只声明不实现”——抽象方法仅定义行为契约(如 public abstract void eat(); ),具体实现交由子类完成。
抽象类具有三大特点:
1.无法实例化:不能直接创建抽象类对象
2.子类强制实现:继承抽象类的子类必须重写所有抽象方法,否则子类也需声明为抽象类。
3.可包含具体方法:抽象类可同时拥有已实现的方法(如Animal类的 smell() 方法)。
示例:
public abstract class Animal {
public abstract void eat(); // 抽象方法
public void smell() { // 具体方法
System.out.println("我在smell");
}
}
public class Cat extends Animal {
@Override
public void eat() { // 必须重写抽象方法
System.out.println("猫吃鱼");
}
}
接口:多重身份的契约
接口是比抽象类更纯粹的“契约”,它定义了一组行为规范而不涉及具体实现。其核心特征包括:
1.全抽象方法:接口中所有方法默认为 public abstract (可省略修饰符)。
2.全局静态常量:接口变量自动被 public static final 修饰,赋值后不可变。
3.多实现机制:类可通过 implements 实现多个接口(如 Panda implements Valuable, Protectable ),突破单继承限制。
示例:
public interface Valuable {
int money = 100; // 等价于public static final int money = 100;
void getMoney(); // 等价于public abstract void getMoney();
}
public class Gold implements Valuable {
@Override
public void getMoney() {
System.out.println("黄金可以换钱");
}
}
实战:数据库操作的抽象与接口
通过一个数据库操作案例,可深刻理解抽象类与接口的协作:
定义接口: IDAO 接口声明数据库操作契约( connect() 、 add() 等)。
抽象类实现接口: AbstractDao 抽象类实现 IDAO 接口,提供部分通用逻辑。
具体类继承抽象类: MySqlDao 和 OracleDao 分别继承 AbstractDao ,实现特定数据库逻辑。
示例代码:
public interface IDAO {
void connect();
void add();
}
public abstract class AbstractDao implements IDAO {
@Override
public void add() { // 通用实现
System.out.println("执行添加操作");
}
}
public class MySqlDao extends AbstractDao {
@Override
public void connect() { // 特定实现
System.out.println("连接MySQL数据库");
}
}
在 main 方法中,通过用户输入动态选择数据库类型,体现了多态性与接口编程的灵活性。
