super调用父类构造方法必须位于子类构造方法第一行,否则编译报错;未显式调用时编译器自动插入无参super()(父类需有无参构造),否则须显式调用带参super();super()与this()不可共存。

super 调用父类构造方法必须是第一行
子类构造方法中,如果要显式调用 super(),它必须出现在方法体的第一条语句位置。否则编译直接报错:Error: call to super must be first statement in constructor。
这是因为 JVM 要求在子类对象初始化前,父类部分必须先完成初始化——这一步由 super() 触发。编译器会强制校验顺序,不给绕过的机会。
- 没写
super()也不写this()?编译器自动插入无参super()(前提是父类有无参构造) - 父类只有带参构造?子类构造里必须显式写
super(…),否则编译失败 -
super()和this()不能共存于同一个构造方法中
class Animal {
Animal(String name) { System.out.println("Animal: " + name); }
}
class Dog extends Animal {
Dog() {
super("default"); // ✅ 正确:第一行
System.out.println("Dog created");
}
// Dog() { System.out.println("x"); super("x"); } ❌ 编译错误
}
super 访问被重写的父类方法
当子类重写了父类方法,又需要在子类中调用父类的原始实现时,必须用 super.methodName()。仅靠 methodName() 会触发子类自己的版本,形成无限递归或逻辑错乱。
典型场景包括:模板方法模式中的钩子、日志/校验后委托父类执行核心逻辑、或者复用父类部分行为后再扩展。
立即学习“Java免费学习笔记(深入)”;
- 静态方法不能用
super调用(super.staticMethod()是非法语法) - private 方法无法被继承,自然也不能用
super访问 - 访问的是编译时确定的父类声明类型的方法,与运行时对象无关
class Shape {
void draw() { System.out.println("Drawing shape"); }
}
class Circle extends Shape {
void draw() {
System.out.println("Preparing circle...");
super.draw(); // ✅ 调用 Shape.draw()
}
}
super 访问父类中被隐藏的字段
如果子类定义了和父类同名的字段(不是重写,是隐藏),那么在子类中直接写字段名会访问子类版本。此时要用 super.fieldName 显式访问父类字段。
传媒企业网站系统使用热腾CMS(RTCMS),根据网站板块定制的栏目,如果修改栏目,需要修改模板相应的标签。站点内容均可在后台网站基本设置中添加。全站可生成HTML,安装默认动态浏览。并可以独立设置SEO标题、关键字、描述信息。源码包中带有少量测试数据,安装时可选择演示安装或全新安装。如果全新安装,后台内容充实后,首页才能完全显示出来。(全新安装后可以删除演示数据用到的图片,目录在https://
注意:这不是多态,字段访问完全看引用的**编译时类型**;super 只是提供一种语法途径来绕过子类字段遮蔽(shadowing)。
- 字段隐藏 ≠ 方法重写:方法看运行时类型,字段看编译时类型
- 使用
super.field前,请确认该字段在父类中可访问(非 private) - IDE 常把这种字段命名视为坏味道,建议优先用不同名或封装
class Parent {
protected String name = "Parent";
}
class Child extends Parent {
String name = "Child";
void printNames() {
System.out.println(name); // 输出 "Child"
System.out.println(super.name); // 输出 "Parent"
}
}
super 在内部类和匿名类里的限制
在成员内部类或匿名类中,super 的行为容易混淆:它指向的是**该内部类的直接父类**,而不是外部类的父类。想访问外部类父类的方法或字段,不能靠 super,得用 OuterClass.this.super.method() 这种嵌套引用(但 Java 不支持这种写法)——实际只能通过外部类暴露的 public/protected 方法间接访问。
也就是说,super 的作用域严格限于当前类的继承链,不穿透到外围类。
- 匿名类没有类名,所以
super()只能调用其直接父类(即 new 后面那个类)的构造器 - 内部类继承体系独立于外部类,
super不会“跨层”找外部类的父类 - 如果真需要访问外部类父类的行为,应在外部类中提供包装方法
这个边界很细,但一旦在复杂嵌套中误以为 super 能触达外层父类,就会卡在找不到符号或调用错方法上。









