2011-09-04 140 views
0

在创建一个Java程序,我遇到一个问题,的Java:继承类构造函数调用超级

子类构造函数调用父类的方法

代码抛出Error与此类似:

class Manage 
{ 
    public static void main(String[] args) 
    { 
     Manager m1 = new Manager (35); 
    } 
} 

class Employee 
{ 
     int emp_id; 
     public Employee(int id) 
     { 
       this.emp_id = id; 
     } 
     public int get_id() 
     { 
       return emp_id; 
     } 

} 
class Manager extends Employee 
{ 
     public Manager(int id) 
     { 
       this.emp_id = id ; 
     } 
} 

class Engineer extends Employee 
{ 
     public Engineer(int id) 
     { 
       this.emp_id = id ; 
     } 
} 

和错误是这样的:

$ javac app.java 
app.java:25: cannot find symbol 
symbol : constructor Employee() 
location: class Employee 
     { 
     ^
app.java:33: cannot find symbol 
symbol : constructor Employee() 
location: class Employee 
     { 
     ^
2 errors 

为什么会发生这种情况?

回答

8

超类没有默认的构造函数。所以,你需要适当的构造函数参数传递给超:

super(id); 

(将这个作为ManagerEngineer构造都顶行。)您也应该删除this.emp_id = id线,在这两种情况下。

一般来说,如果你的构造不以super(...)this(...)语句启动(和你只能有其中的一个,不是两个),那么它默认使用super()(不带参数)。

3

由于您已经指定了带参数的构造函数,因此Java不提供没有参数的默认构造函数。您应该自己创建一个,或者通过使用super(id)作为扩展类构造函数的第一行来显式调用您创建的构造函数。

1

产生的错误,因为你没有在员工

class Employee { 

    private int emp_id; 

    public Employee() { 
    } 

    public Employee(int id) { 
      this.emp_id = id; 
    } 

    public int get_id() { 
      return emp_id; 
    } 

} 

定义默认构造函数(没有参数),但也有几点考虑:您是通过构造函数设置emp_id和定义的吸气剂读取它。看来这个领域本来就是私人的。否则,您可以直接访问。

你已经在Employee中有一个构造函数了,这个ID不需要在同一个类中定义相同的构造函数。只需使用超类的构造函数即可。

class Manager extends Employee { 

    public Manager(int id) { 
     super(id); // calls the superclass constructor 
    } 

} 

在这种情况下,您不需要默认构造函数。

1

在java中,子类构造函数总是调用其父类的构造函数之一。这对于课程正确初始化是必要的。即使它是子类,字段和状态也必须设置,这是如何在java中完成的。如果没有明确指定,它将调用默认的无参数构造函数。