子类只能继承父类中public、protected及同包下的默认成员,不能继承private成员、构造方法、静态成员和final方法;能否继承以编译时this.xxx或super.xxx是否通过为准。

子类能继承的,是父类中“可访问”且“非特殊”的成员——不是所有东西都能拿过来用,关键看访问修饰符、所在包、以及成员类型。
能被子类继承的成员
以下三类内容,子类可以直接使用(前提是访问权限允许):
- public 修饰的成员变量和方法:无论子类是否与父类同包,都可继承并访问
- protected 修饰的成员变量和方法:即使子类在不同包中,也能继承;这是专为继承设计的访问级别
- 默认(包级私有)修饰的成员:仅当子类与父类在同一个包内时,才可继承
子类不能继承的内容
这些看似存在,但子类无法直接调用或覆盖:
- private 成员:子类完全不可见,谈不上继承;即便同包也不行
-
构造方法:子类不继承构造器,但可通过
super()显式或隐式调用父类构造方法 - 静态成员(static 变量/方法):子类可以访问(通过类名或继承链),但不是“继承而来”,而是共享父类的静态空间;它们不属于子类自己的成员
- final 方法(若被重写限制):可继承,但不能被覆盖;这不是继承范围问题,而是重写规则限制
容易误解的两个点
有些说法需要澄清,避免踩坑:
立即学习“Java免费学习笔记(深入)”;
- “子类继承了 private 成员”是错觉:编译器不会报错,但子类代码里根本看不到它;反射等手段属于后期干预,不属于正常继承范畴
-
同名成员引发的“隐藏”和“覆盖”要分清:子类定义同名字段 → 隐藏父类字段(用
super.字段可访问);定义同名实例方法 → 覆盖父类方法(多态生效);定义同名静态方法 → 隐藏(非覆盖,无多态)
继承的实际边界在哪里
一句话判断:子类的源码里能否直接写 this.xxx 或 super.xxx 并通过编译?能 → 属于可继承范围;不能 → 不在继承范围内。这个边界由编译器严格检查,不依赖运行时行为。










