【问题标题】:Since an abstract class can have a public constructor, why can't we instantiate it?既然抽象类可以有公共构造函数,为什么不能实例化呢?
【发布时间】:2020-11-15 15:35:54
【问题描述】:

我知道单例类不能被实例化,因为它有一个私有构造函数。我会假设抽象类也是如此,但它可以包含一个公共构造函数,那么为什么我们不能实例化一个抽象类呢?

【问题讨论】:

  • 这与构造函数无关。抽象类不能被实例化,因为它们是抽象的......也许更好的问题是“为什么抽象类可以有构造函数?”,答案是here
  • 但我想了解是什么属性使抽象类无法实例化,我知道单例是因为它们的构造函数是私有的
  • 这是“根据定义”。 The spec says so, thus it is so.
  • 可能需要一些时间阅读tutorial

标签: java constructor singleton abstract-class instantiation


【解决方案1】:

我构建了一个小例子来回答 2 个问题

1。为什么在抽象类中可能需要一个公共构造函数?

假设你有一个抽象类Animal,它被DogMonkey类继承(我们可以像这样添加很多子类)

abstract class Animal {
    int legs;

    public Animal(int legs) {
        this.legs = legs;
    }
}

class Dog extends Animal {
    public Dog(int legs) {
        super(legs);
    }
}
class Monkey extends Animal {
    public Monkey(int legs){
        super(legs); 
    }
}

现在,如果我们创建一个 Dog 对象并调用它的构造函数,它会反过来调用 Animal 类的构造函数并更新 int legs。如果您观察到,我们现在可以使用Animal 类的构造函数并使用它来更新N 个继承它的类的值。因此可以在抽象类中使用公共构造函数。

2。为什么我们不能实例化抽象类的对象? source

您不能创建抽象类的实例,因为它没有完整的实现。抽象类的目的是作为子类的基础。它就像一个模板,或者一个空的或部分空的结构,您应该先扩展它并在其上构建,然后才能使用它。

这里对我们的例子做一点修改

abstract class Animal {
    int legs;
    String ability;

    public Animal(int legs) {
        this.legs = legs;
    }

    abstract void showAbility();
}

class Dog extends Animal {
    public Dog(int legs) {
        super(legs);
    }
    public void showAbility() {
        System.out.println("Sniff");
    }
}
class Monkey extends Animal {
    public Monkey(int legs){
        super(legs); 
    }
    public void showAbility() {
        System.out.println("Climb");
    }
}

现在假设如果您能够创建像new Animal() 这样的对象,那么new Animal().showAbility() 是否有意义?不!因为它没有完整的实现。我相信这是不能实例化抽象类对象的一个​​很好的理由。

【讨论】:

    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多