35

我写了以下代码:

package staticshow;


public class StaticDemo {
  static int a = 3;
  static int b = 4;

  static {
    System.out.println("Voila! Static block put into action");
  }

  static void show() {
    System.out.println("a= " + a);
    System.out.println("b= " + b);
  }
}

public class StaticDemoShow {
  public static void main() {
    StaticDemo.show(); 
  }
}

我收到错误消息:

The public type StaticDemo must be defined in its own file

第一行的错误public class StaticDemo {。为什么会发生,我该如何解决?请注意,我的项目名称是StaticDemoShow,包名称是staticshow和类名称是在代码中给出的。

编辑- 在只公开一个类或两个类都默认后,我收到错误“选择不包含主要类型”。现在我该怎么办?

4

8 回答 8

52

如果.java文件包含顶级(非嵌套)public类,则它必须与该公共类具有相同的名称。因此,如果您有类似的课程,public class A{...}则需要将其放入A.java文件中。因此,我们不能在一个.java文件中有两个公共类。

如果允许有两个公共类,那么除了公共A类文件还包含它还public class B{}需要从A.java文件中命名为但文件不能有两个(或更多)名称(至少在所有系统上哪个Java可以运行)。B.java

因此,假设您的代码放在StaticDemoShow.java文件中,您有两个选择:

  1. 如果您想在同一文件中有其他类,请将它们设为非公开(缺少可见性修饰符将代表默认/包私有可见性)

     class StaticDemo { // It can no longer public
    
         static int a = 3;
         static int b = 4;
    
         static {
             System.out.println("Voila! Static block put into action");
         }
    
         static void show() {
             System.out.println("a= " + a);
             System.out.println("b= " + b);
         }
    
     }
    
     public class StaticDemoShow { // Only one top level public class in same .java file
         public static void main() {
             StaticDemo.show();
         }
     }
    
  2. 将所有公共类移动到它们自己的.java文件中。因此,在您的情况下,您需要将其拆分为两个文件:

    • 静态演示.java

        public class StaticDemo { // Note: same name as name of file
      
            static int a = 3;
            static int b = 4;
      
            static {
                System.out.println("Voila! Static block put into action");
            }
      
            static void show() {
                System.out.println("a= " + a);
                System.out.println("b= " + b);
            }
      
        }
      
    • 静态DemoShow.java

        public class StaticDemoShow { 
            public static void main() {
                StaticDemo.show();
            }
        }
      
于 2013-11-06T14:42:21.647 回答
14

不能在同一个文件中有两个公共类

   public class StaticDemo{

改成

   class StaticDemo{
于 2013-11-06T14:31:48.077 回答
7

Java 规则:public一个文件中的一个类。

于 2013-11-06T14:32:02.173 回答
2

将此类保存在文件StaticDemo.java中。此外,一个文件中不能有多个公共课程。

于 2013-11-06T14:31:01.027 回答
1

您不能使用 2 个公共类实例,您需要使用一个。尝试使用类(名称)而不是公共类(名称)

于 2013-11-06T14:34:40.390 回答
1

第一行 public class StaticDemo {

任何A具有访问修饰符 as的类都public必须有一个单独的源文件作为A.javaor A.jav这在 JLS 7.6 部分中指定

当且仅当包存储在文件系统中(第 7.2 节)时,如果在由类型名称组成的名称下的文件中未找到类型,主机系统可能会选择强制限制它是编译时错误如果满足以下任一条件,则加上扩展名(例如 .java 或 .jav):

  • 该类型由声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为公共的(因此可以从其他包中的代码中访问)。

但是,您可能必须public从 Class 声明中删除访问修饰符StaticDemo。然后由于StaticDemo类没有修饰符,它将变为package-private,也就是说,它只能在自己的包中可见。

查看控制对类成员的访问

于 2013-11-06T14:40:26.110 回答
0

一个文件中只能有一个公共类,否则你会得到你现在得到的错误,文件名必须是公共类的名称

于 2013-11-06T14:33:00.853 回答
0

我的程序中有两个重大错误。从其他答案中,我在一个 Java 程序中了解到,不能将两个类声明为“公共”。所以我更改了访问说明符,但在我的问题中添加了另一个错误,即“编辑”,即“选择不包含主要类型”。最后我观察到我忘记在我的主要方法中添加“String args []”部分。这就是代码不起作用的原因。整改后,按预期工作。

于 2013-11-06T14:51:53.477 回答