为什么Java的接口不能定义构造函数?
非要逼死抽象类不可!
首先你要明白构造函数的作用,构造函数就是初始化class的属性或者方法,在new的一瞬间自动调用,那么问题来了Java和PHP的接口,都不能new 那么要构造函数干嘛呢?根本就没法调用
为什么国王的 王 是三横一竖?
王
接口是定义行为的,不是定义生产方式的
你怎么实例化咧?
因为接口不会有自己的实例的,所以不需要有构造函数。
为什么接口不会有自己的实例?因为接口只是定义一系列抽象的功能,使用接口的时候都是通过实现接口的类的,不会直接去用接口。直接去用,那些函数只是个定义,没法用
当然,在Java 8里面接口定义的函数可以有默认的实现,但还是不能直接用接口去调这种函数。
接口不能实例化,如果能new出来那要接口还有什么意义?不过java8之后,接口可以有默认方法,可以直接直接调用
哎...越是简单的问题越不好回答,只能说java语言在设计的时候就把接口定义为一种类需要遵循的规范,是为了弥补单继承的不足而设计的。有本书《程序员的呐喊》,里面作者就喷了java的接口的设计,还写到:“高斯林说过,如果重写设计java语言的话,不会考虑接口这种方式”。
抽象类可以。接口不能定义方法细节,只能定义其一系列行为。
我姑且认为题主想要在接口里使用构造函数,是想在具体实现接口的class里做一些代码复用。
interface I { public I() { system.out.println("不管你怎么实现,我最牛逼"); } }
"代码复用"和"接口实现分离"是有一些冲突的,各个不同的类型就是对利弊的取舍妥协。
interface选择了最少的复用、最大的分离
一般类的复用容易,但接口不分离
抽象类介于之间。
如@MaxValue所说,如果interface可以有constructor,那就和抽象类定位差不多了。
首先你要明白构造函数的作用,构造函数就是初始化class的属性或者方法,在new的一瞬间自动调用,那么问题来了Java和PHP的接口,都不能new 那么要构造函数干嘛呢?根本就没法调用
为什么国王的
王
是三横一竖?接口是定义行为的,不是定义生产方式的
你怎么实例化咧?
因为接口不会有自己的实例的,所以不需要有构造函数。
为什么接口不会有自己的实例?因为接口只是定义一系列抽象的功能,使用接口的时候都是通过实现接口的类的,不会直接去用接口。直接去用,那些函数只是个定义,没法用
当然,在Java 8里面接口定义的函数可以有默认的实现,但还是不能直接用接口去调这种函数。
接口不能实例化,如果能new出来那要接口还有什么意义?不过java8之后,接口可以有默认方法,可以直接直接调用
哎...越是简单的问题越不好回答,只能说java语言在设计的时候就把接口定义为一种类需要遵循的规范,是为了弥补单继承的不足而设计的。有本书《程序员的呐喊》,里面作者就喷了java的接口的设计,还写到:“高斯林说过,如果重写设计java语言的话,不会考虑接口这种方式”。
抽象类可以。接口不能定义方法细节,只能定义其一系列行为。
我姑且认为题主想要在接口里使用构造函数,是想在具体实现接口的class里做一些代码复用。
"代码复用"和"接口实现分离"是有一些冲突的,各个不同的类型就是对利弊的取舍妥协。
interface选择了最少的复用、最大的分离
一般类的复用容易,但接口不分离
抽象类介于之间。
如@MaxValue所说,如果interface可以有constructor,那就和抽象类定位差不多了。