JAVA中使用super調用屬性、方法、構造器


子類中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(); 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM