java中的文件名和类名不同

时间:2013-11-01 17:18:42

标签: 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;
   }
}

编译时,它显示有关继承的错误。然后我重命名为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;
   }
}

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

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;
   }
}

现在当我编译它编译为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时它没有检测到它?那么一个类文件可以在同一目录中使用任何其他类文件吗?

1 个答案:

答案 0 :(得分:4)

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

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

在下图中,X是任何有效名称(FooBar除外)。

示例1:

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

}
public class Bar {

}

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

示例2:

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

}
public class Bar {

}

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

示例3:

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

}
class Bar {

}

生成的文件为Foo.classBar.class

示例4:

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

}
class Bar {

}

生成的文件为Foo.classBar.class