构造函数在抽象 class 中允许,但在接口中不允许

Constructor allowed in abstract class but not in Interface

如果我错了请纠正我

以上标题使我得出以下结论:

1) 构造函数是,没有别的,而是一个具体的方法,名称为class,没有return 类型 ,甚至不是 void 。

2) 并且,抽象class可以同时具有具体方法和抽象方法;所以有一个 抽象的构造函数 class 就像有一个具体的方法 。没关系,直到不尝试在该抽象 class 中调用构造函数。

因为,为了调用,我们需要创建和object,这是一个实例化的概念,它违反了抽象协议class。虽然,可以在将此抽象 class 扩展到具体 class 并创建具体 class 的 object 之后调用此构造函数。

3) 接口不能有构造函数,因为它是纯抽象的。 不支持具体方法。并且,因此甚至没有构造函数

如果你问为什么或为什么不抽象或接口 class 可以(不能)有构造函数那么 this might help :) and then this.

第一点

创建对象时自动调用的方法。将其视为对象构造的侦听器.

第二点

Subclasses 必须在第一个语句中调用父构造函数。构造函数是对象的初始化器。正如我所说,它可以被认为是一个对象构造监听器

参数

构造函数接受的参数取决于调用者如何构造对象,对于抽象的class参数,subclass如何转发params与super(...)其实是一部分subclass 的 class 定义关于 它如何扩展 superclass。这也解释了如果 superclass 构造函数不接受参数,为什么 super(); 不是必需的。

第三点

摘要class是class。

摘要 class 也是 class;不要歧视他们。 class 是包含 class 字段class 方法 的东西;这是 class 的最基本定义,因此 class 的实例称为 对象 。摘要 class 满足;只是它的一些方法不是实际的方法,但从调用者的角度来看它们仍然是方法。例如,调用者在调用方法时不需要知道方法是否是抽象的。

C++ 比较

如果我们看一下 C++,(afaik 是 Java classes 的 source/inspiration/model/whatever)我们会发现 class 方法不一定有实现(虽然如果你不这样做,会出现错误,忘记运行时或编译时间)但只有原型。 Java abstract 方法就像没有原型的 C++ 方法。 (我对C++没有经验,所以这部分可能不准确)

这表明,抽象class中的abstract的含义仅意味着它(i)不能被实例化,(ii)可以包含抽象方法。 superclass 中的抽象方法意味着该方法应该存在,但 subclasses 必须自己实现;并且由于抽象 class 无法实例化,因此在其中包含 abstract (或者如果这激怒了您,请将其视为空/return null 方法)方法是安全的。

接口呢?

另一方面,Java 接口基本上定义了预期在实现 class 中出现的方法列表,但接口本身实际上不是 class.

为什么没有构造方法?

你为什么想要那个?您没有根据接口名称实例化对象。

如果您正在考虑限制构造函数中的参数,例如 registerSubclass(Class<? extends ThisSuperclass>) 类型的寄存器类型 API,您可能会有这样的代码:

abstract class Handler{
    public static <T> void registerHandler(Class<T extends Handler> clazz){
        Constructor<T> c = clazz.getConstructor(Event.class); // say, you have to construct subclasses to handle an event
        // a lot of try-catch trouble
    }
}

但是,到目前为止 Java 中不存在此功能,您必须自己检查构造函数(至少据我所知)。

默认方法呢?

在Java8中添加了默认方法,其中接口可以有具体方法。我不熟悉这个新功能的概念或边缘情况,但参考 Java 接口文档中的 "car" 类比,如果 interface Car 是客户对你需要的东西的需求生产以便他们购买您的汽车,接口中的默认方法如 "I want air conditioning in the car, but since it may be difficult for you, I give you this air conditioning system I invented; you may make another air conditioning system though".

为什么接口中没有默认构造函数?

正如我提到的,构造函数就像对象构造的监听器,所以从这个角度来看它不是一个方法,而是class结构的一部分(比如extends 子句、注释或 class 的其他修饰符)。接口定义了您需要的方法。默认方法只是一个虚拟方法,主要用于接口的向后兼容性。但是对于默认构造函数来说是非常不合理的,因为它不是这个意义上的方法。

免责声明:我从来没有从教程中正确地学习过Java,所以我的理解来自我自己 2 年多的观察,但到目前为止,这似乎正确地解释了 Java class是的。在实际编程中,只要你理解了语义,这些概念并不重要,尽管如果你理解了这些概念,理解语义会更容易。