为什么接口方法不能“静态”和“最终”?

问题描述 投票:6回答:13

在Java Interface中,我们只能使用最终变量。我们还可以在Interface中创建静态变量。但是,与此同时,我们无法创建静态/最终方法,因为接口仅适用于静态方法。

在接口中不允许静态/最终方法的原因是什么?

java methods interface static final
13个回答
14
投票

最终方法无法覆盖。如果您无法实际实现该方法,那就无法拥有接口的目的。

有关静态部分,请参阅this question


1
投票

1:我们不能声明一个final方法,因为它违反了它的规则,因为final方法不能覆盖,但总是需要在它实现的类中定义所有接口方法。

2:我们不能声明一个静态方法,因为它违反了它的规则,因为静态方法总是需要方法体,但是我们不能在接口内定义任何方法。


0
投票

好的静态方法适用于类而不是实例,所以有点奇怪/没有意义。说过我出于某种原因出于某种原因想要这种情况,但现在已经记不起一个案例,所以一定是很久以前。

虽然接口允许你声明类,但是你可以“解决”这个问题(相当另类的api设计),所以像这样:

is explained in this question

当然,您可以将该类继承为正常,也可以将其作为抽象,抽象方法等。


0
投票

我们不能将接口的方法声明为静态因为接口实例方法的方法而且我们不能声明final,因为它必须覆盖实现类中接口的方法。有关描述,请查看此链接interface MyInterface { static class Helpers { static void myStaticMethod(); //can be abstract etc as usual } }


0
投票

默认情况下,接口中存在的所有方法都是公共的和抽象的。如果你在一个接口内部声明一个方法是最终的,那么你将得到编译器错误,即使这样也没有任何意义,因为你永远不会在子类中覆盖它。

在静态的情况下,即使Java允许在任何版本中使用静态在接口中使用静态也不是一个好的编程习惯,因为对于静态方法,你必须提供在接口内不能提供的实现。此外,即使您在接口内提供实现,仍然必须覆盖它,然后必须通过类名称调用它。


11
投票

你理解错了。

  1. 所有变量都是隐式公共静态和接口中的最终变量。
  2. 在Java 8之前,您无法在接口中创建静态方法。所有方法都是实例方法。
  3. 由于接口的唯一目标是让类实现它们,并且由于接口中的方法不能有任何实现,因此将它们作为final是没有意义的:它们没有实现,也无法被覆盖。

5
投票

接口是为实例定义的,而不是静态的。

“最后”的意思是“不能被覆盖”。这对任何接口都没有意义。


3
投票

qazxsw poi意味着它不能被覆盖。

final表示只能使用类名调用它。由于接口将有多个实现,您如何知道选择哪个实现,因为接口无法实现该方法本身?


2
投票

因为它们存在于某个类实现的接口中。在任何地方都无法实现的方法有什么意义? (这是最后的建议)


2
投票

我还有一点要证明为什么接口方法不能是静态的:

static

现在让我们有两个类正在实现“MyInterface”

//第一堂课

interface MyInterface {
        static void myStaticMethod();    
}

//第二课

class MyClass1 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()的不同实现。

所以事实证明,在接口方法声明中,静态是不可能的。

对于最终,很明显它与覆盖功能相反。


1
投票

接口是纯抽象类。因此,接口中的所有方法都是class MyClass2 implements MyInterface { static void myStaticMethod(){ // some implementation } } ,并且必须在子类中实现。因此,通过扩展,它们都不能被声明为abtract


1
投票
final

接口中的所有方法都是显式抽象的,因此您无法将它们定义为static或final,因为静态或最终方法不能是抽象的。


1
投票

在Java 8和默认方法的上下文中,这个问题具有新的含义。 Why Interface methods cannot be “static” & “final”? 方法现在被允许,为什么static方法仍然不可能final

© www.soinside.com 2019 - 2024. All rights reserved.