class 的构造函数有问题

Something is wrong in a constructor of a class

这个程序要求用户输入两次姓名和就业编号,而它只需要一次。

我正在尝试使用继承给名为 Nursing 的 class 的 name 和 employmentId 实例变量打印一个句子。这个方案运行不错。但是,问题是它需要用户输入两次 name 和 employmentId。

AbstractTest.java -

import java.util.*;

class AbstractTest {
    String name;
    int employmentId;

    AbstractTest (){
        //initialize name and employmentId instance variables
        System.out.println("enter name");
        Scanner readString = new Scanner(System.in);
        this.name = readString.nextLine();

        System.out.println("enter ID");
        Scanner readInt = new Scanner(System.in);
        this.employmentId = readInt.nextInt();
    }
    // constructor ends
}

Nursing.java -

class Nursing extends AbstractTest{
    void display() {
        System.out.println("the employment detail: " + "Name: " + 
        name + "ID: " + employmentId);
    }
}

Main.java -

class Main {
    public static void main(String[] args) {
        AbstractTest abstractTest = new AbstractTest();
        Nursing nursing = new Nursing();
        nursing.display();
    }
}

//运行良好,但输入名称和ID不知何故重复了两次。它应该只需要一次(下面是 MS DOS 的结果)。

输入姓名 蝙蝠侠

输入ID 1234

输入姓名 超人

输入ID 5678

就业详情:姓名:超人ID:5678

删除行

AbstractTest abstractTest = new AbstractTest();

虽然您没有使用该对象,但它正在创建并且 Scanner 正在请求 2 个输入。

Nursing nursing = new Nursing();

就足够了:它将调用其父级的构造函数,即 AbstractTest.

之一

这一行

Nursing nursing = new Nursing();

自动调用超class的构造函数,即AbstractTest()。您不必通过创建 AbstractTest

的对象来显式调用它

因此,只需删除行

AbstractTest abstractTest = new AbstractTest();

如果你不删除它,构造函数是运行两次,因此你也必须给出两次输入。

当您创建一个 Nursing 对象时,它隐式空构造调用 super 无参数构造函数。因此 AbstractTest 构造函数被调用两次 - 一次是在创建其对象时,另一次是在创建 Nursing 对象时。

使用继承创建对象有点复杂,我建议您阅读它。