super关键字代表子类实例中继承自直接父类的部分,仅用于实例上下文,可调用父类构造器(首行)、重写方法(任意位置)和访问非private同名字段;不可在static环境、private成员或跨级调用中使用。

super 关键字不是指向父类对象,而是代表当前子类实例中“从父类继承来的那部分”。它必须在继承关系下使用,且作用范围严格受限——只适用于实例上下文、只能访问直接父类的非 private 成员。
调用父类构造器:必须放在第一行
子类构造器默认隐式执行 super()(无参),前提是父类有无参构造器。若父类只有带参构造器,就必须显式写 super(参数),且必须是构造器里的第一条语句。
- 写在第二行或条件分支里(比如 if 之后)会编译报错:“call to super must be first statement”
- super() 和 this() 互斥,不能共存于同一个构造器中
- 即使写了 super("abc", 100),也并非创建新父类对象,只是初始化当前对象中父类结构的那一块内存
访问被重写的父类方法:跳过子类实现
当子类重写了父类方法(如 toString()、run()),又需要复用原始逻辑时,用 super.methodName() 显式调用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可在方法任意位置调用,不受首行限制
- 只调直接父类版本,不会跨级到祖父类;如果父类本身已重写过,super 调的就是那个重写后的版本
- 常见写法:return "Sub: " + super.toString();
访问被隐藏的父类字段:解决同名遮蔽
子类声明了与父类同名的实例字段(如父类 protected String name,子类也写 String name),就会发生字段遮蔽(hiding),此时 name 默认指子类字段。
- 要用 super.name 明确读取或修改父类那份值
- 仅对 public 或 protected 字段有效;private 字段无法通过 super 访问
- 不推荐字段遮蔽,更建议用 getter/setter 封装,避免歧义
不能用 super 的几种典型情况
理解限制比记住用法更重要,这些场景下 super 会直接编译失败或行为异常:
- 在 static 方法、静态代码块、静态变量初始化 中使用 —— super 依赖实例,而 static 属于类级别
- 试图访问父类的 private 成员 —— 编译报错,子类根本不可见
- 想绕过父类直接调祖父类方法 —— Java 不支持,super 只认直接父类
- 在构造器中重复写多个 super() —— 语法禁止,且逻辑上无意义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










