java - 继承和私有(private)变量

标签 java inheritance extend

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

  1. 变量名从何而来,这是 aName 变量的拼写错误吗?

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

扩展 Employee 类是否为我们提供了 setSalary() 方法的副本,但在该方法内部有 aSalary=salary;,其中薪水不会被继承,因为它是私有(private)的或者继承只是让我们使用基类的 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);
    }
}

最佳答案

  1. 变量名称从何而来,这是 aName 变量的拼写错误吗?

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

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

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

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

关于java - 继承和私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181866/

相关文章:

java - 在 Junit 中实现 Test 而不是扩展 TestCase [Java]

javax.net.ssl.SSLHandshakeException?

Java .jar 文件的运行方式与命令行和文件资源管理器不同

java - 我可以用 Cordova 编写我的 Android 应用程序,然后用 Java 向它添加更多功能吗?

Python继承和重载问题

javascript - IE7 中的 Element.prototype?

java - Pebble/Freemarker 的变量/插值的惰性评估

c++ - 如何找出派生类的哪个方法没有实现?

c++ - 子类调用基类构造函数,然后在子类 Arduino C++ 中使用基类的实例方法

ruby - 为什么我不能在模块中扩展 Fixnum 类并使用它?