2016-12-21 10 views
3
class Animal{ 
    String s; 
    Animal(String s){ 
     this.s = s;  
    } 
} 


class Dog extends Animal{ 
    Animal animal; 
    Dog(String s) { 
     super(s);  
    } 
    //here is an error "Implicit super constructor Animal() is undefined.Must explicitly invoke another constructor" 
    Dog(Animal animal){ 
     this.animal = animal;  
    } 
} 

私の混乱は、私はすでにスーパークラスにパラメータを持つコンストラクタが1つしかない場合、パラメータを持つすべてのサブクラスのコンストラクタにはsuper(args)が必要ですか?

Dog(String s) { 
    super(s);  
} 

にスーパークラスのコンストラクタ-とパラメータを呼んでいるが、私はまだ別のコンストラクタ犬(動物動物)にエラーメッセージが表示されますなぜですか?

この例でコンストラクタメカニズムがどのように機能しますか?

ありがとうございます!

+2

ScaryWombatが言っているように、おそらくあなたは 'Dog(Animal animal)'コンストラクタを望んでいないでしょう。しかし、別の間違いを訂正したい。クラスが2つ以上のコンストラクタを持つことは非常に可能です。ただし、オブジェクトが作成されると、コンストラクタの1つだけが呼び出され、両方が呼び出されることはありません。だから、あなたが書いたように、他のコードが 'new Dog'と言うとき、それは文字列パラメータ_または動物パラメータを持つものと_どちらかを呼び出します。両方ともではありません(あるコンストラクタに他のコンストラクタを呼び出さない限り)。つまり、私はすでにスーパークラスのコンストラクタを呼び出しています... "という文は間違っています。 – ajb

+0

私は、コンストラクタが、特にサブクラスでどのように動作するのかを根本的に誤解していると思います。あなたは戻って、その課題に関するチュートリアルを勉強してください。 – ajb

+0

@ajbありがとう、あなたの答えは本当に多くの助けになります:-) – bruce

答えて

5

であり、あなたの質問への答えは単純です:はい。

サブクラスコンストラクタは、最初にスーパーを呼び出します。スーパークラスに引数を取っているctorが1つしかない場合、サブクラスのスーパーコールはそのctorを使用する必要があります。

+0

あなたの答えをありがとう:-) – bruce

+0

あなたは大歓迎です。すぐに受け入れてくれてありがとう! – GhostCat

4

コードが間違っています。 DogAnimalを拡張として、その後Dogは必要ありません(とてはならない)Animalオブジェクト

正しい方法は

class Animal{ 
    String s; 
    Animal(String s){ 
     this.s = s;  
    } 

    // add a setter and getter 
    public String getS() {return s;} 
    public void setS (String s) {this.s = s;} 
} 


class Dog extends Animal{ 
    Dog(String s) { 
     super(s);  
    } 
} 
+0

どのようにして '動物 'にアクセスしますか? 'スーパー(s); s.Animal; '? – radbrawler

+1

あなたが望むものを返す 'Animal'メソッドが必要です。あなたのコード 'Dog' ** isa **' Animal' –

+0

スーパーのフィールドにアクセスする方法を示すためにセッターとゲッターを追加しました –