簡體   English   中英

如何將父對象作為參數傳遞給子類的構造函數

[英]how to pass parent object as parameter to a constructor of child class

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

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 ; }
     */
}

這里有很多問題,其中最關鍵的是Belerafon正確指出的 ,缺少父類構造函數(要么在父類中創建無參數構造函數,要么將現有的一個構造函數稱為super(street, pin,city),可能您想調用super(street,pin,city)構造函數。

缺少默認構造函數,或調用適當的構造函數

test(sic)類一個地址,因為它擴展了Address。 因此,它必須滿足地址合同; 即您可以像使用地址一樣使用它。 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 ,也可以包含小貓形式​​的貓。

很可能您根本不想擴展地址,或者您想要停止將Address傳遞給構造函數(取決於class 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 在這種情況下,它不是地址,也不應該擴展地址,但是應該封裝(包含)地址。

您的代碼的問題是Address類沒有定義默認構造函數。 EmployeeAddress構造函數中,由於Address是父類,因此Java嘗試調用Address的無參數構造函數。 但這不能,因為地址中沒有沒有perameter的構造函數。 加一個就可以解決問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM