【问题标题】:Abstract class constructor initialization抽象类构造函数初始化
【发布时间】:2013-12-30 22:03:46
【问题描述】:

我在找简单的抽象例子如下,

public abstract class Employee {
    private String name;
    private String address;
    private int number;

    public Employee(String name, String address, int number) {
        System.out.println("Constructing an Employee");
        this.name = name;
        this.address = address;
        this.number = number;
    }
}

public class Salary extends Employee {
    private double salary; //Annual salary

    public Salary(String name, String address, int number, double salary) {
        super(name, address, number);
        setSalary(salary);
    }
}

public class AbstractDemo {
    public static void main(String[] args) {
        Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
        Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
    }
}

这里我有一个抽象的基类和具体的子类。 抽象类在构造函数中有 3 个参数,子类有四个,但是当我在 main 方法中初始化抽象类和具体类时,两个构造函数都传递了 4 个参数并使用setSalary() 方法我能够计算 s 和 e 的薪水,即使 Employee 抽象类只需要 3 个参数。

这是怎么回事?有人可以帮我吗?

【问题讨论】:

  • 我又看了一遍你的问题,发现你的问题不清楚。
  • 我在询问下面答案中提到的构造函数初始化

标签: java class oop inheritance abstract-class


【解决方案1】:

我不确定我是否理解您所说的 computesalary()(不在您的示例代码中),但我怀疑混淆可能与这一行有关:

Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

请注意,即使您将引用分配给Employee 类型的变量,您仍然在创建Salary 对象。因此,您仍然调用Salary 派生类的构造函数,它有 4 个参数。这行代码与上面的代码行完全相同,并执行完全相同的代码路径。唯一的区别是对新创建对象的引用存储在具有基类类型的变量中。

正如 Thomas 指出的那样,this 将调用基类 3 参数构造函数:

Employee e = new Employee("John Adams", "Boston, MA", 2);

但这不是有效的代码,因为Employee 是抽象的。

【讨论】:

  • 是的,我没有粘贴整个代码我对我在问题标题中提到的抽象类构造函数感到困惑。
  • ...关键是你不在这里做= new Employee(因为Employee是抽象的,所以你无论如何都不能这样做),但是= new Salary后一个需要 4 个参数。
  • 我明白了。您的 main 函数没有直接调用抽象类构造函数。只能由派生类的构造函数调用。分配给新对象的变量类型对代码的运行方式没有影响。
  • @Thomas 那么如果我们必须使用子类构造,那么在这种情况下拥有抽象类有什么意义呢?我们不能只使用薪水类来制作整个逻辑吗? (我正在关注一个教程,这段代码不是我写的)
  • @JavaStudent 你可以在一堂课上完成所有这些,是的。拥有(抽象)基类的好处很多,并且在其他地方得到了很好的介绍。它是面向对象设计的核心。
【解决方案2】:

在这两种情况下,您都在创建 Salary 类的实例,因此被调用的构造函数来自 Salary 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多