2015-02-11 74 views
2

比方說,我有以下代碼我應該如何使用超類的實例構造一個子類?

public class SuperClass { 
    protected int super_class_value; 

    public SuperClass (int value) { 
     this.super_class_value = value; 
    } 
} 

public class Subclass extends SuperClass { 
    protected int subclass_value; 

    public SubClass(int super_class_value, int subclass_value) { 
     super(super_class_value); 
     this.subclass_value = subclass_value; 
    } 
} 

不過,現在我希望能夠通過一個超類對象轉換成子類構造函數。我會怎麼做?

public SubClass(SuperClass super_class, int subclass_value) { 
    //What do I do here? 
    this.subclass_value = subclass_value; 
} 

基本上,我想要做這樣的事情...

public SubClass(SuperClass super_calss, int subclass_value) { 
    super(super_class.super_class_value); 
    this.subclass_value = subclass_value; 
} 

但如果超類是比較複雜的,我不希望每個值添加到超()調用。相反,我想簡單地傳入一個已經存在的對象,並將其用作超類。

我想這樣做......

public SubClass(SuperClass super_class, int subclass_value) { 
    super(super_class); 
    this.subclass_value = subclass_value; 
} 

但我不知道這是允許的?


似乎我可以做到上述,如果我添加一個構造函數的SuperClass定義。但是,這將是什麼樣子?

public class SuperClass { 
    protected int super_class_value; 

    public SuperClass (int value) { 
     this.super_class_value = value; 
    } 

    public SuperClass (SuperClass super_class_object) { 
     //What is done here? 
    } 
} 
+0

目前你的代碼看起來很好...你想用'super_class'參考做究竟是什麼? – chancea 2015-02-11 20:00:29

+0

你能不能像子類一樣在子類中傳遞它?super(super_class_value);'? – Apurva 2015-02-11 20:02:13

+0

爲什麼你想要傳遞超類對象? – Kode 2015-02-11 20:05:04

回答

0

您可以添加getter方法的SuperClass內部和​​構造函數中使用它們。

public class SuperClass { 
    protected int super_class_value; 

    public SuperClass (int value) { 
     this.super_class_value = value; 
    } 

    public int getSuperClassValue(){ return super_class_value;} 
} 

public class Subclass extends SuperClass { 
    protected int subclass_value; 

    public SubClass(SuperClass super_class, int subclass_value) { 
     super(super_class.getSuperClassValue()); 
     this.subclass_value = subclass_value; 
    } 
} 
+0

我想避免這種情況,因爲super_class可能非常複雜 – Tester101 2015-02-11 20:18:11

+1

您需要將數據設置到某處,無論是在SuperClass中,還是通過向SuperClass或SubClass中添加其他構造函數,類似於我在此處編寫的內容。 – 2015-02-11 20:20:18

0

查看Decorator Pattern這是一個衆所周知的例子。該頁面也包含一個具有UML圖的良好Java示例。

0
public class SuperClass { 
    protected int super_class_value; 

    public SuperClass (int value) { 
     this.super_class_value = value; 
    } 

    Object obj = new Object(); 
} 

public class Subclass extends SuperClass { 
    protected int subclass_value; 

    private SuperClass superCl = new SuperClass(); 

    public SubClass(int super_class_value, Object obj2 ,int subclass_value) { 
     super(super_class_value); 
     obj2 = superCl.obj; 
     this.subclass_value = subclass_value; 
    } 
} 
1

不過,現在我希望能夠通過一個超類對象爲 子類構造函數。我會怎麼做?

你完全做同樣的

public SubClass(SuperClass super_class, int subclass_value) { 
    //What do I do here? 
    // Do Whatever you want to do here , 
    this.subclass_value = subclas_value; 
} 

現在,我想你可能會想如何對象從子類則這可以通過super keyword在Java中

  • 進行傳向超super()用於調用直接的父類構造函數。

現在傳遞對象向超,在子類的構造函數,你的第一行必須是

super(super_class); 

現在在你的超級類,你必須有一個構造函數,利用了自身的對象,否則上面的行會拋出編譯時間錯誤

public SuperClass (SuperClass object) { 
     // Do whatever you want to do . 
      this.anyInstanceVariable=object.thatInstanceVariable; 
    } 

PS:我還是不明白你想達到這個幹了什麼,但是這是當你在評論說,無論你曾提到


更新

你會實現它的方式,你不想每個單變量拷貝,那麼你可以使用Object class

這裏clone方法是一個例子,你將如何在你的情況下實現它

class SuperClass implements Cloneable{ // otherwise clone() method will throw CloneNotSupportedException 

    int a; 
    SuperClass obj=null; // this will point to the copy of the cloned object 

    SuperClass(int a){// just to test that cloning is successfull 
     this.a=a; 
    } 
    SuperClass(SuperClass a){ 
     try{ 
     this.obj=(SuperClass)a.clone(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     display(); 
    } 
    public void display(){// to Verify that Cloning has been done successfully 
     try{ 
     System.out.println("Hello from cloned Object "+obj.a); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    @Override 
    protected Object clone() throws CloneNotSupportedException { // Overridden Method 
     return super.clone(); 
    } 
} 

看看這篇不錯的文章關於Object cloning in java

+0

SuperClass中的構造函數體是什麼樣的? 「* //做你想做的事*。」是,那裏有什麼? – Tester101 2015-02-11 20:42:55

+0

在那裏你可以寫任何有效的java語句,但我認爲你要在那裏執行的任務是拷貝構造函數的工作 – 2015-02-11 20:47:00

+0

檢查最新編輯的部分 – 2015-02-11 20:50:34

2

難道你不想爲你的超類擁有copy constructor嗎?

public class SuperClass { 
    protected int super_class_value; 

    public SuperClass (int value) { 
     this.super_class_value = value; 
    } 
    protected SuperClass (SuperClass super_class) { 
     this.super_class_value = super_class.supper_class_value; 
    } 
} 

public class Subclass extends SuperClass { 
    protected int subclass_value; 

    public SubClass(SuperClass super_class, int subclass_value) { 
     super(super_class); 
     this.subclass_value = subclass_value; 
    } 
} 

這裏還看到一個問題,關於SO有關編寫複製構造函數:

Does Java have a default copy constructor (like in C++)?

+0

是的,但是super_class可能相當複雜,而且我不想手動複製每個值。 – Tester101 2015-02-11 20:19:32

+1

@ Tester101:啊,但你不是!至少,不在SubClass中。子類只是傳遞super_class。至於SuperClass本身,如果它的構造很複雜,你可以使用[構造函數鏈接](http://stackoverflow.com/questions/17171012/how-to-avoid-constructor-code-redundancy-in-java)。 – einpoklum 2015-02-11 20:22:15

相關問題