2014-03-03 19 views
0

我們被指示將字符串「名稱」定義爲父類Person中的私有。但是,當我嘗試顯示Person和Employee對象的名稱時,Employee名稱被打印爲「null」。我不允許將「名稱」定義爲公共。繼承對象在Java中打印爲null

Person類:

public class Person { 

private String name; 
public int weight, height; 

public Person() {} 

public Person(String name) { 

    this.name = name; 
} 

public String getName() { 

    return name; 
} 


public String toString() { 

    return this.getName() + ", your height is " + height + " and your weight is " 
      + weight; 
} 

Employee類:

public class Employee extends Person { 

private int id; 

public Employee(String name, int id) { 
    this.id = id; 
    this.name = name; 
} 

public int getID() { 
    return id; 
} 

}

主類:

Person a1 = new Person("Thomas"); 
    a1.height = 70; 
    a1.weight = 160; 
    Person a2 = new Employee("Rebecca", 6543); 
    a2.height = 65; 
    a2.weight = 128; 
    Person a3 = new Employee("Janice", 8765); 
    a3.height = 60; 
    a3.weight = 120; 
    Person[] arr = new Person[] {a1, a2, a3}; 
    Person a; 
    for (int i = 0; i < arr.length; i++) { 
     a = arr[i]; 
     System.out.println(a.toString() + "; your BMI is: " + a.calcBMI()); 
    } 
    Person.countEmployees(arr); 

輸出:

托馬斯,你的身高是70,體重是160;你的BMI是:22.955102040816328 null,你的身高是65,你的體重是128;你的BMI是:21.297988165680472 null,你的身高是60,體重是120;你的BMI是:23.433333333333334

我通過電子郵件問我的教授,她說因爲toString()是在父類Person中定義的,所以不應該發生這個錯誤。我的語法錯了嗎?邏輯錯誤?

+0

您可以用'protected'? –

+2

這是如何編譯的?「Employee」類中的'this.name = name;'不是你的編譯器錯誤嗎? –

+0

@EmersonFarrugia是的,它包含「this.name = name」時會出錯。我拿出來測試東西,然後打印空對象 – supersaidso

回答

0

我不知道如何類你是編譯

public class Employee extends Person { 

    private int id; 

    public Employee(String name, int id) { 
     this.id = id; 
     this.name = name; 
    } 
} 

當你說this.name = name並且Person.name是私人的,如果你還沒有定義在Employee類中稱爲名稱的另一個變量。

回到你的問題,你需要調用人在員工consructor構造,像這樣

public class Employee extends Person { 

    private int id; 

    public Employee(String name, int id) { 
     super(name); 
     this.id = id; 
    } 
} 
0

您應該刪除Employee構造函數中的行this.name = name;,並將super(name);的調用添加爲該構造函數的第一行。

3

的問題是,你的Employee構造函數調用默認的構造函數Person(呼叫由編譯器自動注入,因爲默認的構造函數的定義,你可以刪除Person是默認的構造函數,你會看到它不編譯)。

你應該調用接收在Employee構造的名字,而不是設置屬性(它不應該被編譯,順便說一句)構造

public Employee(String name, int id) { 
    super(name); 
    this.id = id; 
} 
+0

是的,它只在我取出「this.name = name;」時編譯。 – supersaidso

0

這是因爲它是私人的Person類,所以你不能在你的Employee類中訪問它,因此你不能直接從那裏設置它。

更改此

public Employee(String name, int id) { 
    this.id = id; 
    this.name = name; 
} 

爲此,它要求你需要設置名稱構造器:

public Employee(String name, int id) { 
    super(name); 
    this.id = id; 
}