2017-06-26 15 views
1

我正在學習java中的繼承。在我學習的地方編寫小代碼時,我們不能訪問子類中的超類的私有成員。無法在eclipse中的獨立類中創建子類的對象

這裏是我的代碼:

class A { 
    int i; 
    private int j; 

    void setij(int x, int y) { 

     i = x; 
     j = y; 
    } 

    class B extends A { 

     int b; 

     void sum() { 

      b = i + j; 
     } 
    } 

當我在Eclipse中創建一個新的類,我不能夠在A級創建sublcass B的對象

class mainclass{ 

      public static void main(String args[]){ 
       B object = new B(); ----error 


      } 
     } 

    } 

錯誤說B類需要創建。

我可以知道爲什麼會發生..?它的發生不是一個問題,但我想解決和理解爲什麼發生的邏輯。

感謝

+0

你試過' AB object = new AB();'? 'B'是一個嵌套類(也可能需要聲明爲'static class') – Oneiros

+0

你的子類不需要也是一個內部類。 – khelwood

+0

@ khelwood..why ..? – LearnJava

回答

2

這是因爲類B存在內部類A,它需要創造A外,如:

class A { 
    int i; 
    private int j; 

    void setij(int x, int y) { 

     i = x; 
     j = y; 
    } 
} 

class B extends A { 

    int b; 
    void sum() { 
     b = i + j; 
    } 
} 

有了這個代碼,類B(和A)將訪問來自包內的所有類。如果你想讓這些類可以從當前包之外訪問,那麼你需要在單獨的文件中創建這些類並將它們標記爲public

Here's更多有關類的訪問修飾符。

Upate

如果要定義B類爲A一個內部類,那麼你將需要(在本例中A)封閉類的實例來訪問B,如:

class A { 
    int i; 
    private int j; 

    void setij(int x, int y) { 

     i = x; 
     j = y; 
    } 

    class B extends A { 

     int b; 
     void sum() { 
      b = i + j; 
     } 
    } 
} 

現在,爲了實例化B,您需要執行以下操作:

A a = new A(); 
B b = a.new B(); 

,當然,同樣的規則,訪問修飾符將適用於內部類實例(除了一個事實,即內部類可以訪問封裝類的私有成員),

+0

是的,還是聲明爲靜態 –

+0

@MauricePerry是的,確切的! –

+0

@DarshanMehta ...但在同一個包中創建主類... !! – LearnJava

1

這是因爲B類的實例必須與對A類的實例,因此,你必須首先創建一個類的實例,那麼B類的實例:

A a = new A(); 
    a.setij(1,2); 
    B b = a.new B(); 
    b.setij(3,4); 
    b.sum(); 
    System.out.println(b.b); 

(結果是5萬一你想知道)