抽象类不能实例化但可以有构造函数 - 很少混淆,请解释

时间:2010-08-03 07:34:03

标签: java oop

  

可能重复:
  Why do abstract classes in Java have constructors?
  abstract class constructors?

我们知道抽象类不能被实例化,但另一方面它可以有构造函数。请解释为什么抽象类可以有一个构造函数?编译器如何处理这种情况?

4 个答案:

答案 0 :(得分:1)

抽象类的构造函数用于初始化抽象类的数据成员。它永远不会直接调用,编译器也不会允许它。它总是作为具体子类的实例化的一部分被调用。

例如,考虑一个Animal抽象类:

class Animal {
    private int lifeExpectency;
    private String name;
    private boolean domestic;

    public Animal(String name, int lifeExpectancy, boolean domestic) {
        this.lifeExpectency = lifeExpectancy;
        this.name = name;
        this.domestic = domestic;
    }

    public int getLifeExpectency() {
        return lifeExpectency;
    }

    public String getName() {
        return name;
    }

    public boolean isDomestic() {
        return domestic;
    }
}

本课程负责处理所有基本的动物属性。 它的构造函数将由子类使用,例如:

class Cat extends Animal {

    public Cat(String name) {
        super(name, 13, true);
    }

    public void groom() {

    }
}

答案 1 :(得分:0)

这可能不是最好的解释,但在这里。抽象类与接口非常相似,但也可以提供实现。从抽象类继承的类也继承已实现的函数,并且根据语言,您可以根据需要覆盖默认实现。

答案 2 :(得分:0)

假设您有抽象类A:

abstract class A {
  private int x;

  public A(int x) {
    this.x = x;
  }

  public int getX() {
    return x;
  }
}

注意,设置x的唯一方法是通过构造函数,然后它变为不可变的

现在我有B级扩展A:

class B extends A {
  private int y;

  public B(int x, int y) {
    super(x);
    this.y = y;
  }

  public int getY() {
    return y;
  }
}

现在B也可以通过使用super(x)来设置x,但它具有不可变属性y。

但是你不能调用new A(5)因为类是抽象的你需要使用B或任何其他子类。

答案 3 :(得分:-3)

抽象类可以具有可以在派生类中调用的构造函数。因此通常构造函数在抽象类中被标记为受保护。