Java类只能单继承,即一个类仅能直接继承一个父类,这是为避免多继承歧义;构造器首行必须调用super()确保父类初始化;子类仅可访问父类public/protected及同包默认成员,private需通过getter/setter间接访问。

Java只允许一个extends,这是硬性规则
Java类继承机制的核心约束就是:一个类**只能直接继承一个父类**,语法上只允许写一次extends。这不是设计疏漏,而是刻意为之——避免C++式多继承带来的歧义(比如两个父类都有toString(),子类调用时该选谁?)。编译器遇到class C extends A, B会直接报错:error: '{' expected,根本不会进入后续解析。
- 允许:
class Dog extends Animal - 禁止:
class Duck extends Bird, Fish(即使语义上“鸭子既会飞又会游”) - 替代方案不是绕过限制,而是换思路:用
implements接口或private成员组合
为什么super()总在构造器第一行?
子类对象初始化时,JVM必须先确保父类部分已就绪——就像造一辆车,得先装好底盘(父类),才能加装音响(子类特有逻辑)。所以每个子类构造器开头,**隐式或显式调用父类构造器是强制流程**。如果父类只有带参构造(比如Animal(String name)),而子类没写super(...),编译会失败:error: constructor Animal in class Animal cannot be applied to given types。
- 父类有无参构造 → 子类构造器自动插入
super()(可省略) - 父类只有有参构造 → 子类必须首行写
super("xxx"),且参数类型/个数要匹配 -
super()和this()不能共存,因为二者都必须是第一行
子类能访问父类的哪些成员?
继承不是“全盘接收”。子类只能直接使用父类的public、protected和同包默认访问权限的成员;private成员完全不可见——哪怕子类代码里写了super.privateField,编译器也会报error: privateField has private access in Parent。
- 想用父类私有字段?必须通过父类提供的
public或protectedgetter/setter方法间接访问 - 同名变量不叫“重写”,叫“隐藏”:子类写
String name = "dog",父类也有name,访问时取决于引用类型(Animal a = new Dog()中a.name取父类值) - 方法才存在“重写”(
@Override),但要求签名一致、返回类型协变、异常范围不扩大
接口多实现才是Java的“多继承”正解
当需要多个行为契约时,别硬扛着改继承结构——用implements接口。接口之间支持多继承(interface A extends B, C),类也支持实现多个接口(class Duck implements Flyable, Swimmable)。这既规避了状态冲突(接口无字段),又保留了能力组合的灵活性。
立即学习“Java免费学习笔记(深入)”;
- 接口方法默认
public abstract,实现类必须提供具体逻辑 - 从Java 8起,接口可含
default方法,子类可选择重写或直接继承 - 若两个接口有同名
default方法,实现类必须显式重写,否则编译报错
真正容易被忽略的是构造链和访问控制的耦合性:父类构造器里调用被子类重写的方法,可能导致NullPointerException(子类字段尚未初始化)。这种隐患不会在编译时报错,只会在运行时暴露——它藏在继承的底层执行顺序里,而不是语法表面。










