在 Java 接口中,我们只能有 final 变量。我们还可以在接口中创建静态变量。但是,与此同时,我们无法创建静态/最终方法,因为接口仅适用于静态方法。
不允许在 Interface 中使用静态/最终方法的确切原因是什么?
final 方法不能被覆盖。如果您无法实际实现该方法,那将违背拥有接口的目的。
对于静态部分,请参阅此问题。
你理解错了。
所有变量在接口中都是隐式的公共静态和最终变量。
在 Java 8 之前,您不能在接口中创建静态方法。所有方法都是实例方法。
由于接口的唯一目标是让类实现它们,并且由于接口中的方法不能有任何实现,因此将它们设为 final 是没有意义的:它们将没有实现,也不能被覆盖。
接口是为实例定义的,而不是静态的。
“final”的意思是“不能被覆盖”。这对任何接口都没有任何意义。
final
意味着它不能被覆盖。
static
意味着它只能使用类名来调用。既然一个接口会有多个实现,那么由于接口本身不能实现方法,你怎么知道选择哪个实现呢?
我还有一点要证明为什么接口方法不能是静态的:
interface MyInterface {
static void myStaticMethod();
}
现在让我们有两个类正在实现“MyInterface”
// 第一类
class MyClass1 implements MyInterface {
static void myStaticMethod(){
// some implementation
}
}
// 第二类
class MyClass2 implements MyInterface {
static void myStaticMethod(){
// some implementation
}
}
现在我正在实例化如下:
1- MyInterface myObj1 = new MyClass1(); 2- myObj1.myStaticMethod();
3- MyInterface myObj2 = new MyClass2(); 4- myObj2.myStaticMethod();
// 在第 2 行和第 4 行,这是错误的调用,因为 myStaticMethod 应该使用类名调用(因为 myStaticMethod 被定义为静态),如下所示:
MyInterface.myStaticMethod();--> 但是在这种情况下,如何通过 MyClass1 和 MyClass2 类调用 myStaticMethod() 的不同实现。
所以证明接口方法声明中不能使用static。
对于 final ,很明显它将与覆盖功能相反。
因为它们存在于某个类要实现的接口中。无法在任何地方实现的方法有什么意义?(这就是最终的建议)
1:我们不能声明一个final方法,因为它与它的规则相矛盾,因为final方法不能被覆盖,但总是需要在它实现的类中定义所有接口方法。
2:我们不能声明一个静态方法,因为它与它的规则相矛盾,因为静态方法总是需要方法体,但我们不能在接口内定义任何方法。
接口是纯抽象类。因此,接口中的所有方法都是abtract
,并且必须在子类中实现。因此,通过扩展,它们都不能被声明为final
.
在 Java 8 和默认方法的上下文中,这个问题有了新的含义。static
现在允许使用方法,并且在这个问题中解释了final
为什么方法仍然不可能。
Why Interface methods cannot be “static” & “final”?
接口中的所有方法都是显式抽象的,因此您不能将它们定义为静态或最终方法,因为静态或最终方法不能是抽象的。
我们不能将接口的方法声明为静态,因为接口实例方法的方法,我们不能声明final,因为必须在实现的类中覆盖接口的方法。有关描述,请检查此链接在此处输入链接描述
静态方法适用于类而不是实例,那么奇怪/毫无意义。话虽如此,我在某些情况下出于某种原因想要这个,但现在不记得一个案例了,所以一定是很久以前的事了。
您可以“解决”这个问题(而不是替代 api 设计),因为接口允许您声明类,所以像这样:
interface MyInterface {
static class Helpers {
static void myStaticMethod(); //can be abstract etc as usual
}
}
当然,您可以像往常一样对该类等进行子类化,也可以将其设为抽象、抽象方法等。
接口不能有静态方法,因为如果你知道静态方法声明的静态属性可以在不创建类的任何对象的情况下调用,并且静态方法是类的一部分而不是类的实例,所以答案是你如何调用抽象方法直到 java 7、在java 8中你可以将方法声明为静态并通过接口名点方法名来调用它。
现在对 final 的回答是,final 方法没有被覆盖,所以当类继承它时你将如何覆盖它
默认情况下,接口中存在的所有方法都是公共的和抽象的。如果您在接口中将方法声明为最终方法,首先您将得到编译器错误,即使这样,拥有最终方法也没有任何意义,因为您永远无法在子类中覆盖它。
在静态的情况下,即使 Java 允许在任何版本中使用静态,在接口内使用静态也不是一个好的编程习惯,因为对于静态方法,您必须提供您不能在接口内提供的实现。此外,即使您在接口内提供实现,您仍然必须覆盖它,然后必须通过类名调用它。
为什么我们不能使接口方法成为最终方法?
因为如果您将方法设为最终方法,那么您将无法覆盖它,并且接口的唯一目的是拥有将被所有实现该接口的类覆盖的方法。
为什么我们不能将接口方法设为静态?
在 Java 8 中,您可以将方法设为静态,但该方法应具有方法体
interface Test{
static void hello(){
System.out.println(“hello world”);
}
}
您可以通过实现此接口的类访问此方法
Test.hello();