繁体   English   中英

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

[英]Why Interface methods cannot be "static" & "final"?

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

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

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

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

你理解错了。

  1. 所有变量在接口中都是隐式 public static 和 final 的。

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

  3. 由于接口的唯一目标是让类实现它们,并且接口中的方法不能有任何实现,因此将它们设为 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(因为 myStaticMethod 被定义为静态),如下所示:

MyInterface.myStaticMethod();--> 但是在这种情况下,如何通过 MyClass1 和 MyClass2 类调用 myStaticMethod() 的不同实现。

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

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

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

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

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

在 Java 8 和默认方法的上下文中,这个问题有了新的含义。 现在允许使用static方法,并且在这个问题中解释了为什么final方法仍然不可能。

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

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

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

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

interface MyInterface {

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

当然,您可以像往常一样对该类等进行子类化,也可以将其设为抽象、抽象方法等。

我们不能将接口的方法声明为静态,因为接口实例方法的方法,我们不能声明最终,因为必须在实现的类中覆盖接口的方法。 对于描述检查此链接在此处输入链接描述

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

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

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

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

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

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

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

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

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

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

Test.hello();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM