我在Java方面不是很全面,这就是为什么我问这个问题可能非常愚蠢。尽管如此,我试图弄清楚如何忽略类的默认构造方法,并使用带参数的构造方法。例如,像这样:
public class Name {
String firstName, lastName;
public Name()
{
String dialog = JOptionPane.showInputDialog("First and Last name: ");
Scanner inName = new Scanner(dialog);
firstName = inName.next();
lastName = inName.nextLine();
}
public Name(String newFirst, String newLast)
{
firstName = newFirst;
lastName = newLast;
}
}
然后我有一个名为Student的类,它扩展了名称:
public class Student extends Name
{
public Student(String firstName, String lastName)
{
firstName = firstName;
lastName = lastName;
}
}
因此,Name类中的第一个构造方法提示用户输入他们的名字,但是说我已经知道用户的名字并将其存储在一些变量中,我该如何创建一个新的Student()对象(这是真的一个name()对象),不调用第一个默认构造函数,而是调用它:
Student student1 = new Student(firstName, lastName);
我理解为什么以下行会调用默认的构造方法:
Student student1 = new Student();
但下一行stil调用相同的无参数构造方法,即使我使用的是参数:
Student student1 = new Student(firstName, lastName);
我在这里做错了什么?
答案 0 :(得分:6)
首先:使用扫描程序从构造函数中获取外部世界的输入是一个糟糕的想法。
第二:Student中的构造函数调用Name中的构造函数,该构造函数不带参数,因为没有显式调用super()。如果你想避免这种情况:
public Student(String firstName, String lastName)
{
super(firstName, lastName);
}
如果你没有从子类显式调用超级构造函数,它会隐式调用不带参数的超级构造函数。
为了更清楚,当你写
public Student(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
你其实在做:
public Student(String firstName, String lastName)
{
super();
this.firstName = firstName;
this.lastName = lastName;
}