You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

编译含多个类的Java文件:文件名与编译方法困惑求助

解决Java多类文件编译与命名的困惑

嘿,我来帮你把这个Java编译和命名的问题掰扯清楚~

首先得明确Java的核心命名规则,这是你困惑的根源:

  • 如果你的代码里有public修饰的类,那文件名必须和这个public类的名字完全一致(大小写都要对应)
  • 如果没有public类(就像你的代码里A和B都没加public),那文件名可以和任意一个类名相同,但重点是:运行程序时必须指定包含main方法的那个类的名字

针对你的代码的具体操作步骤

假设你的完整代码里B类包含main方法(比如类似下面的结构):

import static java.lang.System.out;
class A {
    protected int x = 0xF0;
    protected int z;
    public A(){
        z = fun(x);
        out.printf ("%x ", z);
    }
    public int fun(int i) {
        return (i + 1);
    }
    public static int staticFun (int i) {
        return (i + 3);
    }
}

class B extends A {
    public static void main(String[] args) {
        // 你的main方法逻辑
        new B();
    }
}

你可以按下面的步骤操作:

  1. 保存文件:把代码存为B.java(因为main在B里,这样更直观,当然存为A.java也可以,后面说原因)
  2. 编译代码:打开终端,进入文件所在目录,执行命令:
    javac B.java
    
    这时候会生成两个字节码文件:A.classB.class,因为你在一个文件里写了两个类
  3. 运行程序:必须执行下面的命令(重点!要指定包含main的类B):
    java B
    

你之前可能踩的坑

为什么会提示找不到main函数?大概率是这两种情况:

  • 编译后你运行的是java A,但A类里根本没有main方法,自然找不到
  • 不小心把类名和运行命令的拼写搞混了(比如代码里类名是大写B,运行时打成了java b,Java对大小写敏感,会找不到类)

补充:如果文件名是A.java怎么办?

要是你把文件命名为A.java,编译命令是javac A.java,同样会生成A.classB.class,运行的时候还是要执行java B,因为main方法只在B类里。

总结一下关键点

  • 无public类时,文件名可以自由选择,但运行必须指定包含main方法的类名(大小写要和代码里的类名完全一致)
  • 编译是针对.java源文件,运行是针对编译后的.class对应的类名

内容的提问来源于stack exchange,提问作者Pape Sow Traore

火山引擎 最新活动