【问题标题】:Inheritance and private variables继承和私有变量
【发布时间】:2014-04-06 13:45:24
【问题描述】:

在 HourlyEmployee 和 SalariedEmployee 子类中,我们调用 super() 将“名称”传递给基类构造函数。我有两个问题:

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

【问题讨论】:

  • 您没有通过 super(name) 传递任何内容。你应该通过 super(aName)。

标签: java inheritance extend


【解决方案1】:
  1. 变量名从何而来,这是aName变量的错字吗?

    是的,这是一个错字。应该是aName,否则无法编译。

  2. 在这些子类中调用setSalary() 是如何工作的?

    当扩展一个类时,子类继承了超类的所有功能。这就是为什么SalariedEmployeeHourlyEmployee 类可以访问 setSalary() 方法:它们都继承了Employee 类的功能。

    您应该注意,子类不直接访问salary 字段,而是通过setSalary()getSalary() 方法。这称为封装,用于限制对类成员的直接访问。

【讨论】:

  • 那么 getSalary() 是否能够访问被继承但通常无法访问的私有变量?继承的getSalary()返回salary变量,这样可以吗?
  • getSalary() 能够访问私有成员,因为它是在同一个类中定义的。是的,getSalary() 即使在子类中也会返回salary 成员的值。 :)
【解决方案2】:
  1. public Employee(String aName) 是公开的,所以你可以从扩展类中调用它
  2. 私有字段和方法继承自扩展类,但不能从中访问。如果您使用调试器,您可以看到私有字段是继承类的一部分,但您没有可见性。

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 2012-12-03
    • 2015-09-14
    • 2016-09-20
    • 2014-10-28
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多