Java 类的构造函数中存在错误

Java 类的构造函数中存在错误,java,constructor,this,Java,Constructor,This,此程序要求用户输入两次name和employmentId,而只需输入一次 我试图使用name和employmentId实例变量打印一个句子,这些变量被继承到一个名为pathing的类中。程序运行良好。但是,问题是它需要用户输入两次name和employmentId AbstractTest.java- import java.util.*; class AbstractTest { String name; int employmentId; AbstractTest

此程序要求用户输入两次name和employmentId,而只需输入一次

我试图使用name和employmentId实例变量打印一个句子,这些变量被继承到一个名为pathing的类中。程序运行良好。但是,问题是它需要用户输入两次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
}
warning.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

雇佣详情:姓名:SupermanID:5678

删除该行

AbstractTest abstractTest = new AbstractTest();
虽然您不使用该对象,但它正在创建中,
Scanner
正在请求2个输入

Nursing nursing = new Nursing();
足够了:它将调用其父级的构造函数,该构造函数是
AbstractTest

中的一个,删除该行

AbstractTest abstractTest = new AbstractTest();
虽然您不使用该对象,但它正在创建中,
Scanner
正在请求2个输入

Nursing nursing = new Nursing();
足够了:它将调用其父级的构造函数,该构造函数是这一行的
AbstractTest

之一

Nursing nursing = new Nursing();
自动调用超类的构造函数,即
AbstractTest()
。您不必通过创建
AbstractTest

因此,只需删除该行即可

AbstractTest abstractTest = new AbstractTest();
如果您不删除它,构造函数将运行两次,因此您也必须给出两次输入

这条线

Nursing nursing = new Nursing();
自动调用超类的构造函数,即
AbstractTest()
。您不必通过创建
AbstractTest

因此,只需删除该行即可

AbstractTest abstractTest = new AbstractTest();

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

创建
对象时,它隐式空构造调用
super
no args构造函数。因此,
AbstractTest
构造函数被调用了两次——一次是在创建其对象时调用的,另一次是在创建
对象时调用的


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

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


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

您应该了解构造函数应该做什么。您也不需要每次希望读取一个值时都创建一个新的Scanner实例您正在创建两个
AbstractTest
对象(一个是扩展
AbstractTest
)并因此调用
AbstractTest
构造函数两次。可能不创建
abstractTest
变量?不应该
abstractTest
abstract
@盖伊,我认为这是一种测试,对于一个读者来说,最有可能的是,看看他是否意识到它实际上不是一个抽象类@CalebHyun是的,但是在构造函数中实例化一个扫描器是毫无意义的。通过这种方式,您可以使类仅可由在终端上执行的应用程序使用。如果您想在其他方面使用该类,例如web服务。。。祝你好运。你应该了解构造函数应该做什么。您也不需要每次希望读取一个值时都创建一个新的Scanner实例您正在创建两个
AbstractTest
对象(一个是扩展
AbstractTest
)并因此调用
AbstractTest
构造函数两次。可能不创建
abstractTest
变量?不应该
abstractTest
abstract
@盖伊,我认为这是一种测试,对于一个读者来说,最有可能的是,看看他是否意识到它实际上不是一个抽象类@CalebHyun是的,但是在构造函数中实例化一个扫描器是毫无意义的。通过这种方式,您可以使类仅可由在终端上执行的应用程序使用。如果您想在其他方面使用该类,例如web服务。。。祝你好运。我总是忘记
super()
隐藏在类的第一行中。谢谢你Prashant。没问题Caleb,继续编码:)我总是忘记
super()
隐藏在类的第一行。谢谢你Prashant。没问题Caleb,继续编码:)