2015-02-13 2 views
0
public class ProductionWorker extends Employee 
{ 
    private int shift; 
    private double rateOfPay; 
    private double hoursWorked; 

    ProductionWorker(String name, int id, int shift, double rateOfPay, double hoursWorked) 
    { 
     super(name, id); 
     this.shift = shift; 
     this.rateOfPay = rateOfPay; 
     this.hoursWorked = hoursWorked; 
    } 



public class TeamLeader extends ProductionWorker 
{ 
    private double monthlyBonus; 

    TeamLeader(String name,int id, int shift, double rateOfPay, double hoursWorked, double monthlyBonus) 
    { 
     super(name, id , shift, rateOfPay, hoursWorked); 
     this.monthlyBonus = monthlyBonus; 

    } 

    public double calcPay() 
    { 
     double pay = 0; 
     //night shift 
     if (shift == 2) 
     { 
      pay = ((hoursWorked + hoursWorked/2) * rateOfPay) + monthlyBonus; 
     } 
     else 
     { 
      pay = (hoursWorked * rateOfPay) + monthlyBonus; 
     } 
     return pay; 
    } 
} 

Я расширить класс ProductionWorker до класса TeamLeader затем создать метод calcPay() на классе TeamLeader моей проблемы мне нужно, чтобы получить значение переменного сдвига, hoursOfWorked и rateOfPay из класса ProductionWorker, поэтому я могу использовать метод calcPay() в своей main.Can кто-нибудь мне помочь, спасибо заранее.ошибка: Частный доступ в классе

+2

Добавить getter и setter для ваших vatiables в 'ProductionWorker' и использовать это для доступа к переменным. – Jens

+1

Знаете ли вы, что означает 'private', или вы использовали его, потому что кто-то сказал вам? – immibis

ответ

0

Чтобы получить доступ к переменным родительского класса (ProductionWorker), вам необходимо изменить область переменных с частного на защищенный.

Частные переменные видны только внутри класса. Защищенные переменные видны в подклассах и для всех классов внутри пакета

Вы можете обратиться по этой ссылке: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html.

Если вы не хотите устанавливать их как защищенные, вы также можете создавать геттеры и сеттеры для переменных, но это не самый предпочтительный способ.

например, из геттер и сеттер:

private int shift; 

protected int getShift() { 
    return this.shift; 
} 

protected void setShift(int shift) { 
    this.shift = shift; 
} 
0

Поскольку ваши поля являются частными, что означает, что если вы не создать метод, который возвращает особое значение, которое вы ищете, когда объект экземпляра, ни один из ваших других классов или их методы смогут получить доступ к этим данным, следовательно, они являются частными.

Что вам нужно сделать, это создать «геттер» методы в вашем ProductionWorker классе, что позволит вам сказать что-то подобное в вашем TeamLeader классе:

shift = ProductionWorker.getShift(); 

Такого рода методы специально разработаны таким образом, что если вам нужно посмотреть поля объекта из другого класса, вы можете просто создать объект и использовать его метод для возврата значения. Вот то, что эти методы должны выглядеть следующим образом:

public int getShift() 
{ 
    return shift; 
} 

public double getHoursWorked() 
{ 
    return hoursWorked; 
} 

public double getRateOfPay() 
{ 
    return rateOfPay; 
} 

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

UPDATE
Ниже приведен пример кода, который может работать для вашего дела:

public class ProductionWorker extends Employee 
{ 
    private int shift; 
    private double rateOfPay; 
    private double hoursWorked; 

    ProductionWorker(String name, int id, int shift, double rateOfPay, double hoursWorked) 
    { 
     super(name, id); 
     this.shift = shift; 
     this.rateOfPay = rateOfPay; 
     this.hoursWorked = hoursWorked; 
    } 

    // Now we can add the "getters" 
    public int getShift() 
    { 
     return shift; 
    } 

    public double getHoursWorked() 
    { 
     return hoursWorked; 
    } 

    public double getRateOfPay() 
    { 
     return rateOfPay; 
    } 



public class TeamLeader extends ProductionWorker 
{ 
    ProductionWorker prodWorker = new ProductionWorker(Jared, 10046, 2, 8.50, 12.6); // Creates a production worker you can reference 

    private int shift = prodWorker.getShift(); 
    private double rateOfPay = prodWorker.getRateOfPay(); 
    private double hoursWorked = prodWorker.getRateOfPay(); 
    // These three statements demonstrate the getters and how they can be implemented 

    private double monthlyBonus; 


    TeamLeader(String name,int id, int shift, double rateOfPay, double hoursWorked, double monthlyBonus) 
    { 
     super(name, id , shift, rateOfPay, hoursWorked); 
     this.monthlyBonus = monthlyBonus; 

    } 

    public double calcPay() 
    { 
     double pay = 0; 
     //night shift 
     if (shift == 2) 
     { 
      pay = ((hoursWorked + hoursWorked/2) * rateOfPay) + monthlyBonus; 
     } 
     else 
     { 
      pay = (hoursWorked * rateOfPay) + monthlyBonus; 
     } 
    return pay; 
    } 
} 

Имейте в виду, что это не может быть идеальным решением для всего проекта, так как я не могу увидеть другие суперкласс, от которого вы распространяетесь, или что ваш клиент должен делать с этим кодом. Этот примерный код предназначен только для того, чтобы дать вам представление о том, как геттеры работают в классах, которые создают объекты и демонстрируют, как их можно использовать. Я определенно оставил бы геттеры, которые я задал для вас.

Также
Убедитесь, что для каждой переменной экземпляра у вас есть для объекта, вы должны иметь поглотитель для каждого из них. Вы обнаружите, что вам может понадобиться время от времени обращаться к этим данным, чтобы делать вычисления на клиенте.

+0

им жаль, но im new в java, как я могу добавить метод getter к моему workworker? –

+0

Внутри скобки, которая инкапсулирует ваш класс 'ProductionWorker', вы добавили бы их, как вы добавляете конструкторы. Я обновлю свой ответ, чтобы показать вам пример кода. – Jodo1992

+0

Я получил его, большое вам спасибо. –

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