子類中super關鍵字的使用
1.super可以理解為父類的
2.super可以用來調用屬性,方法,構造器
3.在子類中使用super調用屬性和方法
3.1在子類的方法或構造器中,通過使用“super.屬性”或者“super.方法”的方式 ,顯示的調用父類中聲明的屬性或者方法 但是,通常情況下,我們習慣省略 “super.”
3.2特殊情況,當子類和父類中定義了同名的屬性時,想要調用父類中聲明的屬性,就需要通過“super.屬性”的方式來表明調用的是父類中聲明的屬性
3.3特殊情況,當子類重寫了父類中的方法以后,想在子類的方法中調用父類被重寫的方法時,則必須顯示的使用“super.方法” 來表明調用的是父類中被重寫的方法
4.在子類中使用super調用父類的構造器
4.1我們可以在子類的構造器中顯示的使用“super(形參列表)”的方式,來調用父類中聲明的指定的構造器
4.2“super(形參列表)”的使用,必須聲明在子類構造器的首行
4.3我們在類的構造器中,針對於“this(形參列表)”和“super(形參列表)”只能二選一,不能同時出現。“this(形參列表)”表示子類中重載的構造器,“super(形參列表)”表示調用父類的構造器
4.4在構造器的首行,沒有顯示的調用“this(形參列表)”和“super(形參列表)”時,則默認調用的是父類中空參的構造器,super()
4.5在類的多個構造器中,至少有一個類的構造器使用了“super(形參列表)”調用父類中的構造器,不可能全是“this(形參列表)”。
新建一個父類Person
public class Person { String name="張三"; int age=21; int id=1001001001;//證號 //空參構造器 public Person(){ System.out.println("我無處不在!"); } //一個參數的構造器 public Person(String name){ this.name = name; } //多個參數的構造器 public Person(String name,int age){ this(name); this.age = age; } public void eat(){ System.out.println("人吃飯"); } public void walk(int distance){ System.out.println("人走路,走的距離是"+distance+"公里"); } }
再新建一個子類Student,繼承上面的父類Person
package com.guigu.exer; import com.guigu.exer.Person; public class Student extends Person { String major; int id=10086;//學號 //子類空參構造器 public Student(){ } //子類一個參數的構造器 public Student(String major){ //這個構造器的首行有一個默認的super(),不寫時,編輯器會自動加上該默認super() //super(); this.major = major; } //子類中多個參數的構造器 public Student(String name,int age,String major){ //使用"super(形參列表)"的方式調用父類中指定形參的構造器 //使用"super(形參列表)"的時候,必須聲明在子類構造器的首行 super(name,age); this.major = major; } //該方法對父類方法進行了重寫 @Override public void eat(){ System.out.println("學生吃飯"); } public void show(){ //此時的name、age前面可以省略this System.out.println("name=" + name + "," + "age=" + age); //這里的this,super都可以調用,第一是因為子類和父類沒有屬性沖突的情況,都在堆空間去找且僅有一個name、age System.out.println("name=" + this.name + ","+ "age=" + super.age); //因為子類和父類都有一個同名的屬性,此時在堆空間是有兩個id的, 默認調用的是子類的屬性,這里省略了一個this System.out.println("子類中的id=" + id); //如果想要調用父類的屬性,需要在前面加上一個super System.out.println("父類中的id = "+ super.id); } public void study(){ System.out.println("學生,好好學習,天天向上"); //這里的調用省略了前面的“this.” eat(); super.eat(); //因為walk沒有被重寫,那么在子類中調用時,可以省略this,也可以使用"this.",還可以使用"super." //使用“this."和"super."的區別在於:“this."會先在本類去找,沒有找到再去父類找該方法,使用"super."直接去父類去找該方法 walk(2); this.walk(3); super.walk(5); } }
新建一個測試類,來驗證一下,看看打印結果
package com.guigu.exer; public class SuperTest { /** * @param args */ public static void main(String[] args) { Student student =new Student(); student.show(); student.study(); System.out.println("------------------"); Student s1= new Student("Tom",21,"IT"); s1.show(); System.out.println("********************"); Student s2= new Student();