Why Interface methods cannot be “static” & “final”?
在Java接口中,我们只能有最终的变量。我们还可以在接口中创建静态变量。但是,同时我们不能创建静态/最终方法,因为接口只用于静态方法。
在接口中不允许静态/最终方法的确切原因是什么?
无法重写最终方法。如果您不能实际实现方法,那么这就违背了拥有接口的目的。
对于静态部分,请参见此问题。
你搞错了。
所有变量在接口中都是隐式的公共静态变量和最终变量。
在Java 8之前,您不能在接口中创建静态方法。所有方法都是实例方法。
因为接口的唯一目标是让类实现它们,并且由于接口中的方法不能有任何实现,所以使它们成为最终的没有意义:它们将没有实现,并且不能被重写。
接口是为实例定义的,而不是静态的。
"最终"是指"不能重写"。这对于接口来说毫无意义。
我还有一点要证明为什么接口方法不能是静态的:
1 2 3 | interface MyInterface { static void myStaticMethod(); } |
现在让我们有两个类来实现"myinterface"
/头等舱
1 2 3 4 5 | class MyClass1 implements MyInterface { static void myStaticMethod(){ // some implementation } } |
/二等舱
1 2 3 4 5 | class MyClass2 implements MyInterface { static void myStaticMethod(){ // some implementation } } |
现在我正在进行如下实例化:
1-myInterface myObj1=新myClass1();2-myobj1.mystaticMethod();
3-myInterface myObj2=新myClass2();4-myobj2.mystaticMethod();
//在第2行&4处,使用类名(因为mystaticmethod定义为static)调用mystaticmethod是错误的,如下所示:
myInterface.myStaticMethod();-->,但在本例中,如何通过myClass1和myClass2类调用myStaticMethod()的不同实现。
证明了静态方法在接口方法声明中是不可能实现的。
最后,很明显,它将与覆盖功能相反。
因为它们存在于要由某个类实现的接口中。一个在任何地方都不能实现的方法有什么意义呢?(这是决赛的建议)
1:我们不能声明一个final方法,因为它与它的规则相矛盾,因为final方法不能被重写,但总是需要定义IT实现类中的所有接口方法。
2:我们不能声明一个静态方法,因为它违背了它的规则,因为静态方法总是需要方法体,但是我们不能在接口中定义任何方法。
在Java 8和默认方法的上下文中,这个问题具有新的意义。现在允许使用
1 | Why Interface methods cannot be"static" &"final"? |
接口中的所有方法都是显式抽象的,因此不能将它们定义为静态方法或最终方法,因为静态方法或最终方法不能是抽象的。
接口是纯抽象类。因此,接口中的所有方法都是
默认情况下,接口内的所有方法都是公共的和抽象的。如果首先将一个方法声明为接口内的final,则会得到一个编译器错误,即使这样也不会有任何意义,因为在子类中您永远不会处于重写它的位置。
在静态的情况下,即使Java允许使用这样的版本,在接口中使用静态不是一个好的编程实践,因为对于静态方法,U必须提供在接口中不必提供的实现。此外,即使在接口内提供了实现,仍然必须重写它,然后用类名调用它。
由于接口实例方法的方法,我们不能将接口方法声明为静态方法,也不能声明final方法,因为在实现的类中必须重写接口方法。有关说明,请检查此链接在此处输入链接说明
好吧,静态方法在类上工作,而不是实例如此奇怪/毫无意义。我说过我在某些情况下出于某种原因想要这个,虽然现在记不起一个案例,但肯定是很久以前的事了。
不过,您可以"解决"这个问题(而不是其他的API设计),因为接口允许您声明类,所以类似这样:
1 2 3 4 5 6 | interface MyInterface { static class Helpers { static void myStaticMethod(); //can be abstract etc as usual } } |
当然,您可以将该类等子类划分为普通类,也可以将其抽象化、抽象方法等。