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



如果我错了,请纠正我

上面的标题使我接近以下结论:

1(构造函数不是别的,而是一个有类名但没有返回类型的具体方法,甚至没有void。

2(并且,抽象类可以同时有具体方法和抽象方法;所以在抽象类中有一个构造函数就像有一个具体的方法一样。这很好,直到构造函数不被尝试在该抽象类中被调用。

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

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

第一点

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

第二点

子类必须在第一条语句中调用父构造函数。构造函数是对象的初始值设定项。正如我所说,它可以被视为对象构造侦听器

参数

构造

函数接受的参数取决于调用方构造对象的方式,对于抽象类参数,子类如何使用super(...)转发参数实际上是子类的类定义的一部分,它如何扩展超类。这也解释了为什么如果超类构造函数不接受参数,则不需要super();

第三点

抽象类是类。

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

C++比较

如果我们看一下C++(哪个 afaik 是 Java 类的源代码/灵感/模型/任何内容(,我们会发现类方法不一定有实现(尽管如果你没有,就会有错误,忘记运行时或编译时间(,而只有原型。Java abstract方法就像没有原型的C++方法。(我对C++没有经验,所以这部分可能不准确(

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

接口呢?

另一方面,Java 接口基本上定义了预期存在于实现类中的方法列表,但接口本身实际上不是一个类。

为什么没有构造函数方法?

你为什么还要这样?不要从接口的名称实例化对象。

如果您正在考虑限制构造函数中的参数,例如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中不存在此功能,您必须自己检查构造函数(至少据我所知(。

默认方法呢?

Java 8 中添加了默认方法,其中接口可以具有具体方法。我不熟悉这个新功能的概念或边缘情况,但参考 Java 文档中关于接口的"汽车"类比,如果interface Car客户对您需要生产什么以便他们购买您的汽车的需求,接口中的默认方法是"我想要车内的空调, 但是由于这对您来说可能很难,因此我给您我发明的空调系统;不过你可以再做一个空调系统"。

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

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

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

如果你问为什么或为什么抽象或接口类不能(不能(有一个构造函数,那么这可能会有所帮助:)然后这个。

相关内容

  • 没有找到相关文章

最新更新