继承的基本语法与实现
在Java中,继承是通过extends关键字实现的,子类通过继承父类获得父类的属性和方法,从而实现代码复用和扩展,基本语法结构如下:

class 父类 {
// 父类属性和方法
}
class 子类 extends 父类 {
// 子类新增属性和方法
}
定义一个Animal父类和Dog子类:
class Animal {
String name;
public void eat() {
System.out.println("动物会进食");
}
}
class Dog extends Animal {
public void bark() {
System.out.println("狗会叫");
}
}
上述代码中,Dog类继承了Animal类,因此可以直接使用name属性和eat()方法,同时新增了bark()方法,继承后,子类对象不仅拥有自身定义的成员,还拥有父类的非私有成员,体现了“is-a”(是一个)的 relationships,如“狗是一种动物”。
继承的核心特性
方法重写(Override)
当子类需要修改或扩展父类的方法时,可以通过方法重写实现,重写要求方法签名(方法名、参数列表)与父类方法完全一致,返回类型必须相同或是父类返回类型的子类,访问权限不能低于父类(如父类为public,子类不能为protected或default)。
class Animal {
public void move() {
System.out.println("动物会移动");
}
}
class Dog extends Animal {
@Override // 注解,用于检查是否正确重写
public void move() {
System.out.println("狗会跑");
}
}
调用时,子类对象会优先执行重写后的方法:

Dog dog = new Dog(); dog.move(); // 输出:狗会跑
super关键字
super用于引用父类的成员(属性、方法、构造器),在子类中,若需调用父类的被重写方法或访问父类属性,可通过super实现:
class Animal {
String name = "动物";
public Animal() {
System.out.println("父类Animal构造器");
}
}
class Dog extends Animal {
String name = "狗";
public Dog() {
super(); // 调用父类构造器(必须放在子类构造器第一行)
System.out.println("子类Dog构造器");
}
public void printName() {
System.out.println("子类name:" + name); // 访问子类属性
System.out.println("父类name:" + super.name); // 访问父类属性
}
}
继承的访问权限
- public:所有类均可访问。
- protected:同一包内及子类可访问(子类可通过
super访问父类protected成员)。 - default(包私有):同一包内可访问,子类若不在同一包则无法访问。
- private:仅父类自身可访问,子类无法直接继承(需通过父类
public/protected方法间接访问)。
继承的初始化顺序
Java继承中,对象初始化遵循“先父类后子类”的原则,具体步骤如下:
- 分配子类对象内存空间,包含父类成员变量。
- 初始化父类成员变量(按定义顺序)。
- 执行父类构造器(
super())。 - 初始化子类成员变量(按定义顺序)。
- 执行子类构造器。
示例代码验证:class Parent { static { System.out.println("父类静态代码块"); } { System.out.println("父类非静态代码块"); } public Parent() { System.out.println("父类构造器"); } }
class Child extends Parent {
static { System.out.println(“子类静态代码块”); }
{ System.out.println(“子类非静态代码块”); }
public Child() { System.out.println(“子类构造器”); }
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
}
}

输出结果为:
父类静态代码块
子类静态代码块
父类非静态代码块
父类构造器
子类非静态代码块
子类构造器
### 四、继承的限制与注意事项
1. **单继承限制**:Java只支持单继承(一个类只能有一个直接父类),但可通过多层继承实现代码扩展(如`A extends B, B extends C`会报错,但`A extends B, B extends C`合法)。
2. **构造器不继承**:子类不会继承父类的构造器,但可通过`super()`调用父类构造器,若未显式调用,默认调用父类无参构造器;若父类无无参构造器,则子类必须手动调用`super()`并传递参数。
3. **final类与方法**:被`final`修饰的类不能被继承(如`String`类),被`final`修饰的方法不能被重写。
4. **避免滥用继承**:继承应满足“里氏替换原则”(LSP),即子类对象应能替换父类对象而不影响程序正确性,若仅为复用代码,优先考虑组合(`has-a`关系)而非继承。
### 五、继承的应用场景
继承主要用于以下场景:
- **代码复用**:将多个类的共同属性和方法提取到父类,子类继承后无需重复定义。
- **扩展功能**:在父类基础上新增方法或重写已有方法,实现差异化行为。
- **多态基础**:通过继承实现方法重写,结合父类引用指向子类对象,实现运行时动态绑定。
定义`Shape`父类及其子类`Circle`、`Rectangle`,统一计算面积的方法:
```java
class Shape {
public double area() { return 0; }
}
class Circle extends Shape {
private double radius;
public Circle(double r) { radius = r; }
@Override
public double area() { return Math.PI * radius * radius; }
}
class Rectangle extends Shape {
private double width, height;
public Rectangle(double w, double h) { width = w; height = h; }
@Override
public double area() { return width * height; }
}
通过继承,所有子类均可统一调用area()方法,体现了面向对象的“开闭原则”(对扩展开放,对修改关闭)。
Java中的继承是面向对象编程的核心特性之一,通过extends关键字实现,支持方法重写、super引用等功能,能够有效提升代码复用性和可扩展性,但需注意单继承限制、构造器调用规则及滥用继承带来的问题,合理结合多态、封装等特性,才能设计出结构清晰、易于维护的程序,在实际开发中,应根据业务场景选择是否使用继承,必要时优先考虑组合,以保持代码的灵活性和健壮性。
















