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

 

posted @ 2014-12-16 11:12  一世飛扬  阅读(198)  评论(0编辑  收藏  举报