2014-02-13 3 views
0

Я создал суперкласс под названием Employee с подклассом ProductionWorker и драйвером под названием ProductionWorkerDriver. Программа принимает мою введенную информацию и возвращает значения String из класса Employee, но не значения double и int из класса ProductionWorker. Программа, которую я использую, говорит, что мне нужно было инициализировать значения из них как 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 

ответ

3

Вы ничего не делаете с данными, которые вы указали:

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); 

Обратите внимание, как в каждом конкретном случае мы не объявляем переменную, пока не понадобится.

Обратите внимание, что тот факт, что ваш номер сотрудника и ваша дата аренды оба String значения это немного беспокойства, и это плохая идея использовать double для валютных ценностей - войти в привычку использовать BigDecimal, или используйте целое число, представляющее число центов/пенни/что угодно.

+0

Перемещение рабочего рабочего рабочего = новое ... вниз, ниже, как показалось, работает println. Кроме того, типы данных для всех переменных были заданы в учебнике, который я использую. Спасибо за помощь! – user2970463

+0

@ user2970463: В этом случае вы должны немного беспокоиться о своем учебнике - если только он не упоминает, что это просто для простоты, для начала. –

2

Это:

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

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

обновит shift и payRate вашего основного метода:

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

Поскольку вы выводите значения из ProductionWorker, и эти ценности никогда обновляется, он всегда будет выводить 0. Просто потому, что вы инициализируете ProductionWorker с этими переменными, это не значит, что t ссылка shift в основном методе будет указывать на то же место в памяти, что и ссылка shift внутри ProductionWorker.

+1

В основном методе нет 'this.shift' - это локальные переменные в статическом методе. 'this' относится только к методу * instance *, а' this.shift' будет переменной * экземпляра * в этом случае. Неправильная терминология только путает вещи дальше. –

+0

Вы правы, конечно. Я предположил, что они были объявлены в классе, а не методом, когда я впервые написал его, и не смог его обновить. Обновлено. –

Смежные вопросы