首页 > 代码库 > 疯狂java学习笔记之面向对象(七) - super关键字

疯狂java学习笔记之面向对象(七) - super关键字

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 }

 

疯狂java学习笔记之面向对象(七) - super关键字