2014-01-15 93 views
0

爲什麼我在僱員構造函數的開始找不到符號 構造函數Person?如何通過子類調用超類的參數化構造函數?

class Person { 
    String name = "noname"; 

    Person(String nm) { 
     name = nm; 
    } 
} 

class Employee extends Person { 
    String empID = "0000"; 

    Employee(String eid) {// error 
     empID = eid; 
    } 
} 

public class EmployeeTest { 
    public static void main(String args[]) { 
     Employee e1 = new Employee("4321"); 
     System.out.println(e1.empID); 
    } 
} 
+0

的'super'關鍵字是你的朋友。 http://docs.oracle.com/javase/tutorial/java/IandI/super.html – user2336315

回答

5

你需要調用

super(name); 

爲constuctor Employee因爲編譯器的第一個語句,否則將隱式調用無參數的構造函數Person其犯規存在

其中name是對Employee增加了一個參數

Employee(String eid, String name) { 
    super(name); 
    empID = eid; 
} 

查看示例8.2-1 from the JLS,其中顯示瞭如果沒有明確的super方法調用,類似的示例失敗。

+1

如果「員工身份證」與該人的姓名不同,這將不是正確的做法。這意味着,這個答案是可能的(但不一定)是錯的。 –

+0

好的,點了,有糾正後:) – Reimeus

2

當你創建一個員工時,你需要指定一個名字和一個員工ID--因爲每個員工都是一個人,每個人都需要一個名字。 Employee的構造函數應該看起來像這樣。

public Employee(String eid, String name) { 
    super(name); 
    empID=eid; 
} 

該行指定如何調用超類的構造函數。它需要在那裏,因爲沒有參數的超類沒有構造函數。必須調用超類的構造函數,只有一個可用的構造函數,並且該構造函數需要指定name參數。

1

你應該做這樣的事情讓你的程序的工作:

class Person { 
    String name = "noname"; 
    Person(String name) { 
     this.name = name; 
    } 
} 

class Employee extends Person { 
    String empID = "0000"; 

    Employee(String empID , String name) { 
     super(name); 
     this.empID = empID; 
    } 
} 

public class EmployeeTest { 
    public static void main(String args[]) { 
     Employee e1 = new Employee("4321" , "Ramesh"); 
     System.out.println(e1.empID); 
     System.out.println(e1.name); 
    } 
} 

我有幾個點的補充。

  1. 使數據成員private始終是一個好習慣。如果你想訪問課堂以外的成員,請使用getters和setter。 (getName()setName()等)

  2. 你的構造函數(Person()Employee())必須被定義,如果你要在不使用參數的構造函數創建一個對象。如果您想使用非參數化構造函數實例化,則不會提供默認contstructor。所以每當你使用一個參數的構造函數是一個很好的習慣,這樣做:

    class Person { 
        private String name = "noname"; 
        Person() {} 
        Person(String name) { 
         this.name = name; 
        } 
        public String getName() { 
         return this.name; 
        } 
        public void setName(String name) { 
         this.name = name; 
        } 
    } 
    
    
    class Employee extends Person { 
        private String empID = "0000"; 
        Employee() {} 
        Employee(String empID,String name) { 
         this.empID = empID; 
        } 
        public String getEmpID() { 
         return this.empID; 
        } 
        public void setName(String empID) { 
         this.empID = empID; 
        } 
    } 
    
相關問題