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

Posted

技术标签:

【中文标题】我可以编译一个名称与类不同的 java 文件吗?【英文标题】:Can I compile a java file with a different name than the class? 【发布时间】:2010-12-22 22:43:48 【问题描述】:

有没有什么方法可以编译一个java程序而不需要java文件名和它的基类名。

如果是这样,请解释..

【问题讨论】:

我不明白你的意思。你想达到什么目的? 您为什么要这样做?附带说明一下,如果您希望您的应用程序有一个名称而您的主类有另一个名称,您可以随时将您的应用程序打包到一个 jar 文件中。 对不起,我的意思是公共类名......我不想用这个(公共类名)保存文件来编译程序......这可能吗...... . 问题标题应该有一些关于问题是什么的线索。 将问题标题更改为更具描述性的内容。 【参考方案1】:

要回答这个问题,请看以下示例: 创建文件 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,因此授予它们default 访问权限。没有任何公共类的文件没有文件命名限制。

【讨论】:

这是有效的,因为 'A' 和 'B' 都不是公共课程。如果 A 是,则必须在 A.java 中定义。 不错的答案。但是,现在不可能从其他包中访问它们,因为它们不再是公共的 :(((【参考方案2】:

您的 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

因此,您的文件名必须与您的公共类名相匹配,这似乎使您的问题没有实际意义。要么那个,要么我不明白你在问什么......花一些时间解释你真正想要实现的目标将大大有助于提出一个更有效的问题:)

【讨论】:

谢谢....你真的很傻.....我知道我必须用公共类名保存文件才能编译它......但是可以不做吗这个并编译带有其他名称的java程序文件..... 没有。编译器不允许你这样做。请不要试图绕过这个限制——正如其他人所提到的,Java 需要这个是一件非常好的事情!如果您正在尝试实现某个特定目标,如果您详细说明您要实现的目标,我们可以建议替代方法。 如果你想让你的程序有一个特定的名字,你需要改变你的类名或者创建一个新的类来执行程序。 @Hulk 如果你想编译一个你不知道名字的 java 文件怎么办?例如,假设它来自不同的来源或其他东西。【参考方案3】:

只要你的源文件中没有公共类,你就可以将你的源文件命名为任何名称并且可以编译。但是,如果您的源文件中有一个公共类,则该文件的名称应与您的类名相同。否则编译器会报错。

示例: 文件名: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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

您必须有一个与文件名同名的公共类。这是一件非常好的事情。只要它们不是公共的,您就可以在同一个文件中包含辅助类。但是它们仍然可以是“默认”的,因此它们仍然可以被同一个包中的其他类使用。

大部分情况下不应该这样做。 Java 关于类和包的命名模式是它最大的优势之一——让程序员的生活更轻松,无需任何成本。

【讨论】:

【参考方案6】:

您可以使用 Java Compile API 并编译您希望的任何 java 源代码,源代码不必来自文件,也可以来自名称不相关的文件。这取决于你想开发你的程序有多迟钝。 ;)

【讨论】:

一些例子:***.com/questions/12173294/… 似乎 Java Compile API 要求在编译之前指定类名。所以它不能用于从源代码中确定类名,以防文件名错误。【参考方案7】:

是的,我们编译一个名称与类不同的 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 类中的你好

然后运行它:java B

输出:B类你好

请检查确认。

【讨论】:

【参考方案8】:

在该类公开之前,不必将文件命名为与其所具有的类的名称相同的名称。虽然将文件命名为与类名相同是一个好习惯。

编译器将成功编译您的文件并生成一个点类文件。现在在运行时,您需要为 JVM 提供类名,因为您必须记住具有 main 方法的类的名称。如果文件名和类名保持一致,编译后的点类文件名就容易记住了。

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

【讨论】:

【参考方案9】:

我猜他的意思是 .java 文件的名称与其中定义的实际类不同。

我想这是不可能的。

【讨论】:

【参考方案10】:

没有。您可以在编译之前编写一个 shell 脚本来重命名 .java 文件,但 javac 要求文件名 = 类名。

(在windows中也是不区分大小写,所以ASDF.java可以编译Asdf.class)

【讨论】:

【参考方案11】:

是的,您可以为文件选择任何名称 (.java)。不管该文件中的类名是什么,这意味着类名可能与文件名完全不同。 您应该使用文件名编译程序,并且应该使用 main 方法所在的类名运行程序。 main 方法在不同的类中可能有多个,所以你应该用你要运行的 main 方法的类名来运行它......

【讨论】:

如果我理解正确,那你就错了——但也许举个例子有助于理清思路。 据我所知,我没有错。例如使用编码类 A public static void main(String args[]) String str=""; 创建一个文件 sample.java System.out.println("hi"); B.main(str); 类 B public static void main(String args[]) System.out.println("hello");现在你将它编译为 javac sample.java 并作为 java A 运行然后输出将是 hi hello【参考方案12】:

我们可以保存文件totle不同的类名,因为在java中我们编译程序但我们运行方法。 我们必须用文件名编译我们的程序并运行我们的类名

【讨论】:

请发表评论。【参考方案13】:

是的,可以编译具有不同文件名的 java 源文件,但您需要确保其中定义的所有类都不是公共的...当您编译源文件时,里面的类对应的 .class 文件源文件已创建。

【讨论】:

你能提供一个简单的例子来说明如何做到这一点吗?例子总是一件好事!【参考方案14】:

是的,您可以使用任何其他名称保存您的 java 源代码文件,与您的主类名不同,但是当您编译它时,字节码文件名将与您的主类名相同。因此,为了方便您不记住运行 java 代码的许多名称,您需要将文件名与主类相同,而不是只有文件名和字节码文件具有相同的名称。

【讨论】:

【参考方案15】:

如果类不是公共的,您可以使用其他名称保存它,例如如果类名是 Simple,则将其保存为 Hard.java。 编译->Hard.java 运行->Simple.java 仅通过 .java 保存您的 java 文件。 编译 javac .java 运行 java 你的类名 例如,如果我的程序主类名是 A 那么 仅由 .java 保存 由 javac .java 编译 由 java A 运行

【讨论】:

【参考方案16】:

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

如果文件中有任何 public 类,那么在这种情况下,您必须将该名称作为文件名。但是如果你的类不包含任何 public 类,那么你可以给你的类起任何名字。

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

文件名: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

请检查确认。

【讨论】:

【参考方案17】:

你可以在java中编写多个main方法,因为java提供了main方法重载,其中main方法也可以被重载。一旦你在这里编译文件 example.java 当您使用 java A 运行文件时,编译器会创建包含 main 方法的 .class 文件,它将运行包含类 A 的 main 方法的 A.class 文件,并且该输出将显示在您的屏幕上,但是当您使用java B,运行B.class文件,提供B类的main方法 这样你的代码就运行成功了

【讨论】:

【参考方案18】:

是的。这是可以做到的。

类和文件名相同的主要原因是为了让编译器的工作更容易检查它需要在整个 Java 类列表中运行哪个类。

所以最好让文件名和类名相同。

如果你在这个类中没有任何公共方法,你已经编译并运行了一个与文件名不同的名称的类。

【讨论】:

【参考方案19】:

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

文件名对应于类名的约定可能看起来很随意。但是,这种约定使您更容易维护和组织您的程序。此外,在某些情况下,它是必需的。

【讨论】:

【参考方案20】:

根据其他答案,唯一可行的解​​决方案是somehow determine the classname from the source,然后使用它将文件重命名为正确的名称并照常编译。


另一种选择是更改源中的包和类名以匹配文件名:

sed -i -r "0,/package/s/^\s*package .*?;/package new.klass.pkg;/" %1
sed -i -r "0,/class/s/public\s+class .+?\/public class NewClassName /" %1

通过How to use sed to replace only the first occurrence in a file?

【讨论】:

【参考方案21】:

即使没有名称(简单的“.java”),您也可以拥有您的 java 文件。唯一的问题是您的文件中不应包含任何公共类。

【讨论】:

以上是关于我可以编译一个名称与类不同的 java 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java允许我们编译一个名称与文件名不同的类?

如何将javascript代码编译为c++或java

java可以编黑客程序吗?

Android 将 apk 反编译为源码

java内功 ---- jvm虚拟机原理总结

反编译 APK 上的 .smali 文件 [重复]