java中的文件名和类名不同

xtr*_*eak 2 java class

我创建了一个名为 In.java 的文件并输入了以下代码

class In {
   int a;

   public static void main(
      String args[] ) {
      Inheritance h = new Inheritance();
      h.set( 6 );
      System.out.println( h.get() );
   }

   void set(
      int a ) {
      this.a = a;
   }

   int get() {
      System.out.println( a );
      return a;
   }
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时,它显示了一个关于继承的错误。然后我重命名 In as I Inheritance

class Inheritance {
   int a;

   public static void main(
      String args[] ) {
      Inheritance h = new Inheritance();
      h.set( 6 );
      System.out.println( h.get() );
   }

   void set(
      int a ) {
      this.a = a;
   }

   int get() {
      System.out.println( a );
      return a;
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我编译它时,它编译并创建了 Inheritance.class 但是当我编译时文件名仍然是 In.java 因为public class Inheritance它提醒我该类应该更改为 Inheritance.java 。现在当我运行java In它显示一个错误Error: Could not find or load main class In现在我再次将类重命名为 In as

class In {
   int a;

   public static void main(
      String args[] ) {
      Inheritance h = new Inheritance();
      h.set( 6 );
      System.out.println( h.get() );
   }

   void set(
      int a ) {
      this.a = a;
   }

   int get() {
      System.out.println( a );
      return a;
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我编译它时,它被编译为 In.class,当我运行输出时,它已经运行了显示的程序

6 6

当我用 In.java 创建程序并运行名为 Class Inheritance 的类时,它编译并给出了 Inheritance.class 。1.如果类名和文件名不同,编译器会不会报错?2.当我运行java In它时,它显示Error: Could not find or load main class In为生成了 In.class 文件 为什么在编译 In.java 时它没有检测到它,类名作为继承?那么一个类文件可以使用同一目录中的任何其他类文件吗?

小智 5

任何声明的类都public应该保存在同名的文件中。如果公共类的名称和包含它的文件的名称不同,则会导致编译错误。未声明的类public可以保存在不同名称的文件中。

请注意,生成的类文件以 java 类命名,而不是文件名。看看下面的例子。

在下面的插图中X是任何有效的名称(除了FooBar)。

示例 1:

// filename X.java (doesn't compile)
public class Foo {

}
public class Bar {

}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨公共类Foo并且Bar没有出现在他们自己的.java文件中。

示例 2:

// filename Foo.java (doesn't compile)
public class Foo {

}
public class Bar {

}
Run Code Online (Sandbox Code Playgroud)

错误与上述相同,但仅适用于Bar这次。

示例 3:

// filename Foo.java (compiles)
public class Foo {

}
class Bar {

}
Run Code Online (Sandbox Code Playgroud)

生成的文件是Foo.classBar.class

示例 4:

// filename X.java (compiles)
class Foo {

}
class Bar {

}
Run Code Online (Sandbox Code Playgroud)

生成的文件是Foo.classBar.class