疯狂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 }