我正在尝试创建一个无参数构造函数,它将从用户(通过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);
}
}
答案 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,....);
}