JAVA中方法和變量在繼承中的覆蓋和隱藏

我們知道,在JAVA中,子類可以繼承父類,如果子類聲明的方法與父類有重名的情況怎麼辦,大夥兒都知道要是重寫,但是實際上這又分爲兩種情況,就是方法和變量在繼承時的覆蓋和隱藏問題。

隱藏 :child隱藏了parent的變量和方法,那麼,child不能訪問parent被隱藏的變量或者方法,但是,講B轉換成A中,可以訪問A被隱藏的變量或者方法

覆蓋 :child覆蓋了parent的變量或者方法,那麼,child不能訪問parent被覆蓋的變量或者方法,將child轉換成parent後同樣不能訪問parent被覆蓋的變量或者方法

 

首先看一下JAVA中方法和變量在繼承時的覆蓋和隱藏規則

1.父類的實例變量和靜態變量能被子類的同名變量隱藏

2.父類的靜態方法被子類的同名靜態方法隱藏

3.父類的實例方法被子類的同名實例變量覆蓋

 

還有幾點需要注意的是

1.不能用子類的靜態方法隱藏 父類中同樣標示(也就是返回值 名字 參數都一樣)的實例方法

2.不能用子類的實例方法覆蓋 父類中同樣標示的靜態方法

3.這點兒請注意,就是變量只會被隱藏 不會被覆蓋 ,無論他是實例變量還是靜態變量,而且,子類的靜態變量可以隱藏 父類的實例變量,子類的實例變量可以隱藏 父類的靜態變量

public class pratices{

    public static void main(String[] args){
        new Child().say(); // 1
    }
}


class Parent{
    String message = "parent";
    void say(){
        System.out.println(message);
    }
}

class Child extends Parent{
    String message = "child";
}

1的位置輸出的是什麼?

是parent。

所以總結如下:

1.同名的實例方法被覆蓋 ,同名的靜態方法被隱藏 ,child類的getName實例方法覆蓋 了parent的getName實例方法,chind的getKind方法隱藏 了parent類的getKind方法

2.隱藏 和覆蓋 的區別在於,子類對象轉換成父類對象後,能夠訪問父類被隱藏 的變量和方法,而不能訪問父類被覆蓋 的方法

3.如果需要訪問父類被隱藏 的實例變量,加上super就好了,比如訪問父類的name,寫上super.name就好了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章