我有自己的 System
类,并在同一个包中加入一个测试类,测试System类中声明的方法。我还创建了一个System构造函数,它需要3个参数。当我在IDE中创建了一个构造函数来测试方法时,程序运行得很好(我在需要使用System.方法的地方使用了java.util.System),但IDE知道我在创建构造函数时是指我自己的类。然而,当我尝试从命令行运行我的测试类时,它甚至不能编译。
error: constructor System in class System cannot be applied to given types;
System sys = new System("String1", "String2", 20);
^
required: no arguments
found: String,String,int
reason: actual and formal argument lists differ in length
我猜测是我的构造函数,而不是... java.util.System
构造函数(无参数)被调用,导致整个程序崩溃。有谁知道如何解决这个问题,为什么只在命令行中发生,而不是在IDE中?
你提到 java.util.System
但这并不是平台的System所在,它存在于 java.lang
.
这是个问题。Java代码的行为就像 import java.lang.*;
是在每个文件的顶部,即使你不写它。java语言规范是这么说的。所以现在你陷入了一个有趣的困境。
给定一个名为 System
在同一个包里。和 你星际导入的另一个包也有一个叫做 System
类中,如果你使用一个非限定类型引用"System
"在代码中的某个地方?
答案大概是,虽然规范是明确的,但很少有java编码者关心这个答案。他们宁可......不要陷入这种奇怪的情况。因此,不要轻易使用星形导入,也不要将任何类的名称与java代码中的类命名相同。java.lang
包。
如果你一定要知道,顺序如下。
要解析类型名 System
到它所引用的实际类型中。
import java.lang.System;
System
在这个源文件中。System
在这个包中。System
在任何星际导入的软件包中(因此,在 java.lang
因为那总是星际导入的。因此,鉴于它听起来像你的 System
类在同一个包里,那一个就 "赢了"。然而,如果在编译过程中运行你的非测试源文件(你的 System.java
文件)不在classpath或sourcepath上,那么编译器就不会直接告诉你这一点,而是得到你看到的错误。
所以,你有两个问题。