2015-10-09 147 views
2
//Filename: A.java 
package packageA; 
public class A { 
    protected int x; 
} 

//Filename B.java 
package packageB; 
import packageA.A; 

public class B extends A { 
    void action(A ob1, B ob2, C ob3) { 
     x = 10; 
     ob1.x = 10; // <-- error here 
     ob2.x = 10; 
     ob3.x = 10; 
    } 

public class C extends B { 
    void action(A ob1, B ob2, C ob3) { 
     x = 10; 
     ob1.x = 10; // <-- error here 
     ob2.x = 10; // <-- error here 
     ob3.x = 10; 
    } 

所以,我讀Java中的protected使用和過這個問題就來了。 A.javaB.java是單獨的文件,並保存在單獨的軟件包中,如您所見。在編譯B.java時,我得到3個ERRORS,x已在A中保護訪問。有人可以解釋爲什麼我在擴展課程A之後出錯嗎?錯誤訪問受保護的成員

回答

0

在類別B的方法action中,您將獲得A - ob1作爲參數的實例。

ob1本身是一個純類A對象。它不是B類的一個實例,它從類A擴展而來。所以,你不能覆蓋保護A類成員類A的

因爲 x從A類的保護成員 x擴展您可以覆蓋B類的字段成員 x

public class B extends A { 

    // class B has member x in field which is extended from class A 

    void action(A ob1, B ob2, C ob3) { 
     x = 10;  // <-- this is extended field member x from class A in class B 
     ob1.x = 10; // <-- this is protected member of other instance of A 
     ob2.x = 10; 
     ob3.x = 10; 
    } 
} 
+0

謝謝,解決了它。 – fireboy91

1

您不允許通過超類型引用訪問受保護的成員。見Java Language Specification, section 6.6.2: Details on Protected Access

編譯時在這裏所述方法增量發生錯誤的:它不能訪問其參數p的 保護成員x和y,因爲雖然三維點(在 類在其中字段x和y的參考文獻中發生)是 Point(聲明x和y的類)的子類,它不參與Point(參數p的類型)的實現。方法 delta3d可以訪問其參數q的受保護成員,因爲類Point3d是Point的子類,並且涉及Point3d的實現 。

相關問題