2016-11-27 1 views
2

私は、継承の概念に基づいたプロジェクトを行い、2つの変数(String、int)を持つスーパーコンストラクタを作成しました。このスーパーコンストラクタは、スーパーコンストラクタクラスを継承したサブコンストラクタ内で呼び出されます。次に、2つのメソッドを使用して、コンストラクタ内でそれらの変数のプロパティを返します。 ageプロパティは正常に出力されていますが、Stringプロパティはnullを返しています。ここでは、コードです:コンストラクタ内の変数がnullを返していますか?

動物のスーパークラス

abstract public class Animal 
{ 

    int age; 
    String name; 

Animal(String name, int age) 
{ 
    this.age = age; 
    this.name = name; 
} 


Animal() 
{ 
    this("newborn", 0); 
} 


public String getName() { 
     return name; 
    } 

    public void setName(String newName) { 
     name = newName; 
    } 

} 

ウルフサブクラス

public class Wolf extends Carnivore 
{ 

    String name; 
    int age; 

Wolf(String name, int age) 
{ 
    this.name = name; 
    this.age = age; 
} 

Wolf() 
{ 
    super(); 
} 

    public String getName() 
    { 
     return name; 
    } 

    public int getAge() 
    { 
     return age; 
    } 

} 

Mainメソッドクラス

public class Main { 


    public static void main(String[] args) 
    { 

    Wolf newWolf = new Wolf(); 
    System.out.println("Name = " + newWolf.getName()); 
    System.out.println("Age = " + newWolf.getAge()); 

} 
} 

年齢は0に戻りますが、正しいですが、System.out.println("Name = " + newWolf.getName());は「新生児」の代わりにnullを返すようです。この問題を解決するための助けに感謝します。

更新は - 私はそれらの両方が存在して持つ​​方法がある私は、この例には含まれていない別のコンストラクタのgetName()方法がありますか?

+1

Wolf' 'から'のgetName() 'メソッドを削除します。'ウルフの値を返すこと'Wolf.name'も削除します(' Wolf'の 'getAge()'と 'age'も同じです) –

+0

あなたはだまされています、' age'は0を返していませんあなたはそれが復帰していると思います。 t'int'値は0になります。これは 'Animal'のコンストラクタで指定した値ではありません。 – Tunaki

+0

問題は、getName()メソッドを必要とする別のコンストラクタがあることです。 – Tom

答えて

2

ここで問題となるのは、サブクラスでフィールドを定義しているため、親から継承されている必要はありません。

クラスには、スーパーコンストラクタで設定された2つのフィールドセットがあります(これらはコンストラクタによって設定されたもので、super()を呼び出しています)。これは子クラスからのものです(これはゲッターから返されたものです。初期化。ゼロ)のいずれか設定されていない、int型のデフォルトです。

だから、単純に子クラスからフィールド定義を削除

関連する問題