▲super限定
与前面this引用非常相似,super用于限定访问父类定义的实例变量或实例方法。 super.父类定义的实例变量 super.父类定义的实例方法(参数);
▲子类构造器调用父类构造器 子类构造器【一定调用】父类构造器【一次】——有且仅有一次
A,如果子类构造器没有显示调用父类构造器,系统会自动在子类构造器的第一行调用父类无参数的构造器。 B,子类构造器的第一行显示使用super调用来调用父类构造器。 super调用一定是调用父类的构造器,只能出现在构造器的第一行。 this调用是调用当前类的构造器,只能出现在构造器的第一行。 【super调用和this调用不可能同时出现!】 super限定: super紧跟一个. super.name super.walk();
super调用: super紧跟圆括号。 super(参数)
【推论】:如果父类没有无参数的构造器,子类的构造器必须显示调用(super调用)父类指定的构造器!
练习代码:↓
class Base2 { int age = 20;//实例变量 //定义一个方法↓ public void foo(String name) { System.out.println("执行父类foo方法,传入参数为:" + name); } } class Sub extends Base2 { @Override public void foo(String name) { System.out.println("执行子类重写foo方法,传入参数为:" + name); } //当前类 int age = 200;//实例变量 public void test() { int age = 2;//局部变量 System.out.println(age); System.out.println(this.age); System.out.println(super.age);//super限定访问父类定义中的age(实例变量) this.foo("123"); super.foo("abc");//super限定访问父类定义的实例方法 } } public class SubTest { public static void main(String[] args) { Sub s = new Sub(); //调用方法 s.test(); } } //写一个类Fruit class Fruit { //给一个成员变量 private double weight; //给一个构造器 public Fruit(double weight) { this.weight = weight; } } public class Apple extends Fruit { public Apple() { //如果没有super调用,默认调用父类无参数的构造器 // super("123");//尝试调用(String)构造器 super(123); } }