抽象类可以有构造函数吗?

如果可以,如何使用它,用于什么目的?


当前回答

在具体类中,具体类型Fnord的构造函数声明有效地公开了两件事:

一种代码可以请求创建Fnord实例的方法 一种方法,通过这种方法,正在构造中的派生自Fnord的类型实例可以请求初始化所有基类特性。

虽然应该有一种方法可以分别控制这两种能力,但对于每一种具体类型,都有一个定义可以同时实现这两种能力。尽管第一个能力对抽象类没有意义,但第二个能力对抽象类和其他类一样有意义,因此它的声明是必要和有用的。

其他回答

在具体类中,具体类型Fnord的构造函数声明有效地公开了两件事:

一种代码可以请求创建Fnord实例的方法 一种方法,通过这种方法,正在构造中的派生自Fnord的类型实例可以请求初始化所有基类特性。

虽然应该有一种方法可以分别控制这两种能力,但对于每一种具体类型,都有一个定义可以同时实现这两种能力。尽管第一个能力对抽象类没有意义,但第二个能力对抽象类和其他类一样有意义,因此它的声明是必要和有用的。

是的。当创建继承类的实例时,调用抽象类的构造函数。例如,下面是一个有效的Java程序。

// An abstract class with constructor
abstract class Base {
Base() { System.out.println("Base Constructor Called"); }
abstract void fun();
    }
class Derived extends Base {
Derived() { System.out.println("Derived Constructor Called"); }
void fun() { System.out.println("Derived fun() called"); }
    }

class Main {
public static void main(String args[]) { 
   Derived d = new Derived();
    }

}

这是上面代码的输出,

基本构造函数Called 派生构造函数调用

引用: 在这里输入链接描述

如果你处于以下情况之一,你可以在抽象类中定义构造函数:

你想要表演一些 属性的字段的初始化 抽象类)之前 一个子类的实例化 发生 属性中定义了最终字段 抽象类,但你没有 在声明中初始化它们 本身;在这种情况下,你必须 初始化这些函数的构造函数 字段

注意:

您可以定义多个 构造函数(使用不同的 参数) 你可以(应该?)定义你所有的 构造函数受保护(使它们 反正公开是没有意义的) 你的子类构造函数可以 调用摘要的一个构造函数 类;它甚至可能不得不调用它 (如果没有无参数构造函数 在抽象类中)

在任何情况下,不要忘记如果你没有定义构造函数,那么编译器将自动为你生成一个构造函数(这个构造函数是公共的,没有参数,什么也不做)。

package Test1;

public class AbstractClassConstructor {

    public AbstractClassConstructor() {
        
    }

    public static void main(String args[]) {
       Demo obj = new Test("Test of code has started");
       obj.test1();
    }
}

abstract class Demo{
    protected final String demoValue;
       
    public Demo(String testName){
        this.demoValue = testName;
    }
       
    public abstract boolean test1();
}

class Test extends Demo{
       
    public Test(String name){
        super(name);
    }

    @Override
    public boolean test1() {
       System.out.println( this.demoValue + " Demo test started");
       return true;
    }
   
}

抽象类可以有构造函数,但它不能被实例化。但抽象类中定义的构造函数可用于该抽象类的具体类的实例化。检查JLS组合:

如果试图使用类实例创建创建抽象类的实例,则会出现编译时错误 表达式。 抽象类的子类本身可能不是抽象的 对象的构造函数的执行 抽象类,因此,字段初始化式的执行 对于该类的实例变量。