有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我在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类中的第一个construct方法会提示用户输入他们的名称,但假设我已经知道用户名并将其存储在一些变量中,那么如何在不调用第一个默认构造函数的情况下创建新的Student()对象(实际上是Name()对象),并将其作为默认构造函数调用:

Student student1 = new Student(firstName, lastName);

我理解为什么下面这行会调用默认的构造方法:

Student student1 = new Student();

但下一行stil调用相同的无参数构造方法,即使我使用的是参数:

Student student1 = new Student(firstName, lastName);

我做错了什么


共 (1) 个答案

  1. # 1 楼答案

    第一:在构造函数中使用扫描仪从外部世界获取输入是一个糟糕的想法

    第二: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;
        }