2014-04-26 170 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

相关问题