如果我错了,请纠正我
以上标题让我接近以下结论:
1)构造函数,没有别的,但是具体的方法,具有类名,没有返回类型,甚至无效。
2)而且,抽象类可以同时具有具体和抽象的方法;所以在抽象类中有一个构造函数就像有一个具体的方法。这很好,直到没有尝试在该抽象类中调用构造函数。
因为,对于调用,我们需要创建和对象,这是一个实例化的概念,它违反了抽象类的协议。但是,在将此抽象类扩展为具体类并创建具体类的对象之后,可以调用此构造函数。
3)接口不能有构造函数,因为它纯粹是抽象的。 它不支持具体方法。而且,因此甚至不是构造函数
答案 0 :(得分:2)
这是一个在创建对象时自动调用的方法。将其视为对象构造的侦听器。
子类必须在第一个语句中调用父构造函数。构造函数是对象的初始值设定项。正如我所说,它可以被视为对象构造监听器。
构造函数接受的参数取决于调用者如何构造对象,对于抽象类参数,子类如何使用super(...)
转发params实际上是上子类的类定义的一部分它如何扩展超类。这也解释了如果超类构造函数不接受参数,为什么super();
不是必需的。
抽象类也是类;不要歧视他们。类是包含类字段和类方法的东西;这是类的基本定义,因此类的实例称为 objects 。抽象类满足了这一点;只是它的一些方法不是实际的方法,但它们仍然是来自调用者的方法。例如,调用者在调用方法时不需要知道方法是否是抽象的。
如果我们看一下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)