Java 继承代码不返回任何值

Java 继承代码不返回任何值,java,inheritance,Java,Inheritance,我创建了一个名为Employee的超类,其中包含一个名为ProductionWorker的子类和一个名为productionworkerdrive的驱动程序。该程序获取我输入的信息并返回Employee类中的字符串值,但不返回ProductionWorker类中的double和int值。我使用的程序说我必须将这些值初始化为0,我想这就是为什么它们在编译时显示为0。但是,如果没有它,程序将无法编译,因此我不确定该怎么办 public class Employee { private Str

我创建了一个名为
Employee
的超类,其中包含一个名为
ProductionWorker
的子类和一个名为
productionworkerdrive
的驱动程序。该程序获取我输入的信息并返回Employee类中的字符串值,但不返回
ProductionWorker
类中的double和int值。我使用的程序说我必须将这些值初始化为0,我想这就是为什么它们在编译时显示为0。但是,如果没有它,程序将无法编译,因此我不确定该怎么办

public class Employee {
    private String name;
    private String employeeNumber;
    private String hireDate;

    public Employee(String n, String num, String date) {
        name = n;
        employeeNumber = num;
        hireDate = date;
    }

    public Employee() {
        name = "";
        employeeNumber = "";
        hireDate = "";
    }

    public void setName(String n) {
        name = n;
    }

    public void setEmployeeNumber(String e) {
        employeeNumber = e;
    }

    public void setHireDate(String h) {
        hireDate = h;
    }

    public String getName() {
        return name;

    }

    public String getEmployeeNumber() {
        return employeeNumber;
    }

    public String getHireDate() {
        return hireDate;
    }

    public String toString() {
        String str = "Employee Name: " + name
                + "\nEmployee #: " + employeeNumber
                + "\nHire Date: " + hireDate;

        return str;

    }
} //end of Employee class


//beginning of ProductionWorker class
import java.text.DecimalFormat;

public class ProductionWorker extends Employee {
    private int shift;
    private double payRate;
    public int DAY_SHIFT = 1;
    public int NIGHT_SHIFT = 2;

    public ProductionWorker(String n, String num, String date, int sh, double rate) {
        super(n, num, date);
        shift = sh;
        payRate = rate;

    }

    public ProductionWorker() {

    }

    public void setShift(int s) {
        shift = s;
    }

    public void setPayRate(double p) {
        payRate = p;
    }

    public int getShift() {
        return shift;
    }

    public double getPayRate() {
        return payRate;
    }

    public String toString() {
        DecimalFormat dollar = new DecimalFormat("#,##0.00");

        String str = super.toString() + "\nShift: " + shift
                + "\nPay Rate: $" + dollar.format(payRate);

        return str;
    }
}//end of ProductionWorker class


//beginning of ProductionWorkerDriver
import java.util.Scanner;

public class ProductionWorkerDriver {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);

        String name = null;
        String employeeNumber = null;
        String hireDate = null;
        int shift = 0;
        double payRate = 0;
        int DAY_SHIFT = 1;
        int NIGHT_SHIFT = 2;

        Employee info = new Employee(name, employeeNumber, hireDate);

        System.out.println("Employee Name:");
        name = keyboard.nextLine();

        System.out.println("Employee #:");
        employeeNumber = keyboard.nextLine();

        System.out.println("Hire Date:");
        hireDate = keyboard.nextLine();

        ProductionWorker info2 = new ProductionWorker(name, employeeNumber, hireDate, shift, payRate);

        System.out.println("Shift 1 or 2:");
        shift = keyboard.nextInt();

        System.out.println("Pay Rate:");
        payRate = keyboard.nextDouble();

        System.out.println(info2.toString());

    }

}//end of ProductionWorkerDriver
这:

将更新您的主要方法的
shift
payRate

