2011-08-20 143 views
15

在一个单一的java文件,是有可能有一个公共接口和公共类(用于实施接口)的Java公共接口和公共类在同一个文件

我是新来的Java编码,它是在网上大多数地方写的.java文件不能包含超过2个公共类。我想知道它是否也适用于接口和类。

+0

[Java:多个类声明在一个文件中]的可能重复(http://stackoverflow.com/questions/2336692/java-multiple-class-declarations-in-one-file) –

回答

14

不,这是不可能的。每个.java文件最多可能有一个顶级公用类型。 JLS 7.6. Top Level Type Declarations陈述如下:

[…]每个编译单元最多只能有一个[顶级公共]类型。

但是,您可以在同一个文件中包含一个受保护的类。编译没有问题(如果你把它放在一个名为Test.java文件:

public interface Test { 
    // ... 
} 

class TestClass implements Test { 
    // ... 
} 
+2

[JLS§7.6顶级键入声明](http://java.sun.com/docs/books/jls/third_edition/html/packages.html#26783) –

3

Java的规则是,只有一个公共类或接口可以在源文件中显示出来,并且名称必须与文件相匹配(即测试的.java - >公共类测试或公共接口测试,但不能同时)

7

,只要你想在一个文件中,如果你使用嵌套类,你可以有许多公开课在您的例子:

public interface I { 
    public class C implements I { 
     ... 
    } 

    public class D implements I { 
     ... 
    } 

    ... 
} 
+0

正是!我即将发布类似的答案。你能否告诉我这样的结构有什么意义?如果我尝试实例化类“C”,我不得不重新实现'I'中定义的方法,即使我已经在违反类'C'时做了它!附:我猜'C'不需要是静态的.. – Gevorg

+0

@Gevorg - 静态关键字意味着它与顶级类相同。这里唯一的区别是你只能将C引用为'I.C' – Kal

+1

如果我定义了一个接口'I'和'I'的'默认实现',如果不需要特殊实例,我经常使用这个习惯用法。我喜欢这个,因为我可以将它们关闭 - 无需将它们分散在多个文件中。除此之外,它只是读真棒:'setParam(new Interface.Default());'如果我没有使用内部类,那么我不得不考虑一个聪明的名字,这样我可以称它为'Default '。 – emboss

4
public interface A 
{ 
    public void helloWorld(); 

    public static class B implements A{ 

     @Override 
     public void helloWorld() { 
      System.out.print("Hello World"); 

     } 

    } 
} 
0

在了解接口的同时,还需要了解interface driven programming作为下一步。它告诉接口的实际使用是什么。它在Java(或任何其他语言)程序中扮演了什么角色。