18、繼承以及繼承中成員變數和成員方法的重名問題

pray1996發表於2020-12-04

繼承

繼承類別寫法:

定義父類格式:

public class 父類名稱{

​ //…

}

定義子類格式://extends 擴大;擴充套件

public class 子類名稱 extends 父類名稱{

​ //…

}

父類子類中訪問成員變數的規則:(父類子類中變數重名問題)

在父子類的繼承關係中,如果成員變數重名,則建立子類物件時,訪問有兩種方式:

  1. 直接通過子類物件訪問成員變數
    規則:等號左邊時誰,就優先用誰,沒有則向上找

  2. 間接通過成員方法訪問成員變數
    規則:該方法屬於誰,就優先用誰,沒有就向上找

區域性變數、本類的成員變數、父類的成員變數三者的重名問題

  • 區域性變數:直接寫成員變數名

  • 本類的成員變數:this.成員變數名

  • 父類的成員變數名:super.成員變數名

//父類
public class Fu {
    int num=20;//父類中的num
}


//子類
public class Zi extends Fu {
    int num=10;//子類中的num
    public void method(){
        int num=30;//區域性變數num
        System.out.println(num);//區域性30
        System.out.println(this.num);//子類10
        System.out.println(super.num);//父類20
    }
}

成員方法的重名問題:

在父子類的繼承關係中,建立子類物件,訪問成員方法的規則:

  • 建立物件是誰,就優先用誰,如果沒有就向上找。
  • 無論是成員方法還是成員變數,如果沒有都是向上找父類,絕對不會向下找子類的。
public class Fu {
    public void methodFu(){
        System.out.println("父類方法執行");
    }
    public void method(){
        System.out.println("父類重名方法執行");
    }
}

public class Zi extends Fu{
    public void methodZi(){
        System.out.println("子類方法執行");
    }
    public void method(){
        System.out.println("子類重名方法執行");
    }
}

public class Demo {
    public static void main(String[] args) {
        Zi zi = new Zi();

        zi.methodZi();//
        zi.methodFu();//子類中沒有就上父類中找
        zi.method();//子類重名方法執行,建立的是子物件,所以優先用子物件中的method()
    }
}

相關文章