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

时间:2016-02-01 12:08:59

标签: java constructor interface abstract-class concreteclass

如果我错了,请纠正我

以上标题让我接近以下结论:

1)构造函数,没有别的,但是具体的方法,具有类名,没有返回类型,甚至无效。

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

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

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

2 个答案:

答案 0 :(得分:2)

第一点

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

第二点

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

参数

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

第三点

抽象类是类。

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

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类。在实际编程中,只要你理解了语义,这些概念就不重要了,尽管如果你理解这些概念就更容易理解语义。

答案 1 :(得分:-1)

如果你问为什么或为什么抽象或接口类不能(不能)拥有构造函数,那么this可能有帮助:)然后this