我可以编译一个与类名不同的Java文件吗?

36
有没有一种方法可以编译Java程序,而不需要使用基类名作为Java文件名?
如果有,请解释一下...

2
我不明白你的意思。你想要达到什么目的? - Ben S
为什么你想要这样做呢?附带一提,如果你想让你的应用程序有一个名称,而你的主类又有另一个名称,你可以将你的应用程序打包成一个jar文件。 - Buhb
抱歉,我的意思是公共类名... 我不想将文件保存为此(公共类名)以编译程序......这可能吗..... - Hulk
问题标题应该有一些线索,以便说明问题是什么。 - Steve Kuo
将问题标题更改为更具描述性的内容。 - Phil
@Steve Kuo:你的声誉很高,所以请解决这个问题。 - Graeme Perrow
21个回答

57

为了回答这个问题,让我们看一个例子:
创建一个名为 Sample.java 的文件。

class A 
{ 
   public static void main(String args[])
   { 
      String str[] = {""}; 
      System.out.println("hi"); 
      B.main(str); 
   } 
} 
class B 
{ 
   public static void main(String args[]) 
   { 
     System.out.println("hello");
   }
} 

现在您需要编译它,使用命令javac Sample.java,然后运行java A,就会输出结果

hi 
hello

如果您运行java B,则输出将为hello。请注意,这些类都没有被标记为public,因此它们具有默认访问权限。没有任何公共类的文件没有文件命名限制。

5
这样做的原因是因为'A'和'B'都不是公共类。如果A是公共类,那么它必须在A.java中定义。 - DoctorRuss
3
回答不错。然而,现在无法从其他软件包中访问它们,因为它们不再是公共的 :((( - T.Todua

39

你的Java文件名应该始终反映在该文件中定义的公共类。否则,你将会得到一个编译器错误。例如,test.java:

public class Foo {}

尝试编译这个代码会出现以下错误:

[steven@scstop:~]% javac test.java
test.java:1: class Foo is public, should be declared in a file named Foo.java
public class Foo {
       ^
1 error

因此,您必须确保文件名与公共类名匹配,这似乎使您的问题无意义。或者我没有理解你的问题...花些时间解释一下你实际想要实现什么,这将有助于提出更有效的问题 :)


1
谢谢,你说得很对。我知道我必须使用公共类名保存文件才能编译它。但是,是否有可能不这样做,并使用其他名称编译Java程序文件呢? - Hulk
3
不行,编译器不允许这样。请不要试图规避这个限制 - 正如其他人所提到的那样,Java 这么要求是非常好的事情!如果您想实现某个特定目标,如果您能更详细地解释您想要实现什么,我们可以建议替代方法。 - Steven Schlansker
如果你想让你的程序有一个特定的名称,你需要更改你的类的名称或创建一个新的类来执行该程序。 - FloppyDisk
@ Hulk 如果你想编译一个你不知道名字的Java文件怎么办?比如说,它来自于另一个源或其他什么地方。 - aandis
相关:https://dev59.com/gmYr5IYBdhLWcg3wRoOW - starball

10
只要您的源文件中没有公共类,就可以为源文件命名任何名称并进行编译。但是,如果在源文件中有一个公共类,则该文件的名称应与您的类名相同。否则,编译器会抛出错误。
示例: 文件名:TestFileName.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,World\n");
    }
}

编译中:javac TestFileName.java

错误:

TestFileName.java:1: class HelloWorld is public, should be declared in a file named HelloWorld.java
public class HelloWorld
       ^
1 error

3
不,公共类名必须与文件名匹配。内部、非公共的类名可以不同。

2

是的,我们可以使用与类名不同的名称编译Java文件,前提是该文件中不应有任何公共类。

如果文件中有任何公共类,则必须将该名称作为文件名。但是,如果您的类不包含任何公共类,则可以为您的类赋予任何名称。

请参考以下示例以使其更加清晰:

文件名:sample.java

 class A 
 { 
   public static void main(String args[])
  { 
    System.out.println("hi in Class A"); 
  }   
 } 
class B 
{ 
 public static void main(String args[]) 
 { 
    System.out.println("hello in class B");
 }
}

然后使用以下命令(Windows系统)编译它:javac sample.java

接着运行它:java A

输出结果为:在A类中打印“hi”

再运行它:java B

输出结果为:在B类中打印“hello”

请确认并检查。


2

文件名必须与公共类的名称相同。这是非常好的事情。只要它们不是public,可以在同一文件中有次要类。它们仍然可以是“默认”的,因此其他包中的类仍然可以使用它们。

大多数情况下不应这样做。Java关于类和包的命名模式是其较大优势之一--使程序员的工作更轻松,而不需要额外付出成本。


2

您可以使用Java编译API并编译任何您想要的Java源代码,该源代码不需要来自文件,也可以来自具有无关名称的文件。这取决于您希望开发程序时有多难理解。;)


一些例子:https://dev59.com/xGct5IYBdhLWcg3wUb5- - Vadzim
似乎Java编译API要求在编译之前指定类名。因此,如果文件名错误,它无法用于从源代码确定类名。 - Vadzim

1

如果这个类是公共的,那么你不需要将文件名命名为与其类名相同。尽管将文件名与类名相同是一个好习惯。

编译器会成功编译你的文件并生成一个 .class 文件。现在,在运行时,你需要向 JVM 提供类名,因此你必须记住具有 main 方法的类的名称。如果你将文件名和类名都保持相同,那么就容易记住编译后的 .class 文件的名称。

for example:
file Dummy.java
class Dummy
{
   public static void main(String args[])
   {
    System.out.println("This is Dummy class running");
   }
}  

to run the above code we will use : 
 Javac Dummy.java // to compile
  Java Dummy   //to run

  example:
  file Dummy.java
class Diff
{
     public static void main(String args[])
     {
      System.out.println("This is Diff class running");
     }
}  

to run the above code we will use : 
Javac Dummy.java // to compile
Java Diff   //to run

0

是的,我们可以使用与类不同的名称编译Java文件,前提是该文件中不应有任何公共类。

如果文件中有任何公共类,则在这种情况下,您必须将其名称作为文件名。但是,如果您的类不包含任何公共类,则可以为您的类指定任何名称。

请参考以下示例以使其更清晰:

文件名:example.java

class A 
 { 
   public static void main(String args[])
  { 
    System.out.println("You are in Class A"); 
  }   
 } 
class B 
{ 
 public static void main(String args[]) 
 { 
    System.out.println("You are in class B");
 }
}

然后使用以下命令进行编译:javac example.java

然后运行它:java A

output : you are in Class A

然后运行它:java B

output : you are in class B

请检查并确认。

0

按照惯例,主类的名称应与保存程序的文件名相匹配。您还应确保文件名的大小写与类名匹配。

文件名对应类名的惯例可能看起来是武断的。然而,这个惯例使得维护和组织程序更容易。此外,在某些情况下,这是必需的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接