super默认只访问直接父类成员,不能跳过父类访问更高层祖先;需通过中间父类提供入口间接访问;构造器中super()仅调用直接父类构造器;this查找沿继承链向上,super仅限直接父类。

在多层继承中,super 默认只访问**直接父类**的成员,不能跳过父类直接访问爷爷类或更高层祖先的成员;但可通过“逐级向上委托”的方式间接实现追溯。
super 的查找范围:只认直接父类
Java 中 super.属性 或 super.方法() 总是从当前类的**直接父类**开始查找。如果该父类中没有对应成员,编译器不会自动继续往上找(比如到爷爷类),而是直接报错。
- 例如:
A → B → C(C 继承 B,B 继承 A) - 在 C 类中写
super.xxx,只会在 B 类中找,不会去 A 类中找 - 即使 B 类没定义
xxx,而 A 类有且是protected或包内可见,super.xxx在 C 中仍不合法——因为 B 没继承/暴露它给 C 直接使用
想访问爷爷类成员?得靠父类“中转”
若需访问更上层的祖先类成员,必须由**中间父类提供可访问的入口**,比如用 public/protected 方法或属性暴露出来。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- A 类有
protected String id = "A123"; - B 类未重写
id,也未声明同名字段 → 此时id对 C 类是不可见的(B 没把它“传递”下来) - 正确做法:在 B 类中加一个方法
protected String getAncestorId() { return this.id; },C 类就能调用super.getAncestorId() - 或者 B 类把
id声明为public/protected并保持继承链畅通(不 private、不屏蔽)
构造器中 super() 只能调用直接父类构造器
子类构造器里的 super(...) 必须调用其**直接父类的构造器**,不能写成 super.super(...)(语法错误)。
立即学习“Java免费学习笔记(深入)”;
- C 的构造器只能写
super(...)调用 B 的构造器 - 若 B 的构造器内部已通过
super(...)调用了 A 的构造器,则 A 的初始化会自动完成 - 这是链式初始化,不是跳跃式调用
避免混淆:this 和 super 的查找路径不同
this.xxx 会从本类出发,依次向上查找(本类 → 父类 → 爷爷类…),直到找到第一个匹配的 public/protected/包内成员;而 super.xxx 始终只停在直接父类这一层。
- 假设 C 类没定义
getName(),但 A 类有public getName() -
this.getName()在 C 中合法(通过继承链找到 A 的方法) -
super.getName()在 C 中也合法 —— 因为 B 继承了 A 的getName(),所以 B 有这个方法,super 就能调到 - 但如果 B 把
getName()重写为private,那 C 就既不能用super.getName(),也不能通过继承获得该方法

















