没有arg的继承构造函数

时间:2012-08-17 03:28:08

标签: java inheritance arguments

我正在尝试创建一个无参数构造函数,它将从用户(通过Scanner类)获取所有实例变量的输入,但它继承自另一个类。

我该怎么做?

这是我做的:

 public class Manager extends Super_Employee{
     String  manager ;

     /* String GetManger  (){
         return manager ;
     }*/

     Manager (){
        Scanner manager = new Scanner(System.in);
     }

     @Override
     String Print() {
         return ("the manager is : " +manager);
     }

这是超级课程:

 public  class Super_Employee extends abstract_Employee {

     String Fname ;
     String Lname;
     String address;
     int number;
     Super_Employee(String Fname,String Lname, String address, int number)
    {
        System.out.println("Constructing an Employee");
        this.Fname = Fname ;
        this.Lname = Lname;
        this.address = address;
        this.number = number;
    }  


 @Override
    String Print (){
    return ("the employee name is : "+Fname+ " "+ Lname+ " ,the Employee address is  : "
            + address + " ,the employee Phone # : "+number);   
} 
}

4 个答案:

答案 0 :(得分:2)

你必须在你的子类中提供默认构造函数,你需要定义一个默认构造函数,它不会在超类中调用非默认构造函数。混乱?看看这个例子。

public class Foo {
    public Foo( String x ) {
    }
}

public class Bar extends Foo {
    public Bar() {
        super(); // this is called implicitly even if this line is not provided! compilation error here
    } 
}

在上面的示例中,子类construtor将调用子类的默认构造函数super(),因此您必须在超类中提供defualt construtor或以这种方式编写子类:

public class Bar extends Foo {
    public Bar() {
        super( "hadoken!" ); // now it works, since it calls a constructor that exists
    } 
}

现在,如果你没有在Foo类中提供任何构造函数,它将有一个默认构造函数(由编译器提供)。

答案 1 :(得分:2)

Super_Employee

中添加无参数构造函数
Super_Employee() { }

因为,你有

Super_Employee(String Fname,String Lname, String address, int number) {
    //...

编译器不提供默认构造函数(构造函数本身提供的无参数构造函数)。

答案 2 :(得分:2)

根据你的错误,听起来你的超级类需要3个参数,但是你正在尝试使用默认构造函数,因为你还没有这三个值的值。在这种情况下,我建议使用factory method构建您的对象。

示例:

public class Manager extends Super_Employee{

    /** Factory method, reading constructor arguments from System.in */
    public static Manager make() {
        Scanner s = new Scanner(System.in);
        new Manager(s.next(), s.next(), s.next(), s.nextInt());
    }

    public Manager(String fName, String lName, String address, int number) {
        super(fName, lName, address, number);
    }

     // . . .

使用工厂方法Manager.make()构建对象,允许您在调用超级构造函数之前从System.in读入所需的所有值,而这在{构造函数中}是不可能的。 {1}}构造函数。

答案 3 :(得分:2)

一些可能的选择:

1)使用静态构建器

public static Manager newManager() {

 .....

return new Manager(.....);

2)创建no-args超级构造函数:

Super_Employee() {
   ...
}}

3)可以使用“第二课” - 相当丑陋,我不建议

public Manager() {
  this(new MyTemp());
}

public Manager(MyTemp temp) {
  super(temp.fname, temp.lname,....);
}