Java 抽象类中允许构造函数,但接口中不允许构造函数
如果我错了,请纠正我 以上标题使我接近以下结论: 1) 构造函数是,除此之外没有其他内容,而是一个具体的方法,具有类名,没有返回类型,甚至没有void 2) 而且,抽象类既可以有具体方法,也可以有抽象方法;所以在抽象类中有一个构造函数就像有一个具体的方法一样。这很好,直到没有尝试在该抽象类中调用构造函数为止 至于调用,我们需要创建和对象,这是一个实例化的概念,与抽象类的协议相反。不过,在将抽象类扩展为具体类并创建具体类的对象后,可以调用此构造函数Java 抽象类中允许构造函数,但接口中不允许构造函数,java,constructor,interface,abstract-class,concreteclass,Java,Constructor,Interface,Abstract Class,Concreteclass,如果我错了,请纠正我 以上标题使我接近以下结论: 1) 构造函数是,除此之外没有其他内容,而是一个具体的方法,具有类名,没有返回类型,甚至没有void 2) 而且,抽象类既可以有具体方法,也可以有抽象方法;所以在抽象类中有一个构造函数就像有一个具体的方法一样。这很好,直到没有尝试在该抽象类中调用构造函数为止 至于调用,我们需要创建和对象,这是一个实例化的概念,与抽象类的协议相反。不过,在将抽象类扩展为具体类并创建具体类的对象后,可以调用此构造函数 3) 接口不能有构造函数,因为它纯粹是抽象的它不
3) 接口不能有构造函数,因为它纯粹是抽象的它不支持具体的方法。因此,即使是构造函数也不行。如果您问为什么抽象类或接口类可以(不能)有构造函数,那么可能会有帮助:)然后。第一点 它是一种在创建对象时自动调用的方法。把它当作一个对象构造的侦听器。 第二点 子类必须在第一条语句中调用父构造函数。构造函数是对象的初始值设定项。正如我所说,它可以被视为对象构造侦听器 参数 构造函数接受的参数取决于调用方如何构造对象,对于抽象类参数,子类如何使用
super(…)
转发参数实际上是子类的类定义的一部分,取决于它如何扩展超类。这也解释了为什么super()如果超类构造函数不接受参数,则不需要代码>
第三点
抽象类是类。
抽象类也是类;不要歧视他们。类是包含类字段和类方法的东西;这是类的最基本定义,因此类的实例称为对象。抽象类满足这一点;只是它的一些方法不是实际的方法,但从调用方的角度来看,它们仍然是方法。例如,调用方在调用某个方法时不需要知道该方法是否是抽象的
C++比较
如果我们看C++,(它是java类的源/灵感/模型/任何东西),我们会发现类方法不一定有实现(虽然如果没有,会有错误,忘记运行时或编译时间),但只有原型。java <代码>抽象< /C>方法类似C++的方法,没有原型。
(我对C++没有经验,所以这部分可能不准确)
这表明,abstract
在抽象类中的含义仅意味着它(i)不能被实例化,并且(ii)可以包含抽象方法。超类中的抽象方法意味着该方法应该存在,但子类必须自己实现;由于抽象类不能被实例化,所以有一个安全的代码:<代码>抽象>代码(或者如果它激怒了你,就把它看作是空的/<代码>返回null < /Cult>方法)。< /P>
接口呢?
另一方面,Java接口基本上定义了实现类中预期存在的方法列表,但接口本身实际上不是一个类
为什么没有构造函数方法?
你为什么要这样?您不能从接口的名称实例化对象
如果您正在考虑限制构造函数中的参数,例如registerSubclass(类),请注意,在Java 8中,接口可以有具体的“默认”方法。因此,您在这里给出的信息是一个问题?或者您想问一个问题“为什么会发生这种情况…”?接口没有任何要初始化的实例变量。@blade,如果我的结论正确的话correct@Gaël,请你再简单一点好吗!看到了,在发布这篇文章之前。没有什么帮助。但是,令人满意
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
}
}