super有以下两大作用:
1、起限定作用:强制去访问父类的成员(Field、方法)
2、起调用作用:指定/显示调用父类的某个构造器
super调用规则:
1、子类构造器总会调用父类构造器一次,默认情况下子类构造器会自动调用父类无参数的构造器;
2、若希望明确指定子类构造器调用父类哪个构造器,可以用super(参数,参数,....),到底调用哪个父类构造器取决于super后面传入的形参列表;
3、this()调用与super()调用都必须出现在构造器的第一行,所以他们两个调用时不能同时出现的.
约定俗成:
1、若没有super()调用,也没有this()调用,默认子类构造器会自动调用父类无参数构造器;
2、若有super()调用,根据super()调用传入的形参列表去决定调用哪个父类构造器;
3、若有this()调用,子类构造器会找到this()调用所对应的子类中被重载的构造器。
例1:在方法中使用super.起限定作用
1 class Fruit{ 2 private String color; 3 private double weight; 4 5 public Fruit(){} 6 public Fruit(String color , double weight){ 7 this.color = color; 8 this.weight = weight; 9 }10 11 public void info(){12 System.out.println("这是一个水果哦!");13 System.out.println("水果颜色是:" + color + ",重量为:" + weight);14 }15 }16 17 18 public class Apple extends Fruit{19 public void info(){20 System.out.println("这是个苹果!");21 }22 23 public void test(){24 System.out.println("~~Apple test 方法");25 //this.info(); - 通过this. 调用info默认总是调用本类中定义的info()方法26 super.info(); //- 通过super. 限定后强制调用父类中的info()方法27 }28 29 public static void main(String[] args){30 Apple a = new Apple();31 a.test();32 }33 }
例2:在Field中使用super. 同样起限定作用
1 class Demo{ 2 int count = 2; 3 } 4 5 public class TestDemo extends Demo{ 6 int count = 10; 7 public void test(){ 8 //默认count(即count前不加this./super.)时,其前面默认省略了this 9 //若一定要使用父类的count Field必须在其前面加上super.10 System.out.println("test方法访问当前类的count为:" + this.count);11 System.out.println("test方法访问父类的count为:" + super.count);12 }13 14 public static void main(String[] args){15 TestDemo t = new TestDemo();16 t.test();17 }18 }
例3:通过super调用父类构造器
1 class Person{ 2 protected String name; 3 protected int age; 4 protected String sex; 5 6 //程序员定义了有参构造器,因此系统不会再为该类生成无参构造器 7 public Person(String name , int age , String sex){ 8 this.name = name; 9 this.age = age;10 this.sex = sex;11 }12 13 //假如不定义方法,直接在main方法中调用name/age/sex 参数编译时会报错"staic方法不能引用非static变量"14 public void info(){15 System.out.println("老师的名字叫:" + name + ",年龄为:" + age + ",性别为:" + sex);16 }17 }18 19 public class Teacher extends Person{20 private String sex;21 22 //若不指定构造器,默认会去调用父类的无参构造器,但父类又没有无参构造器则报错23 public Teacher(String name , int age , String sex){24 super(name,age,sex);25 }26 27 28 public static void main(String[] args){29 Teacher tt = new Teacher("haha",30,"male");30 tt.info();31 }32 }