子类通过 extends 继承父类的字段与方法,实现代码复用与“is-a”关系。
class Animal {
void eat() { System.out.println("eating"); }
}
class Dog extends Animal {
void bark() { System.out.println("wang"); }
}
Object 是所有类的最终父类。@Override 重写父类方法,返回类型、方法名、参数须一致。super(...))或父类被重写的方法(super.eat())。对比:C++ 支持多继承(易引发菱形问题),Java 用“单继承 + 多接口”规避;Python 支持多继承(MRO 解析)。
final 修饰类:不能被继承。final 修饰方法:不能被重写。final 修饰变量:值不可变(基本类型值不变,引用类型引用不变、对象内容可改)。抽象类:abstract 修饰,可有抽象方法(无方法体),子类必须实现;不能被实例化。
abstract class Shape {
abstract double area(); // 抽象方法
void print() { System.out.println("shape"); }
}
接口:一组抽象方法的规范,JDK 8+ 可有默认方法和静态方法。
interface Flyable {
void fly(); // 隐式 public abstract
default void land() { System.out.println("landing"); }
}
class Bird implements Flyable {
public void fly() { System.out.println("flying"); }
}
implements A, B),弥补单继承限制。对比:C++ 的“接口”靠纯虚函数 + 多继承实现;Python 有抽象基类(abc)和鸭子类型(duck typing)——只要对象有
fly()方法就能用,不必声明实现接口。
父类引用指向子类对象,运行时根据实际类型调用对应方法(动态绑定):
Animal a = new Dog();
a.eat(); // 调用 Dog 重写后的 eat
instanceof 判断。toString()、equals()、hashCode() 常被重写。异常是程序运行期错误的对象表示,用 try/catch/finally 处理,避免程序崩溃。
try {
int r = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("除零错误");
} finally {
System.out.println("总会执行");
}
IOException。RuntimeException 及其子类,如 NullPointerException。throws 声明方法可能抛出的异常;可自定义异常类继承 Exception。对比:C 用错误码 +
errno(易被忽略);C++ 有异常但非强制;Python 异常全面但不区分受检/非受检。Java 的受检异常强制调用方处理,健壮但被诟病啰嗦。
import 引入其他包的类。private < 默认(同包)< protected(同包+子类)< public。| 特性 | Java | C++ | Python |
|---|---|---|---|
| 继承 | 单继承 + 多接口 | 多继承 | 多继承 |
| 多态 | 虚方法(默认动态绑定) | 需 virtual 才动态绑定 | 全部动态绑定 |
| 异常 | 强制 checked | 可选 | 全部运行时 |
| 访问控制 | 4 级 | 3 级 + friend | 约定(下划线) |
关键差异:Java 默认方法就是虚方法(动态绑定),C++ 默认静态绑定、需显式
virtual;这决定了 Java 天然面向多态。