2012-05-20 87 views
6

在Java接口中,我们只能有最终的变量。我们也可以在Interface中创建静态变量。但是,与此同时,我们无法创建静态/最终方法,因为接口仅适用于静态方法。为什么接口方法不能是“静态”和“最终”?

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

+0

重复的问题 –

回答

4

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

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

11

最后的方法不能被覆盖。如果你无法真正实现这个方法,那就违背了接口的目的。

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

2

因为它们存在于某个类的实现接口中。什么是不能在任何地方实施的方法的要点? (这是最终会建议的)

3

final意味着它不能被覆盖。

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

6

你说错了。

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

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

  3. 由于接口的唯一目标是让类实现它们,并且接口中的方法不能有任何实现,所以最终的方法是没有意义的:它们没有实现,也不能被覆盖。

+0

@LukasEder感谢您的编辑。 –

0

那么静态方法工作在类而不​​是实例如此有点奇怪/毫无意义。话虽如此,但我在某些情况下出于某种理由想要这样做,尽管现在不能记得很久以前一定会发生的事情。

可以“解决”这虽然(而不是替代API设计)的界面允许您声明类,所以是这样的:

interface MyInterface { 

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

你可以继承这个类等为正常,当然,作为以及使其抽象,抽象方法等。

1

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

+0

我认为你的意思是“它们中的任何一个都不能被声明为final” – duffymo

0

我们不能将接口的方法声明为静态的,因为接口实例方法的方法并且我们不能声明final,因为它是必需的以覆盖实现类中接口的方法。为说明检查此链接enter link description here

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

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

1

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

1

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

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

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

所以证明了在接口方法声明中不能使用静态方法。

对于最终的情况,很明显,它会覆盖功能。

+0

'MyInterface.myStaticMethod()',只能声明它不能在'MyInterface'上实现。间接地,你说'class'和'Interface'是一样的。 –

相关问题