2016-05-30 40 views
0

我知道一個抽象類不能被實例化。然而,如果我們寫下如下代碼的代碼,它會實例化一個抽象父代的匿名子類。根據Java規範,子類對象不應該有權訪問其父私有成員。做匿名具體的子類繼承抽象父私人領域?

讓我感到困惑的是,匿名子類對象能夠通過打印存儲在「我」中的值來訪問抽象父類的私人字段。我有什麼誤解?

public class Main { 

public static void main (String [] args){ 


    B myB = new B() {}; 
    myB.print(); 


}} 


public abstract class B { 

private int i = 5; 

public void print(){ 
    System.out.println(i); 
}} 

回答

4

這是完全沒有作爲i正在通過一種在B訪問。 print()被另一個類的代碼調用並不重要;可見性修改器僅影響直接訪問

(你不需要匿名子類,以顯示這個,你會看到一個具體的類相同的效果。)

這是封裝如何工作的:它會一直很努力的不同如果他們不能在其他使用私有字段的類中調用方法,那麼這些類就會以高效的方式使用對方。這是B負責實施其public方法,使其私人領域不受那些被調用的方法的不利影響。

+0

謝謝Aasmund! – mowienay