忽略默认构造函数并在Java中使用带参数的构造函数

时间:2013-05-22 21:41:54

标签: 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;
    }

}

然后我有一个名为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);

我在这里做错了什么?

1 个答案:

答案 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;
    }