【问题标题】:interface variables are final and static by default and methods are public and abstract接口变量默认是最终的和静态的,方法是公共的和抽象的
【发布时间】:2010-04-14 08:08:47
【问题描述】:

问题是为什么默认情况下决定将变量设置为 final 和 static,将方法设置为 public 和 abstract。

是否有任何特别的理由让它们成为隐式的,可变为 final 和 static 以及方法为 public 和 abstract。

为什么他们不允许使用静态方法但允许使用静态变量?

我们的接口在Java中具有多重继承的特性并避免了菱形问题。但是它如何解决钻石问题,因为它不允许使用静态方法。

在下面的程序中,两个接口都有同名的方法..但是我们只实现了一个......钻石问题是这样解决的吗?

interface testInt {
    int m = 0;
    void testMethod();
}

interface testInt1 {
    int m = 10;
    void testMethod();
}

public class interfaceCheck implements testInt, testInt1{
        public void testMethod() {
            System . out . println ( "m is"+ testInt.m );   
             System . out . println ( "Hi World!" );    
        }
}

【问题讨论】:

  • 我认为实现完全抽象

标签: java


【解决方案1】:

在我看来,接口声明了实现者必须具备的一组能力。它指的是“什么”而不是“如何”;它更像是一个规范而不是一个实施指南。

因此,不公开的方法在接口中是不相关的。与非静态数据成员相同,与具体实现更相关。

【讨论】:

    【解决方案2】:

    至于为什么它们是默认值 - 这只是语言规范。他们把它设计成这样。

    他们不允许在接口中使用静态方法,因为接口不应该具有任何功能。这只是接口的定义。

    Java 没有菱形问题,因为接口不包含代码。如果您的接口被允许有代码,那么 Java 将无法确定它应该调用 testInt 的 testMethod() 还是 testInt1 的 testMethod()。由于接口没有代码,Java 知道只有 1 个 testMethod 实现需要运行代码。

    【讨论】:

      【解决方案3】:

      我认为接口中不允许使用非静态变量主要是出于实用的原因。多重继承可以更有效地这种方式,它避免了一些歧义的问题。

      顾名思义,接口只是实例上可用操作的定义,因此,它不包含任何方法实现。

      由于这些原因,不允许方法不是公共的并且变量不是静态的是没有任何意义的。

      也就是说,我不确定为接口和类设置不同的默认值是否是个好主意。

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 2023-03-26
        • 2012-05-27
        • 1970-01-01
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多