2015-09-07 3 views
0

Я работаю над домашней работой CS и столкнулся с проблемой. В конце домашней работы возникает вопрос об использовании конструктора копирования. Цель состоит в том, чтобы «сделать один объект Payroll, создать его экземпляр, сделать второй, затем распечатать их оба. Затем, измените значения во втором объекте Payroll и покажите, что измененные значения отображаются только в одном, а не в обоих (то есть, распечатайте оригинал и копию со слегка измененными значениями). " Я попытался изменить значения во втором объекте Payroll, но также изменил его в первом. Я перечислил мой код ниже:Неверный экземпляр конструктора (Java)

import java.util.Random; 


public class Payroll { 
private int[] employeeId; 
private int[] hours; 
private double[] payRate; 

public Payroll(){ 
    this.employeeId = new int[0]; 
    this.hours = new int[0]; 
    this.payRate = new double[0]; 
} 

public Payroll(Payroll obj){ 
    this.employeeId = obj.employeeId; 
    this.hours = obj.hours; 
    this.payRate = obj.payRate; 
} 

public Payroll(int i){ 
    this.employeeId = new int[i]; 
    this.hours = new int[i]; 
    this.payRate = new double[i]; 

} 

public int getEmployeeIdAt(int index){ 
    return employeeId[index]; 
} 

public int getHoursAt(int index){ 
    return hours[index]; 
} 

public double getPayRateAt(int index){ 
    return payRate[index]; 
} 

public double getGrossPay(int index){ 
    double grossPay = hours[index] * payRate[index]; 
    grossPay = Math.round(grossPay * 100); 
    return grossPay/100; 
} 

public void setEmployeeIdAt(int index, int id){ 
    this.employeeId[index] = id; 
} 

public void setHoursAt(int index, int hrs){ 
    this.hours[index] = hrs; 
} 

public void setPayRateAt(int index, double pr){ 
    this.payRate[index] = pr; 
} 

public void setHoursAt(int i){ 
    Random rand = new Random(); 
    int randHours = rand.nextInt((50 - 15) + 1) + 15; 
    this.hours[i] = randHours; 
} 
} 

import java.util.Scanner; 


public class PayrollDriver { 

public static void main(String[] args) { 
    Payroll pr = new Payroll(5); 
    Scanner scan = new Scanner(System.in); 
    int empID = 1001; 
    for(int i = 0; i < 5; i++){ 
     pr.setEmployeeIdAt(i, empID); 
     empID++; 
    } 
    for(int i = 0; i < 5; i++){ 
     System.out.println("Enter the hourly pay rate for employee number "  + pr.getEmployeeIdAt(i) + ": "); 
     double payRate = scan.nextDouble(); 
     if(payRate < 7.50){ 
      do{ 
       System.out.println("ERROR: Enter 7.50 or greater for pay rate: "); 
       payRate = scan.nextDouble(); 
      } while(payRate < 7.50); 
     } 
     pr.setPayRateAt(i, payRate); 
     pr.setHoursAt(i); 
    } 
    System.out.println("PAYROLL DATA"); 
    System.out.println("======================"); 
    for(int i = 0; i < 5; i++){ 
     System.out.println("Employee ID: " + pr.getEmployeeIdAt(i) + "  Hours: " + pr.getHoursAt(i) + " Rate: " + pr.getPayRateAt(i) + 
       " Gross Pay: $" + pr.getGrossPay(i)); 
    } 
    System.out.println("Would you like to run the Copy Constructor Test? Enter 'y' (lowercase) if yes, enter any other letter if no: "); 
    char copyTestVerify = scan.next().charAt(0); 
    if(copyTestVerify == 'y'){ 
     CopyConstructorTest ct = new CopyConstructorTest(); 
     ct.CopyTest(); 
    } 

    scan.close(); 
} 

} 

Ниже мой CopyConstructorTest класс, который проверяет, будет ли или не конструктор копирования изменить значение исходного объекта:

public class CopyConstructorTest { 
    public void CopyTest(){ 
     Payroll pay = new Payroll(5); 
     pay.setEmployeeIdAt(0, 1001); 

     Payroll payCopy = new Payroll(pay); 
     System.out.println("Original: " + pay.getEmployeeIdAt(0)); 
     System.out.println("Copy: " + payCopy.getEmployeeIdAt(0)); 
     payCopy.setEmployeeIdAt(0, 5000); 
     System.out.println("Original after changes: " +  pay.getEmployeeIdAt(0)); 
     System.out.println("Copy after changes: " + payCopy.getEmployeeIdAt(0)); 

    } 
} 

Я не что я делаю неправильно. Любая помощь или руководство очень ценится.

+2

Вам нужно скопировать данные в массивах, а не только ссылки. – Keppil

ответ

1

Вы просто копируете ссылки на массивы, а не фактические данные. Поэтому всякий раз, когда вы меняете данные в одном из ваших объектов, изменения видны в обоих случаях, поскольку они указывают на один и тот же массив.
Самый простой способ, чтобы скопировать данные, вероятно, использует System.arraycopy():

public Payroll(Payroll obj) { 
    this.employeeId = new int[obj.employeeId.length]; 
    System.arraycopy(obj.employeeId, 0, this.employeeId, 0, obj.employeeId.length); 
    ... 
Смежные вопросы