/**
*假設A,B,C三個類都不在相同的包下,並且假設以下編輯器不會報錯
*/
public class A{
public void fun() {
}
}
public class C extends A{
@Override
protected void fun() {//假設這里編譯可以通過
}
}
public class B{
public static void main(String[] args){
A c = new C();
c.fun();
//因為c為A類型,所以可以調用fun(),但是在運行時,c肯定是調用自身的fun(),又因為c中fun()為protcted修飾,B和C又不在同一個包下,所以C中fun()只能由其子類調用,所以會出現問題
}
}
其實在向上轉型的過程中,如果重寫的權限修飾符小於父類的權限修飾符,會出現問題,還有private修飾的方法不能被覆蓋,其實private修飾的方法已經隱士的聲明了final。
引出一個問題,protected權限修飾符
1.子類和基類在同一個包下,被聲明為 protected 的變量、方法和構造器,除了能夠被自己的實例訪問外,也可以被其子類的實例訪問。
2.子類和基類不在同一個包下,protected修飾的,不能自己的實例訪問,但是可以被子類的實例訪問。
//1.不再同一個包下
public class A{
protected String name = "zyt";
}
public class B extends A{
public static void main(String[] args){
System.out.println(new B().name);//zyt
//在不同包下,自己的實例卻訪問不了,出現編譯不通過
System.out.println(new A().name);
}
}
//2.在同一個包下
public class A{
protected String name = "zyt";
}
class B extends A{
public static void main(String[] args){
System.out.println(new B().name);//zyt
System.out.println(new A().name);//zyt
}
}
總結
- private:只有在當前類的內部才能被訪問
- 缺省:可以在同一個包下的任何類訪問.
- protected:除了可以在同一個包下任何類中訪問外,在不同包下的類可以通過繼承該類,通過子類實例來訪問。注意:也只有子類實例可以訪問,自己本身的實例也不可訪問。
- public:可以在任何類中訪問。