好的,这可能是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指南的例子真的错了吗?在一些模拟测试中,我发现许多问题都有这样的模式,但没有一个选项是提到编译器错误。在这里担心
答案 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文件,并将在给定文件中搜索带有文件名的类 - 所以它取决于你的文件名,哪个类会正确编译,哪些不会。
长话短说:不,你不能把两个公共类放在一个文件中,因为编译器无法正确处理它。
(编辑:当然可以在一个与您的文件同名的公共类中定义新类。)