java中子類再重寫父類方法時,為什么子類的權限修飾符必須大於或者等於父類權限修飾符?


/**
*假設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
    }
}

總結

  1. private:只有在當前類的內部才能被訪問
  2. 缺省:可以在同一個包下的任何類訪問.
  3. protected:除了可以在同一個包下任何類中訪問外,在不同包下的類可以通過繼承該類,通過子類實例來訪問。注意:也只有子類實例可以訪問,自己本身的實例也不可訪問。
  4. public:可以在任何類中訪問。


免責聲明!

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



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