2016-11-27 84 views
2

我正在做一個基於繼承的概念的項目,並創建了一個超級構造函數,它內部有兩個變量(String,int),這個超級構造函數然後在繼承超級構造函數類的子構造函數中調用。然後我使用兩種方法在構造函數中返回這些變量的屬性。 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; 
    } 

} 

主要方法類

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

刪除指定的字段定義中刪除了'的getName()'從'Wolf'方法,即返回狼'值.name',你從來沒有設置過,刪除'Wolf.name'也一樣(在'Wolf'中'getAge()'和'age') –

+0

你被欺騙了,'age'沒有返回0你認爲它正在返回,它正在返回默認狀態t'int'值,它恰好爲0.它不是在'Animal'的構造函數中指定的值。 – Tunaki

+0

問題是,我有另一個需要getName()方法的構造函數。 – Tom

回答

2

這裏的問題是你在子類中定義你的字段,你不需要,因爲它們是從父類繼承的。

你的類有兩組字段,一個來自super(這些是由你的構造函數設置的,它調用了super(),另一個來自子類(這些是你的getters返回的那些字段)初始化。零爲int的默認情況下,不設置任何)。

所以,簡單地從子類