[英]how to pass class object as variable as constructor parameter in another class?
[英]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);
}
}
類名以大寫字母開頭。 對象變量名稱以小寫字母開頭。 這樣的類test
應該是Test
。 如果您不遵守這些約定,那么人們在閱讀您的代碼時將不會遇到任何麻煩。
經過一番思考,我意識到empid
可能是employeeID
。 這些縮寫也違反了樣式約定,因為它們使代碼難以閱讀,除在特殊情況下(例如HTML,因為縮寫詞比HyperTextMarkupLanguage眾所周知)外,請使用完整的單詞。 這也表明類test
實際上是EmployeeDetails
。 在這種情況下,它不是地址,也不應該擴展地址,但是應該封裝(包含)地址。
您的代碼的問題是Address類沒有定義默認構造函數。 在EmployeeAddress
構造函數中,由於Address是父類,因此Java嘗試調用Address的無參數構造函數。 但這不能,因為地址中沒有沒有perameter的構造函數。 加一個就可以解決問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.