Java类只支持单继承,通过extends关键字只能继承一个父类,多继承需用接口实现;构造器链需显式维护;protected成员跨包仅限继承访问;重写Object方法需注意连锁影响。

Java中extends关键字只支持单继承,不支持多继承
Java类不能同时继承多个父类,这是语言层面的硬性限制。比如写class C extends A, B会直接编译失败,报错error: class C inherits from multiple classes(实际错误信息是error: '{' expected或error: invalid type,因为语法不合法)。
设计上强制单继承是为了避免菱形继承问题(如C++中的二义性),也简化了方法解析和内存布局。如果需要复用多个类的行为,应改用接口(interface)+ 实现(implements)组合。
- 一个类可以
extends一个类,同时implements多个接口 - 接口之间可以用
extends多继承(如interface I3 extends I1, I2) - 抽象类也可以被继承,且可含抽象/具体方法
多级继承中super调用链必须显式维护
从A → B → C三级继承时,子类构造器默认不会自动触发祖父类构造器。若父类B没有无参构造器,而C的构造器里没写super(...),就会编译报错constructor B in class B cannot be applied to given types。
关键点在于:每级子类构造器的第一条语句,必须明确调用其直接父类的某个构造器(隐式super()也算),否则无法完成初始化链。
立即学习“Java免费学习笔记(深入)”;
全诚易惠通优惠折扣信息店铺管理系统是全诚团队继 “全诚商城”“外卖通” 之后又一新概念重量级作品,该系统以收集本地所有店铺优惠折扣信息为核心,在构思、设计、代码处理上都做了严密的部署和检查,继承了全诚系列产品核心模块的基础上进化而来,即为新作品,也系高度成熟度的作品,加之全诚团队精心技术支持,可为用户营造一个长期可靠的系统运行环境。本系统较易惠通相比,业务和经营范围覆盖面积更广更大,可涵盖本地所有
-
B的构造器里若写了super(x),那是调用A的构造器;C里写的super(y),只调用B的构造器,不跳过 - 字段遮蔽(field hiding)会发生:子类定义同名
public int x,会隐藏父类的x,访问需用super.x - 方法重写(override)遵循动态绑定,但静态方法、私有方法不参与多态
多级继承下protected成员的可见性容易误判
protected不是“包内+子类可见”那么简单。它允许:同一包内任意类访问;不同包中,仅该类的子类(无论几级)可通过继承关系访问,但不能通过其他对象引用访问。
例如A在pkg1中声明protected void f(),C extends B extends A在pkg2中——C内部可直接调用f(),但C中写new A().f()会编译失败,提示f() has protected access in A。
-
protected字段/方法在子类中如同自己声明的一样可用(无需super.前缀) - 但如果父类在不同包,且子类想访问**另一个同级子类对象**的
protected成员,仍不可见 - 过度依赖
protected会增加耦合,现代设计更倾向封装+getter/setter
Object是所有类的隐式顶层父类,但toString()等方法不自动“穿透”多级
即使没写extends Object,每个类都默认继承Object。但像toString()这种非final方法,只要中间某一级(比如B)重写了它,那么C调用toString()时执行的就是B的版本,除非C自己再重写或显式调用super.toString()。
容易忽略的是:getClass()、hashCode()、wait()这些final或本地实现的方法,子类无法覆盖,但行为仍由运行时类型决定。
- 重写
equals()时必须同步重写hashCode(),否则哈希容器行为异常 -
instanceof判断的是实际运行时类型,与继承层级深度无关 - 反射获取
getDeclaredMethods()只返回本类声明的方法,要向上遍历需手动调用getSuperclass()
class A { void m() { System.out.println("A"); } }
class B extends A { @Override void m() { System.out.println("B"); } }
class C extends B { void n() { super.m(); } } // 这里super.m()调的是B.m(),不是A.m()
多级继承本身不难理解,真正容易出问题的,是构造器链断裂、protected访问边界模糊、以及对Object方法重写的连锁影响——这些地方一疏忽,编译期可能不报错,但运行时逻辑就偏了。









