2014-04-26 216 views
0

在下面的代碼中,我提出了幾個問題: 我無法將類Address的對象作爲參數傳遞給其子類的構造函數EmployeeAddress。爲什麼這樣 ?它給錯誤,如參數不匹配..沒有參數傳遞.... 我想調用EmployeeAddress中的Address對象在show方法。怎麼做?如何將父對象作爲參數傳遞給子類的構造函數

class Address { 
    public String street; 
    int pin; 
    String city; 

    Address(String street, int pin, String city) { 
     this.street = street; 
     this.pin = pin; 
     this.city = city; 
    } 
} 

class EmployeeAddress extends Address { 
    int empid; 
    public String empname; 
    Address add; 

    EmployeeAddress (int empid, String empname, Address add){ 
     this.empid = empid; 
     this.empname = empname; 
     this.add = add; 
    } 

    void show() { 
     System.out.println("my name is " + empname + "and my empid is " + empid); 
    } 
} 

class Employee { 

    public static void main(String ar[]) { 
     Address ad1 = new Address("mystreet", 201301, "nyk"); 

     EmployeeAddress a1 = new EmployeeAddress(123, "kin", ad1); 

     a1.show(); 
    } 

    /* 
    * public String toString() { return 
    * "my name is "+a1.empname+"and my pin is "+ad1.pin ; } 
    */ 
} 
+2

*請。*改進您的格式和命名,使其符合Java編碼風格約定。 – skiwi

+0

你想在測試中調用什麼地址方法? – JamesB

+3

爲什麼要將父對象作爲參數傳遞給子對象?這是一個非常糟糕的設計。我建議寧願改變你的設計 – Lokesh

回答

2

您的代碼的問題在於類Address沒有定義默認構造函數。在EmployeeAddress的構造函數中,由於Address是父類,因此java會嘗試調用Address的無參數構造函數。但它不能因爲Address中沒有無參構造函數。添加一個可以解決問題

5

這裏有很多問題,其中最關鍵的是correctly pointed out by Belerafon,缺少一個父類構造函數(在父類中創建一個無參數構造函數或調用其中一個現有作爲超級(街道,別針,城市)的構造函數,可能你想叫超級(街道,別針,城市)構造函數)。

缺乏一個默認的構造的,或者調用適當的構造

類測試(原文如此)因爲它擴展地址的地址。因此它必須滿足Address的合同;即您可以像使用地址一樣使用它。地址只有一個構造函數Address(String street, int pin, String city),它可以初始化它,這樣它的所有方法都可以毫無錯誤地被調用。所以,你需要調用相應的超級構造函數,所以

test(int empid, String empname, Address add){ 
    super(add.street, add.pin, add.city); //<-- this gives the parent part of the class all the information it needs 
    this.empid = empid; 
    this.empname = empname; 
    this.add = add; //<-- somewhat strange, covered later 
} 

在子類的構造函數傳遞一個父類,並保持基準

這個可以有合法的用途,但在這種情況下,我擔心這是被不恰當地使用。在這種情況下,類別test均爲的地址,並且包含的不同地址。比較合適的一個例子是Female Cat都是Cat,也可以包含小貓形式​​的貓。

最可能的是,你要麼不希望在所有的擴展地址,或者你想停止傳遞一個地址給構造(取決於如果類test地址或包含地址這樣:

在這些例子中我使用了正確的Java命名約定,請參見下面

class Test{ 
    int empid; 
    public String empname; 
    Address add; 

    Test(int empid, String empname, Address add){ 
     this.empid = empid; 
     this.empname = empname; 
     this.add = add; 
    } 

    void show() { 
     System.out.println("my name is " + empname + "and my empid is " + empid); 
    } 
} 

class Test extends Address { 
    int empid; 
    public String empname; 


    Test(int empid, String empname, String street, int pin, String city){ 
     super(street, pin, city); //<-- this gives the parent part of the class all the information it needs 
     this.empid = empid; 
     this.empname = empname; 

    } 

    void show() { 
     System.out.println("my name is " + empname + "and my empid is " + empid); 
    } 
} 

普使用的Java代碼風格慣例的

類名稱開頭大寫字母。對象變量名稱以小寫字母開頭。因爲這樣的類test應該是Test。如果你不遵守這些慣例,人們將無法閱讀你的代碼。

經過漫長的思考,我認識到empid大概是employeeID。這些類型的縮寫也違反了樣式約定,因爲它們使代碼難以閱讀,除非在特殊情況下使用完整的單詞(例如HTML,因爲縮略詞比HyperTextMarkupLanguage更爲出名)。這也意味着test實際上是EmployeeDetails。在這種情況下,它不是地址,也不應該擴展地址,但它應該封裝(包含)一個地址。

+0

我已經在問題中將'class test'重命名爲'class EmployeeAddress'。 – Yeo

+0

只是爲了分享,當你不擴展'地址'時,這是一個很好的替代解決方案。而事實上,這正是我們所知的**組合模式** – Yeo

相關問題