java中protected的權限

首先說明:父類和子類在不同包中,那麼父類中的default和private方法都不能被子類繼承。

java中protected 

1. protected 訪問控制符能被用於方法和成員變量。 
    2. 聲明爲protected的方法和成員變量能被同一個包裏的所有類所訪問,就像默認修飾符package一樣。 
    3. 能被該類的子類所訪問,子類可以和父類不在一個包中。 
    這樣,當你想讓一個類中的某個方法或成員變量在包中都可見,而且其子類也能訪問(子類有可能和父類不在同一個包中)但又不想讓所有類都可以訪問該類時,就可以用protected修飾符。 
    可訪問性: 
    public > protected > package >private 

    注意: 
    4. But a subclass in another package can access the protected members in the super-class via only the references of subclass or its subclasses. A subclass in the same package doesn’t have this restriction. This ensures that classes from other packages are accessing only the members that are part of their inheritance hierarchy. 
    
    下面的例子可以說明上述幾點:(特別注意第4點) 
    我們將創建一個父類Bird.java,放在birdpack包中,父類中有一個protected int的成員變量nFeathers; 
    再分別創建4個Bird類的子類Duck1.java,Duck2.java,Duck3.java,Swan.java,放在duckpack包中,通過在每個子類中調用nFeathers的不同方法說明上述幾點 


下面的程序並不用於運行,因爲訪問控制在編譯期間就要確定,我們只需編譯下述文件,看是否能通過。在編譯下述文件前,先想想能不能編譯通過?

  

//Bird.java------------------------------
package birdpack;


public class Bird{
 protected int nFeathers;
 
}


//Duck1.java-----------------------------
package duckpack;


import birdpack.Bird;


public class Duck1 extends Bird{
 public void setn(int duck1n){
  //在子類中直接訪問父類中的protected變量
  nFeathers=duck1n;
 }
}
//Duck2.java------------------------------ 
package duckpack;


import birdpack.Bird;


public class Duck2 extends Bird{


 public void construct(int newduck2){
  Duck2 d2 = new Duck2();
  //在子類中通過子類的對象訪問父類中的protected變量
  d2.nFeathers=newduck2;
  Bird d = new Duck2();
  d2.nFeathers=newduck2;//(編譯錯誤)
  //父類引用指向之類對象是無法調用protected變量的。
 }
}


//Duck3.java------------------------------
package duckpack;


import birdpack.Bird;


public class Duck3 extends Bird{


 public void construct(int newduck3){
  Bird b = new Bird();
  //子類中用父類對象反而不能訪問父類中的protected變量
  b.nFeathers=newduck3;
 }
}


//Swan.java--------------------------------
package duckpack;


import birdpack.Bird;


public class Swan extends Bird{


 public void construct(int swan){
  Duck1 d1 = new Duck1();
  //子類中用另外一個子類的對象也不能訪問父類中的protected變量
  d1.nFeathers=swan;
 }
}

編譯上述幾個文件,後2個不能通過。編譯器提示: 
" nFeathers has protected access in birdpack.Bird"。 


第4點說明,就算在子類中,也只能通過子類(或子類的子類)的引用來訪問父類中的protected方法和成員變量. 
在Duck3和Swan兩個子類中,直接通過父類和另一個子類來訪問父類中的protected方法和成員變量就不行. 
但是,如果子類Duck1重寫了protected變量或方法,那麼Swan.java中d1對象可以訪問該變量或方法
 


附:編譯技巧 
當編譯含有包聲明的源文件時,使用 -d 選項會帶來很多方便,它能保證編譯後的class文件存放在正確的目錄路徑下。 
我們可以把上述5個文件都放在protectedtest目錄下,然後用 -d 選項去編譯: 
javac -d . Bird.java 
javac -d . Duck1.java 
..... 
其中.表示以當前目錄創建包結構的目錄層次。編譯成功後,會在protectedtest下生成2個目錄:birdpack和duckpack,裏面是生成的class文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章