子类通过extends继承父类非private成员(public、protected、包级),不可继承private成员和构造方法;需用super访问父类字段、方法及构造器;同名字段会隐藏而非重写,private字段须通过getter访问。

子类通过 extends 关键字继承父类,自动获得父类所有非 private 的属性和方法——包括 public、protected,以及默认(包级)访问权限的成员。
哪些属性和方法能被继承?
不是所有成员都能被子类直接使用:
- 可以继承的:public、protected、包内可见(无修饰符)的字段和方法
- 不能继承的:private 成员(子类看不到,但父类内部仍参与对象构建)
- 不被继承但需处理的:构造方法——子类必须显式或隐式调用 super() 来初始化父类部分
继承后如何正确访问父类成员?
当子类与父类存在同名成员时,容易混淆。关键靠 super 明确指向父类部分:
- 访问父类字段:
super.name(尤其当子类也定义了 name 时) - 调用父类方法:
super.toString()(常用于重写中保留原有逻辑) - 调用父类构造器:
super("参数"),且必须是子类构造方法的第一条语句
继承中的常见陷阱
看似简单,实际容易出错:
立即学习“Java免费学习笔记(深入)”;
- 子类定义了与父类同名的字段,会隐藏(not override)父类字段,造成值不一致——这不是重写,而是两个独立变量
- 父类字段声明为 private,子类无法直接访问,但可通过父类提供的 public/protected getter 方法间接使用
- 若父类只有带参构造方法,子类必须显式写
super(...),否则编译失败
一个典型例子
假设父类 Animal 有 protected String name 和 public void eat();子类 Dog 继承它:
- Dog 对象在内存中包含两块:Animal 部分(含 name) + Dog 自有部分
- Dog 可直接调用
eat(),也可用super.eat()显式调用 - 如果 Dog 也定义了
String name,那么this.name和super.name是两个不同变量


















