【问题标题】:Why Interface methods cannot be "static" & "final"?为什么接口方法不能是“静态的”和“最终的”?
【发布时间】:2012-05-27 05:49:34
【问题描述】:

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

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

【问题讨论】:

  • 这篇文章已经过时了。从 Java 8 开始,您可以在接口中使用静态方法。

标签: java methods interface static final


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    final 方法不能被覆盖。如果您不能实际实现该方法,那将违背拥有接口的目的。

    静态部分见this question

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        final 表示它不能被覆盖。

        static 表示只能使用类名调用。既然一个接口会有多个实现,那么接口本身不能实现方法,你怎么知道选择哪个实现呢?

        【讨论】:

          【解决方案5】:

          你错了。

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

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

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

          【讨论】:

            【解决方案6】:

            静态方法适用于类而不是实例,所以有点奇怪/毫无意义。话虽如此,我在某些情况下出于某种原因想要这个,但现在不记得一个案例了,所以肯定是很久以前的事了。

            你可以“解决”这个问题(而不是替代的 api 设计),因为接口允许你声明类,所以像这样:

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

            你当然可以像往常一样继承该类等,也可以将其设为抽象、抽象方法等。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 我认为你的意思是“它们都不能被宣布为最终的”
              【解决方案8】:

              我们不能将接口的方法声明为static,因为接口实例方法的方法,我们不能声明final,因为在实现的类中必须覆盖接口的方法。有关描述,请查看此链接 enter link description here

              【讨论】:

                【解决方案9】:
                Why Interface methods cannot be “static” & “final”?
                

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

                【讨论】:

                  【解决方案10】:

                  在 Java 8 和默认方法的上下文中,这个问题有了新的含义。 static 方法现在是允许的,为什么 final 方法仍然不可用 is explained in this question

                  【讨论】:

                    【解决方案11】:

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

                    2:我们不能声明静态方法,因为它与它的规则相矛盾,因为静态方法总是需要方法体,但我们不能在接口内定义任何方法。

                    【讨论】:

                      【解决方案12】:

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

                      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 ,很明显它将与覆盖功能相反。

                      【讨论】:

                      • MyInterface.myStaticMethod(),仅声明它不能在MyInterface上实现。间接地说,classInterface 是相同的。
                      【解决方案13】:

                      默认情况下,接口内的所有方法都是公共的和抽象的。如果您在接口中将一个方法声明为最终方法,首先您将收到编译器错误,即使如此,拥有最终方法也没有任何意义,因为您永远无法在子类中覆盖它。

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

                      【讨论】:

                        【解决方案14】:

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

                        现在对 final 的回答是,final 方法没有被覆盖,所以当类继承它时你将如何覆盖它

                        【讨论】:

                          【解决方案15】:

                          为什么我们不能使接口方法成为最终方法?

                          因为如果你将一个方法设为 final,那么你就不能重写它,而 Interface 的唯一目的是拥有将被所有实现该接口的类重写的方法。

                          为什么我们不能将接口方法设为静态?

                          在 Java 8 中,您可以将方法设为静态,但该方法应具有方法体

                          interface Test{
                              static void hello(){
                                 System.out.println(“hello world”);
                              }
                          }
                          

                          您可以通过实现此接口的类访问此方法

                          Test.hello();
                          

                          【讨论】:

                            猜你喜欢
                            • 2011-01-26
                            • 2012-06-05
                            • 2011-04-26
                            • 1970-01-01
                            • 2013-12-15
                            • 2010-12-03
                            • 2014-01-03
                            • 2011-05-10
                            相关资源
                            最近更新 更多