Java继承的基本概念与语法
在Java面向对象编程中,继承是一种核心机制,允许一个类(子类)获取另一个类(父类或基类)的属性和方法,通过继承,可以实现代码的复用和扩展,减少冗余代码,同时为程序设计提供清晰的层次结构,Java中的继承通过extends关键字实现,语法格式为:

class 子类 extends 父类 {
// 子类特有的属性和方法
}
需要注意的是,Java仅支持单继承,即一个类只能直接继承一个父类,但通过接口可以实现多重继承的效果。final修饰的类不能被继承,private修饰的成员方法或属性不会被子类继承。
继承中的成员访问与权限控制
子类继承父类后,可以直接访问父类的非私有成员(包括属性和方法),但无法直接访问父类的私有成员,即使父类的私有成员被子类继承,也需要通过父类的公共方法间接访问。
class Parent {
private int privateValue = 10;
public int publicValue = 20;
public int getPrivateValue() {
return privateValue;
}
}
class Child extends Parent {
public void accessMembers() {
// System.out.println(privateValue); // 编译错误:无法直接访问私有成员
System.out.println(getPrivateValue()); // 通过公共方法访问
System.out.println(publicValue); // 直接访问公共成员
}
}
成员的访问权限修饰符(public、protected、默认、private)决定了子类对父类成员的访问范围:
public:任何地方均可访问;protected:同包内类及子类可访问;- 默认(包私有):同包内类可访问,子类若不在同包则无法访问;
private:仅本类可访问,子类无法直接访问。
方法重写与多态
子类可以重写(Override)父类的非私有非final方法,即提供与父类方法相同的方法签名(方法名、参数列表、返回类型),但实现逻辑可以不同,方法重写是实现多态(Polymorphism)的基础,允许程序在运行时根据对象的实际类型调用相应的方法。
重写方法的规则包括:

- 方法签名必须与父类方法完全一致;
- 返回类型必须与父类方法相同或是其子类(协变返回类型);
- 访问权限不能低于父类方法的访问权限(例如父类方法为
public,子类不能改为protected); - 不能重写
static、final或private方法(若子类定义相同方法,则视为新方法而非重写)。
示例:
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog(); // 多态:父类引用指向子类对象
animal.sound(); // 输出:Dog barks
}
}
super关键字的使用
在子类中,若需调用父类的成员或构造方法,可以使用super关键字,具体场景包括:
- 调用父类被重写的方法:当子类重写父类方法后,若需在子类中调用父类的原始方法,可使用
super.methodName()。 - 访问父类被隐藏的成员:若子类定义了与父类同名的成员(属性或方法),可通过
super访问父类的成员。 - 调用父类构造方法:子类构造方法默认会调用父类的无参构造方法(通过
super()),若需显式调用父类的其他构造方法,需在子类构造方法的第一行使用super(parameters)。
示例:
class Parent {
public Parent(String name) {
System.out.println("Parent constructor: " + name);
}
}
class Child extends Parent {
public Child() {
super("Child"); // 调用父类带参构造方法
System.out.println("Child constructor");
}
}
继承中的构造方法执行顺序
Java在创建子类对象时,会先调用父类的构造方法,再调用子类的构造方法,形成“自上而下”的初始化顺序,这是因为子类对象需要依赖父类的成员属性,必须先完成父类的初始化。
class A {
public A() { System.out.println("A"); }
}
class B extends A {
public B() { System.out.println("B"); }
}
public class Test {
public static void main(String[] args) {
B b = new B(); // 输出:A B
}
}
继承的设计原则与注意事项
虽然继承能够提高代码复用性,但滥用继承可能导致类层次结构复杂、耦合度增高,在使用继承时应遵循以下原则:

- 里氏替换原则(LSP):子类必须能够替换父类并出现在父类出现的任何地方,且程序行为保持不变。
- 优先组合 over 继承:若类之间的关系是“has-a”(拥有)而非“is-a”(是),应优先使用组合而非继承。
- 避免过度继承:尽量保持继承层次扁平,避免多层继承导致的代码维护困难。
若需实现“飞行”功能,通过组合方式(将飞行能力作为独立类并注入)比直接继承“飞行器”类更灵活,避免无关方法的继承。
Java继承通过extends关键字实现,允许子类复用父类的属性和方法,同时支持方法重写和super关键字调用父类成员,合理使用继承可以构建清晰的类层次结构,但需遵循设计原则,避免过度依赖继承导致代码耦合度过高,在实际开发中,应结合组合、接口等机制,灵活运用继承机制,以实现高效、可维护的代码设计。


















