自定义系统类不能在命令行中编译

问题描述 投票:0回答:1

我有自己的 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 package system
1个回答
0
投票

你提到 java.util.System但这并不是平台的System所在,它存在于 java.lang.

这是个问题。Java代码的行为就像 import java.lang.*; 是在每个文件的顶部,即使你不写它。java语言规范是这么说的。所以现在你陷入了一个有趣的困境。

给定一个名为 System 在同一个包里。 你星际导入的另一个包也有一个叫做 System 类中,如果你使用一个非限定类型引用"System"在代码中的某个地方?

答案大概是,虽然规范是明确的,但很少有java编码者关心这个答案。他们宁可......不要陷入这种奇怪的情况。因此,不要轻易使用星形导入,也不要将任何类的名称与java代码中的类命名相同。java.lang 包。

如果你一定要知道,顺序如下。

要解析类型名 System 到它所引用的实际类型中。

  1. 检查是否有一个命名的(非星级)导入。import java.lang.System;
  2. 检查是否有一个名为 System 在这个源文件中。
  3. 检查是否有一个名为 System 在这个包中。
  4. 检查是否有一个名为 System 在任何星际导入的软件包中(因此,在 java.lang 因为那总是星际导入的。

因此,鉴于它听起来像你的 System 类在同一个包里,那一个就 "赢了"。然而,如果在编译过程中运行你的非测试源文件(你的 System.java 文件)不在classpath或sourcepath上,那么编译器就不会直接告诉你这一点,而是得到你看到的错误。

所以,你有两个问题。

  1. 你没有在命令行上正确编译测试类。使用一个构建系统。
  2. 不要把类的名字和lang包中的类命名一样;虽然你可以做出工作的代码,而且顺序也很好定义,但这很混乱(嘿,它让你感到困惑--这就是传闻中的证据!),而且不是习惯的java。其他人会很难读懂你的代码,而且你很可能在IDE中遇到bug之类的,因为当你在做一些奇怪的独特的事情时,你遇到没有人想到、没有人遇到过的情况的几率会大大增加。
© www.soinside.com 2019 - 2024. All rights reserved.