关于Java接口方法:为什么接口方法不能是“static” “final”?

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

在Java接口中,我们只能有最终的变量。我们还可以在接口中创建静态变量。但是,同时我们不能创建静态/最终方法,因为接口只用于静态方法。

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


无法重写最终方法。如果您不能实际实现方法,那么这就违背了拥有接口的目的。

对于静态部分,请参见此问题。


你搞错了。

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

  • 在Java 8之前,您不能在接口中创建静态方法。所有方法都是实例方法。

  • 因为接口的唯一目标是让类实现它们,并且由于接口中的方法不能有任何实现,所以使它们成为最终的没有意义:它们将没有实现,并且不能被重写。


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

    "最终"是指"不能重写"。这对于接口来说毫无意义。


    final意味着它不能被推翻。

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


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

    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和默认方法的上下文中,这个问题具有新的意义。现在允许使用static方法,这个问题解释了为什么final方法仍然不可行。


    1
    Why Interface methods cannot be"static" &"final"?

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


    接口是纯抽象类。因此,接口中的所有方法都是abtract,必须在子类中实现。因此,通过扩展,它们都不能声明为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
        }
    }

    当然,您可以将该类等子类划分为普通类,也可以将其抽象化、抽象方法等。