Java中文件名与类名相同

时间:2020-01-09 10:34:49  来源:igfitidea点击:

如果我们正在阅读任何Java书籍的开始章节或者在线看到任何第一个Java程序示例,我们会注意到的一件事是文件名应与Java中的类名相同。在这篇文章中,我们将看到文件名与Java中的类名相同的说法是多么真实。

文件名作为Java中的类名–公共类

如果Java程序中有一个公共类,则强制文件名也必须与该公共类相同,否则在编译Java程序时会出错。

例如,如果我们具有以下公共课程。

public class A {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}

我们将该类另存为Test.java并尝试对其进行编译,将会收到以下错误。

D:\theitroad>javac Test.java
Test.java:1: error: class A is public, should be declared in a file named A.java
public class A {
       ^
1 error

将文件另存为A.java,没有错误。

D:\theitroad>javac A.java

D:\theitroad>java A

Hello World

因此,如果类的访问修饰符为public,则语句文件名应与Java中的类名相同。

文件名作为Java中的类名–具有默认访问权限的类

现在让我们看看如果班级拥有默认访问权限,会发生什么情况。

考虑以下程序

class A {
  public static void main(String[] args) {
    B objb = new B();
    objb.display();
  }
}

class B {
  public void display(){
    System.out.println("Hello World");
  }
}

将其保存为Test.java,在编译时没有错误。

D:\theitroad>javac Test.java

因此,我们会看到使用默认访问类,该语句文件名应与Java中的类名不相同。

但是请注意,在编译Test.java之后,会生成生成的.class文件。由于文件中有两个类,因此将生成两个.class文件。我们可以看到.class文件具有与类名称相同的名称。

  • A.class
  • B.class

这意味着运行Java程序仍然需要提供与类名相同的名称。

D:\theitroad>java A

Hello World

我们看到的是,如果我们没有公共类,则不需要文件名与类名相同,则可以使用任何名称保存文件。但是.class文件的名称将与默认访问类的名称相同。

现在我们可能会问为什么在这种情况下.class文件具有与类名称相同的名称,我可以想到两个原因。

  • 我们必须知道Java文件可以具有任意数量的具有默认访问权限的类,因此唯一的限制是应该有一个公共类。如果我们看到示例程序,则还有两个类。编译时,将为文件中的类生成单独的.class文件。现在的问题是,如果给文件一个随机名称,则将是.class文件的名称(如果有多个)。这就是.class文件与类名相同的原因之一。
  • 考虑将此类另存为" Test.java",并假设使用某种机制将同一文件中的所有其他类也保存为Test1.class,Test2.class等。使用该语句创建类B的对象。 B objb =新的B();编译器看到此语句后,便知道必须加载B.class,但是按照我们的假设,它被保存为" Test1.class"。在那种情况下,Java编译器还必须维护一些映射,以了解B.class实际上意味着Test1.class。这将导致维护映射的形式产生大量开销,这意味着需要额外的空间并咨询该映射以获取正确的类,这意味着需要额外的处理,而所有这些又是为了什么呢?因此,我们可以为文件指定与类不同的名称!

因此,最终结果最好遵循以下约定:文件名应与Java中的类名相同,无论它是公共类还是具有默认访问权限的类。