Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类中允许构造函数,但接口中不允许构造函数_Java_Constructor_Interface_Abstract Class_Concreteclass - Fatal编程技术网

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

Java 抽象类中允许构造函数,但接口中不允许构造函数,java,constructor,interface,abstract-class,concreteclass,Java,Constructor,Interface,Abstract Class,Concreteclass,如果我错了,请纠正我 以上标题使我接近以下结论: 1) 构造函数是,除此之外没有其他内容,而是一个具体的方法,具有类名,没有返回类型,甚至没有void 2) 而且,抽象类既可以有具体方法,也可以有抽象方法;所以在抽象类中有一个构造函数就像有一个具体的方法一样。这很好,直到没有尝试在该抽象类中调用构造函数为止 至于调用,我们需要创建和对象,这是一个实例化的概念,与抽象类的协议相反。不过,在将抽象类扩展为具体类并创建具体类的对象后,可以调用此构造函数 3) 接口不能有构造函数,因为它纯粹是抽象的它不

如果我错了,请纠正我

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

1) 构造函数是,除此之外没有其他内容,而是一个具体的方法,具有类名,没有返回类型,甚至没有void

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

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


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
    }
}