2010-02-04 75 views
1

我是Java和OOP的新手,我可以在Java中創建一個受保護的成員嗎?我想從一個子類訪問它

我在一個類A中使用了一個私有子類(實際上是一個結構體)B,一切都很順利,直到我決定做一個父類下的子類B.我想公開一些類C.

的保護成員。例如:

public class A { 
    private class B extends C { 
     public int product; 
     public int x; 
     public int y; 
     public void add() { 
      product=x+y; 
     } 
    } 
    B b=new B; 
    b.x=1; 
    b.y=2; 
    b.multiply(); 
    System.out.println(b.product+"="+b.x+"x"+b.y); 

public class C { 
    protected int x; 
    protected int y; 
    public int sum; 
    public C(px,py) { 
     x=px; 
     y=py; 
    } 
    public void sum() { 
     sum=x+y; 
    } 
} 

我也得到

隱超常量對於默認的構造函數,未定義C()。 必須定義一個明確的構造函數

當然,我可以刪除擴展C,並回到我以前的東西。或者我可以讓一個getter/setter。但我認爲可以接受的內部結構是可以理解的,它應該能夠擴展其他類。

回答

5

編譯器消息是相當清楚 - B中你已經有效有:

public B() { 
    super(); 
} 

和失敗,因爲在C無參數的構造函數調用。要麼引入一個無參數的構造函數,要麼在B中提供一個顯式構造函數,該構造函數使用適當的參數調用C中的構造函數。

我不確定這是一個好主意,所有這些非私人領域,介意你 - 也不是一個好主意,在B領域隱藏字段在C.你真的想要一個實例B有兩個x字段和兩個y字段?你意識到他們將是獨立的領域,不是嗎?

如果你只是想有效地提供公共接入,你可以有:

public void setX(int x) { 
    this.x = x; 
} 

public int getX() { 
    return x; 
} 

(與同爲y),並刪除多餘的字段從B.你不能改變的實際無障礙雖然在C領域。

+0

哇,快 感謝3^10,這是m/s響應... 我剛想通了,我需要一個受保護的默認構造函數 – TiansHUo 2010-02-04 09:52:38

+0

@Skeet:你真的想讓B的實例有兩個x字段和兩個y字段嗎?你意識到他們將是獨立的領域,不是嗎? 不,我不知道你是什麼意思,他們分開領域?當我調用超類C中的sum()時,它會起作用嗎? – TiansHUo 2010-02-04 09:56:25

+0

@TiansHUo:不,sum()將總結C中聲明的字段,這些字段完全獨立於B中聲明的字段。(我還應該指出'product()'和'sum()'可能是最好的返回值而不是將它設置在另一個字段中。) – 2010-02-04 10:00:40

0

好吧,我是用我自己的代碼fuddling,發現問題是我需要的超C.它現在受保護的默認構造函數...

+0

老兄,你只能發佈一個問題的答案,併發布給我們,答案的作品。你可以像我對你自己的問題一樣添加評論。閱讀常見問題。 – 2010-02-04 10:27:07

相關問題