class HelloObject {
void speak() {
System.out.println("Hello (from object)!");
}
}
class HelloTester {
public static void main(String[] args) {
HelloObject object = new HelloObject();
object.speak();
}
}
当我将“HelloTester”类名更改为“HelloTester2”之类的程序时,程序突然起作用。类文件名为ClassesBegin.java。
当我尝试更改类的名称时,为什么java程序不起作用?
编辑:对不起,我应该澄清一下。我将类名更改为HelloTestera,这是我得到的错误: 线程“main”中的异常java.lang.NoClassDefFoundError:HelloTester 但即使文件名与类名无关,它也能工作。当文件名为ClassesBegin.java 时,它与HelloTester一起使用答案 0 :(得分:8)
您需要更改文件名,而不仅仅是类名。
在Java中,.java和.class名称必须与类名相同。
因此,每个类都必须使用其名称转到单独的文件,以便创建单独的.class文件。
在同一个文件中放置两个不同的类是C ++实践,它与编译模型一起使用,而不是Java。
编辑:用户最终澄清了导致他的错误的原因,所以显然我的答案与此无关。以上所有内容均适用于公共课程。虽然我不得不说我认为这是一种可怕的做法,但您可以将其用于包级别的课程。如果您打算在包中使用多个类,请为其提供自己的文件。如果它只被一个类使用,那就把它变成一个内部类......
答案 1 :(得分:2)
“编辑:对不起我应该澄清更多。我将类名更改为HelloTestera,这是我得到的错误:线程中的异常”main“java.lang.NoClassDefFoundError:HelloTester但是即使文件名有与类名无关。当文件名为ClassesBegin.java时,它与HelloTester一起工作“
如果类是公共的,则文件名和类名必须匹配。
如果您将类名称变为“HelloTestera”但运行了“java HelloTester”(这是java.lang.NoClassDefFoundError:HelloTester将指示的那样),则问题是您将错误的类名传递给“java”。 / p>
但是节省了很多时间,并将类和文件命名为相同的东西,并将其保存在每个文件的一个顶级类中。一种简单的“强制”方法,即现在将所有类公开(每个文件只能有一个公共类)。这样可以避免你犯错误。
答案 2 :(得分:1)
在编译方面,您可以在ClassesBegin文件中拥有尽可能多的非公共类。但只有public(在这种情况下为ClassesBegin;直到你更改文件的名称)才能在外部使用。
特别是main()方法必须是public,并且在公共类中才能找到java。将文件重命名为HelloTester以使其正常工作。
或者 - 在IDE中重命名HelloTester类,这可能是自动重定位文件,因为它有一个main方法,并且IDE知道它需要是公共类......
答案 3 :(得分:1)
最简单的方法是:
1)每个文件只有一个顶级类 2)类的名称和文件名必须匹配(name和CasE)
这样可以更容易地找到您的类(类的名称是文件的名称),并且您不会遇到一些奇怪的问题,其中compielr无法找到所有类的copmpile。
Java还有一个限制,其中公共类100%的名称必须与文件名相同。限制仅适用于公共类(或接口或枚举)。您可以在文件中拥有任意数量的非公共类型...但不要这样做 - 坚持每个文件一个顶级类/接口/枚举。
答案 4 :(得分:0)
你写道:
我将类名更改为HelloTestera,这是我得到的错误:线程“main”中的异常java.lang.NoClassDefFoundError:HelloTester
看起来你实际上并没有运行重命名的类,而是旧的。您是否使用新更改的类名称调用Java?在运行类之前是否重新编译了文件?
重命名课程后,您应首先运行:
javac ClassesBegin.java
然后:
java HelloTestera
对我来说产生了:
你好(来自对象)!
通常,在使用IDE时,会为您处理这些问题(在运行之前编译)。