2014-03-04 226 views
4

在HourlyEmployee和SalariedEmployee子類中,我們調用super()將「name」傳遞給基類構造函數。我有兩個問題:繼承和私有變量

  1. 變量名稱來自哪裏,這是aName變量的拼寫錯誤嗎?

  2. 調用setSalary()如何在這些子類中工作?

是否延長Employee類爲我們提供了setSalary()方法的副本,但隨後的方法中有aSalary=salary;,其中工資是不能繼承的,因爲它是私人或不繼承乾脆讓我們用setSalary()方法從基這就是爲什麼使用super()來傳遞名稱的原因。

public class Employee { 
    private String name; 
    private double salary; 

    public Employee(String aName) { 
    name = aName; 
    } 

    public void setSalary(double aSalary) { 
    salary = aSalary; 
    } 

    public String getName() { 
    return name; 
    } 

    public double getSalary() { 
    return salary; 
    } 

    public double getWeeklySalary() { 
    return salary/52; 
    } 
} 

public class HourlyEmployee extends Employee { 
    public HourlyEmployee(String aName, double anHourlySalary) { 
     super(name); 
     setSalary(anHourlySalary*40*52); 
    } 
} 

public class SalariedEmployee extends Employee { 
    public SalariedEmployee(String aName, double anAnnualSalary) { 
     super(name); 
     setSalary(anAnnualSalary); 
    } 
} 
+0

你沒有通過任何超級(名稱)。你應該通過超級(aName)。 – solvator

回答

6
  1. 哪裏變量名從何而來,這是一個錯字的aName變量?

    是的,這是一個錯字。應該是aName,否則不會編譯。

  2. 調用setSalary()如何在這些子類中工作?

    當擴展一個類時,子類將繼承超類中的所有功能。這就是爲什麼SalariedEmployeeHourlyEmployee類具有訪問setSalary()方法:它們都繼承Employee類的功能。

    您應該注意,子類不直接訪問salary字段,而是通過setSalary()getSalary()方法訪問。這稱爲封裝它用於限制直接訪問類成員。

+0

所以getSalary()能夠訪問被繼承但不能正常訪問的私有變量?繼承的getSalary()返回薪水變量,這沒關係? – user2644819

+0

'getSalary()'能夠訪問私有成員,因爲它是在同一個類中定義的。是的,'getSalary()'即使在子類中也會返回'salary'成員的值。 :) –

1
  1. 政府僱員(字符串aName)是公開的,所以你可以從繼承類
  2. 私有字段和方法,從擴展的類都繼承調用它,但他們沒有從中入店。如果你使用調試器,你可以看到私有字段是繼承類的一部分,但你沒有可見性。