17

好的,这可能是java中的小孩问题。我们不能在一个文件中定义两个公共类。但是,在 SCJP 学习指南一书中的一个例子中,提到了这个例子:

public abstract class A{
    public abstract void show(String data);
}

public class B extends A{
    public void show(String data){
        System.out.println("The string data is "+data);
    }
    public static void main(String [] args){
        B b = new B();
        b.show("Some sample string data");
    }
}

当我将其复制粘贴到 netbeans 中时,立即引发编译错误,我应该在单独的文件中提到公共类 A。SCJP 学习指南中的那个例子真的错了吗?同样在一些模拟测试中,我发现许多具有这种模式的问题,但在所有选项中都没有提到编译器错误。在这里发愁

4

6 回答 6

16

是的,一个文件中不允许有 2 个顶级公共课程

于 2012-06-24T13:05:22.813 回答
4

好吧,如果一个人如此挑剔:您可以在同一个文件中使用 public 修饰符定义多个类,即使用静态嵌套(内部)类。像这样:

文件 -> Test.java

public class Test {

    public static class SomeNestedClass {

    }

}
于 2013-04-08T22:48:58.673 回答
1

是的,您可以在同一个文件中有两个类。您可以通过从两个类名中删除公共访问修饰符来拥有它们,如下所示,

abstract class A{
    public abstract void show(String data);
}

class B extends A{
    public void show(String data){
        System.out.println("The string data is "+data);
    }
    public static void main(String [] args){
        B b = new B();
        b.show("Some sample string data");
    }
}
于 2015-01-09T19:39:36.853 回答
0

您可以在一个文件中创建 2 个公共类,在一个包含它们的类中。

如果您不需要对容器类的任何引用,还建议为它们添加“静态”。

于 2012-06-24T13:37:19.033 回答
0

您可以将两个公共类放在一个文件中,例如在文件中Circle.java

public class Test {
    public static void main(String args[]) {
        double cir = Circle.findCircumference(7.5);
        System.out.print("Circumference of circle=" + cir);
    }
}
public class Circle {
    public static double findCircumference(double radius) {
        return 2 * Math.PI * radius;
    }
}

如果你然后运行javac Circle.java,你会得到一个错误:

Circle.java:1: error: class Test is public, should be declared in a file named Test.java
public class Test {
       ^
1 error

但是,如果您使用 运行它java Circle.java,那么它将起作用。为什么?可能是因为 java 命令,从 java 11(见这里)开始,也可以运行单个源文件程序。

于 2021-03-15T16:08:00.133 回答
-1

想象一下,您可以将两个公共类放在一个文件中,然后考虑编译器的工作:它必须从您的 .java 文件构建一个 .class 文件,该文件恰好代表一个类(否则 .class 结尾将没有任何意义)。

JAVA 编译器的工作方式将简单地创建一个带有文件名的 .class 文件,并在给定文件中搜索带有文件名的类——所以这取决于你的文件名,哪个类将被正确编译哪个不会。

长话短说:不,您不能将两个公共类放在一个文件中,因为编译器无法正确处理。

(编辑:当然可以在与您的文件同名的一个公共类中定义新类。)

于 2012-06-24T13:40:23.697 回答