为什么不能在本地类中声明成员接口?

时间:2015-02-05 11:28:42

标签: java class oop interface local

您不能在下面的

块中声明一个接口
public void greetInEnglish() {

        interface HelloThere {
           public void greet();
        }

        class EnglishHelloThere implements HelloThere {
            public void greet() {
                System.out.println("Hello " + name);
            }
        }

        HelloThere myGreeting = new EnglishHelloThere();
        myGreeting.greet();
}

This Oracle tutorial 中,我得到了“你不能在本地类中声明成员接口。”因为“接口本质上是静态的。”

我是eagar用更合理的信息来理解这一点,为什么以及界面本身是如何静态的?

为什么上面的代码没有意义?

提前感谢elloborate!

3 个答案:

答案 0 :(得分:2)

  

我是eagar用更合理的信息来理解这一点,为什么和   界面本身是如何静态的?

因为接口是隐式静态的,并且你不能在内部类中使用非最终静态。

  

为什么它们是静态的?

因为这就是他们设计它的方式。

  

为什么上面的代码没有意义?

由于上述原因,

现在让我们简单一点:

静态意味着什么 - “与特定实例无关”。因此,假设类Foo的静态字段是一个不属于任何Foo实例的字段,而是属于Foo类本身。

现在想想接口是什么 - 它是一个契约,一个实现它的类承诺提供的方法列表。另一种思考方式是接口是一组“与特定类无关”的方法 - 任何类都可以实现它,只要它提供这些方法。

所以,如果一个接口与任何特定的类没有关系,显然一个人无法与一个类的实例相关 - 对吧?

我还建议你学习Why static can't be local in Java?

答案 1 :(得分:0)

如果未将字段定义为final,则任何实现都可以更改字段的值。然后它们将成为实现的一部分。接口是纯粹的规范,没有任何实现。

如果它们是静态的,那么它们属于接口,而不是对象,也不属于对象的运行时类型。

接口为客户端提供了与对象交互的方式。如果变量不公开,则客户端将无法访问它们。

答案 2 :(得分:0)

您的代码没有意义,因为您在方法体内定义了接口。您可以在顶层或另一个类或接口中定义接口。

  

您无法在块内声明接口

reference