为什么接口方法不能是“静态的”& “最后”?

时间:2012-05-20 12:01:45

标签: java methods interface static final

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

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

14 个答案:

答案 0 :(得分:14)

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

对于静态部分,请参阅this question

答案 1 :(得分:11)

你弄错了。

  1. 所有变量在接口中都是隐式公共静态和最终变量。

  2. 在Java 8之前,您无法在接口中创建静态方法。所有方法都是实例方法。

  3. 由于接口的唯一目标是让类实现它们,并且由于接口中的方法不能有任何实现,因此将它们作为final是没有意义的:它们没有实现,也不可能覆盖。

答案 2 :(得分:5)

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

“final”表示“不能被覆盖”。这对任何接口都没有意义。

答案 3 :(得分:3)

final表示无法覆盖。

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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和&调用myStaticMethod()的不同实现。 MyClass2类。

因此,它证明了在接口方法声明中无法实现静态。

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

答案 6 :(得分:1)

接口是纯抽象类。因此,接口中的所有方法都是abtract,并且必须在子类中实现。因此,通过扩展,它们都不能被声明为final

答案 7 :(得分:1)

Why Interface methods cannot be “static” & “final”?

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

答案 8 :(得分:1)

在Java 8和默认方法的上下文中,这个问题具有新的含义。现在允许使用static种方法,以及为什么final方法无法实现is explained in this question

答案 9 :(得分:1)

1:我们无法声明最终方法,因为它违反了它的规则,因为最终方法无法覆盖,但始终需要在其实现的类中定义所有接口方法。

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

答案 10 :(得分:0)

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

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

interface MyInterface {

    static class Helpers {
        static void myStaticMethod(); //can be abstract etc as usual
    }
}

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

答案 11 :(得分:0)

我们不能将接口的方法声明为静态因为接口实例方法的方法而且我们不能声明final,因为它必须覆盖实现类中接口的方法。有关说明,请查看此链接enter link description here

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

接口不能具有静态方法,因为如果您知道可以在不创建类的任何对象的情况下调用声明为static的方法的静态属性,而sttaic方法是类的一部分而不是类的实例,那么答案是,如何调用抽象方法直到Java 7的方法,在Java 8中,您可以将方法声明为static并通过接口名称点方法名称进行调用。

现在final的答案是,final方法不会被覆盖,所以当类继承它时如何覆盖它