de *_*aad 2 java inheritance construct
我在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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为Student的类,它扩展了名称:
public class Student extends Name
{
public Student(String firstName, String lastName)
{
firstName = firstName;
lastName = lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,Name类中的第一个构造方法会提示用户输入其名称,但是说我已经知道用户的名称并将其存储在某些变量中,如何创建一个新的Student()对象(实际上是一个名称)( )object)没有调用第一个默认构造函数,而是调用它:
Student student1 = new Student(firstName, lastName);
Run Code Online (Sandbox Code Playgroud)
我理解为什么以下行会调用默认的构造方法:
Student student1 = new Student();
Run Code Online (Sandbox Code Playgroud)
但是下一行stil调用相同的无参数构造方法,即使我使用的是参数:
Student student1 = new Student(firstName, lastName);
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
首先:使用扫描仪从构造函数中获取外部世界的输入是一个可怕的想法.
第二:Student中的构造函数调用Name中的构造函数,该构造函数不带参数,因为没有显式调用super().如果你想避免这种情况:
public Student(String firstName, String lastName)
{
super(firstName, lastName);
}
Run Code Online (Sandbox Code Playgroud)
如果没有从子类显式调用超级构造函数,它会隐式调用不带参数的超级构造函数.
当你写作时,要更清楚
public Student(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
Run Code Online (Sandbox Code Playgroud)
你其实在做:
public Student(String firstName, String lastName)
{
super();
this.firstName = firstName;
this.lastName = lastName;
}
Run Code Online (Sandbox Code Playgroud)