2014-03-04 52 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. 私有字段和方法,从扩展的类都继承调用它,但他们没有从中入店。如果你使用调试器,你可以看到私有字段是继承类的一部分,但你没有可见性。