Java中同一文件中的公共接口和公共类

17
在单个Java文件中,是否可以同时有一个公共接口和一个实现了该接口的公共类?
我是Java编程的新手,网络上大多数地方都写道一个.java文件不能包含超过两个公共类。我想知道这是否也适用于接口和类。

可能是Java:一个文件中有多个类声明的重复问题。 - Romain Hippeau
为什么你想要这样做? - NomadMaker
6个回答

18
不,这是不可能的。每个.java文件最多只能有一个顶层public类型。JLS 7.6. 顶层类型声明规定如下:

[...] 每个编译单元中最多只能有一个[顶层public]类型。

但你可以在同一文件中拥有一个包访问权限的类。如果将其放入名为Test.java的文件中,则会编译成功。
public interface Test {
    // ...
}

class TestClass implements Test {
    // ...
}


10
如果使用嵌套类,您可以在一个文件中拥有任意数量的公共类。以您的示例为例:
public interface I {
    public class C implements I {
        ...
    }

    public class D implements I {
        ...
    }

    ...
}

1
如果我定义了一个接口'I'和'I'的“默认实现”,并且在不需要特殊实例时使用它,我经常使用这个习惯用语。我喜欢这样做是因为我可以让它们靠近 - 不需要将它们分散在几个文件中。除此之外,说出来很棒:setParam(new Interface.Default()); 如果我没有使用内部类,我必须考虑一个聪明的名称,但这样我只需称其为“Default”。 - emboss
3
接口的成员类默认是public和static。 - Nicola Musatti
@emboss -- 一点建议。我认为“inner”这个词在静态类的上下文中会让人感到困惑。通常,它们被称为嵌套类。此外,由于它嵌套在接口中,我认为你不需要public或static。好答案。+1。 - Kal
@Nicola:你说得对。虽然我可以将内部类声明为包私有,但我仍然可以从不同的包中访问它。static也是多余的。我只是习惯性地添加它,并且只在我真正打算使用非静态内部类时才使用它们。如果我保留它,可以吗? - emboss
@Gevorg:将其保持分离没有问题,我只是喜欢“滥用”外部接口来进行命名空间。如果我在另一个文件中有了我在其他评论中提到的默认类,那么我就必须称其为DefaultInterface、InterfaceDefault或者其他一些愚蠢的名称。我讨厌花费太多精力去想聪明的名字——这就是为什么我开始使用这些嵌套的默认类——我只需要给它们命名为“Default” :) - emboss
显示剩余4条评论

7
public interface A
{
    public void helloWorld();

    public static class B implements A{

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

        }

    }
}

5
Java规则是一个源文件中只能有一个public类或接口,并且名称必须与文件名匹配(例如,Test.java --> public class Test或public interface Test,但不能同时出现)。

0
作为理解接口的下一步,人们还需要了解基于接口的编程。它告诉我们接口的实际用途以及在Java(或任何其他语言)程序中所扮演的角色。

0

是的,我们可以在同一个Java文件中编写接口公共类

interface Interfable {
public void interfMethod();

}

公共类 TestLam {

int x = 5;

public void testLamMethod() {
    int y = 10;
    Interfable i = () -> {
        System.out.println(x);
        System.out.println(y);
    };
    i.interfMethod();
}

public static void main(String[] args) {

    TestLam t = new TestLam();
    t.testLamMethod();
}

}

输出:5

10

// 注意:.java 文件名应与类名相同


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接