我們知道,在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就好了