public static void main(String[] args)
{
    //...
    int shift = 0;
    double payRate = 0;
由于您正在从
ProductionWorker
输出值,并且这些值从未更新,因此它将始终输出0。仅仅因为使用这些变量初始化
ProductionWorker
,并不意味着主方法中的引用
shift
将指向内存中与ProductionWorker中的引用
shift
相同的位置。

这:

将更新您的主要方法的
shift
payRate

public static void main(String[] args)
{
    //...
    int shift = 0;
    double payRate = 0;

由于您正在从
ProductionWorker
输出值,并且这些值从未更新,因此它将始终输出0。仅仅因为您使用这些变量初始化
ProductionWorker
,并不意味着主方法中的引用
shift
将指向内存中与ProductionWorker中的引用
shift
相同的位置。

您没有对输入的数据执行任何操作:

System.out.println("Shift 1 or 2:");
shift = keyboard.nextInt();

System.out.println("Pay Rate:");
payRate = keyboard.nextDouble();
。。。不再使用
shift
payRate
变量。更改这些局部变量的值不会更改先前使用相同变量创建的实例中的值

您应该拨打:

info2.setShift(shift);
info2.setPayRate(payRate);
。。。或者更好的方法是,在构建实例之前,先问完这些问题。您也没有使用
info
变量。您的整个
main
方法可以改进为:

Scanner keyboard = new Scanner(System.in);

System.out.println("Employee Name:");
String name = keyboard.nextLine();

System.out.println("Employee #:");
String employeeNumber = keyboard.nextLine();

System.out.println("Hire Date:");
String hireDate = keyboard.nextLine();

System.out.println("Shift 1 or 2:");
int shift = keyboard.nextInt();

System.out.println("Pay Rate:");
double payRate = keyboard.nextDouble();

ProductionWorker worker = 
    new ProductionWorker(name, employeeNumber, hireDate, shift, payRate);

System.out.println(worker);
请注意,在每种情况下,我们在需要变量之前都不会声明它


请注意,您的员工编号和雇用日期都是
字符串
值这一事实有点令人担忧,使用
双精度
表示货币值是个坏主意-养成使用
大十进制
的习惯,或者使用整数表示美分/便士/任何数字。

您没有对输入的数据执行任何操作:

System.out.println("Shift 1 or 2:");
shift = keyboard.nextInt();

System.out.println("Pay Rate:");
payRate = keyboard.nextDouble();
。。。不再使用
shift
payRate
变量。更改这些局部变量的值不会更改先前使用相同变量创建的实例中的值

您应该拨打:

info2.setShift(shift);
info2.setPayRate(payRate);
。。。或者更好的方法是,在构建实例之前,先问完这些问题。您也没有使用
info
变量。您的整个
main
方法可以改进为:

Scanner keyboard = new Scanner(System.in);

System.out.println("Employee Name:");
String name = keyboard.nextLine();

System.out.println("Employee #:");
String employeeNumber = keyboard.nextLine();

System.out.println("Hire Date:");
String hireDate = keyboard.nextLine();

System.out.println("Shift 1 or 2:");
int shift = keyboard.nextInt();

System.out.println("Pay Rate:");
double payRate = keyboard.nextDouble();

ProductionWorker worker = 
    new ProductionWorker(name, employeeNumber, hireDate, shift, payRate);

System.out.println(worker);
请注意,在每种情况下,我们在需要变量之前都不会声明它


请注意,您的员工编号和雇用日期都是
字符串
值这一事实有点令人担忧,使用
双精度
表示货币值是个坏主意-养成使用
大十进制
的习惯,或者使用整数表示美分/便士/任何数字。

主方法中没有
这个。shift
在静态方法中是局部变量
this
仅与实例方法相关,在这种情况下,
this.shift
将是一个实例变量。误用术语只会使事情更加混乱。当然,你是对的。当我第一次编写它的时候,我假设它们是在类中声明的,而不是在方法中声明的,但是没有更新它。更新。主方法中没有
此.shift
——它们是静态方法中的局部变量
this
仅与实例方法相关,在这种情况下,
this.shift
将是一个实例变量。误用术语只会使事情更加混乱。当然,你是对的。当我第一次编写它的时候,我假设它们是在类中声明的,而不是在方法中声明的,但是没有更新它。已更新。正在移动ProductionWorker=new。。。在印刷机的下面,它似乎起作用了。而且,所有变量的数据类型都是由我正在使用的教科书设置的。谢谢你的帮助@user2970463:在这种情况下,您应该稍微关注一下您的教科书-除非它提到这只是为了简单起见。移动ProductionWorker=new。。。在印刷机的下面,它似乎起作用了。而且,所有变量的数据类型都是由我正在使用的教科书设置的。谢谢你的帮助@user2970463:在这种情况下,你应该稍微关注一下你的课本——除非它提到这只是为了简单起见。