一个文件中的两个公共类java

时间:2012-06-24 13:04:05

标签: java

好的,这可能是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 styudy指南的例子真的错了吗?在一些模拟测试中,我发现许多问题都有这样的模式,但没有一个选项是提到编译器错误。在这里担心

6 个答案:

答案 0 :(得分:13)

是的,一个文件中不允许使用2个顶级公共类

答案 1 :(得分:3)

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

档案 - > Test.java

public class Test {

    public static class SomeNestedClass {

    }

}

答案 2 :(得分: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");
    }
}

答案 3 :(得分:0)

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

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

答案 4 :(得分: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(见 here)开始,也可以运行单个源文件程序。

答案 5 :(得分:-1)

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

JAVA编译器的工作方式只是创建一个带有文件名的.class文件,并将在给定文件中搜索带有文件名的类 - 所以它取决于你的文件名,哪个类会正确编译,哪些不会。

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

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