8

我有课Hello。我已经成功地从中编译了 .class 文件并将其放入 dir/subdir 目录,并在其代码中为其分配了 dir.subdir 包。我想用java命令从命令行运行它。

我用命令运行它:java dir/subdir/Hello,它运行成功!但是我在文档中读到它应该使用完全限定的类名来完成。我尝试执行:java dir.subdir.Hello,它也运行成功了!!

这些方法中哪一种是合理的方法并且更正确?他们每个人的具体含义是什么?他们的根本区别是什么?

4

4 回答 4

1

您应该使用虚线形式,但不是因为平台兼容性。

该参数dir/subdir/Hello在此处使用是有效的,因为 Java 的默认ClassLoader实现会正确处理它。但是,并非所有ClassLoader实现都支持这一点。您应该使用点分形式,因为根据文档,ClassLoader.loadClass名称应该是二进制名称JLS 在JLS 13.1的第 1 项中定义了二进制名称:

类或接口必须以其二进制名称命名,必须满足以下约束:

  • 顶级类型的二进制名称是其规范名称。

  • 成员类型的二进制名称由其直接封闭类型的二进制名称组成,后跟$,然后是成员的简单名称。

  • 本地类的二进制名称由其直接封闭类型的二进制名称组成,后跟$,后跟非空数字序列,然后是本地类的简单名称。

  • 匿名类的二进制名称由其直接封闭类型的二进制名称组成,后跟$,然后是非空数字序列。

  • 由泛型类或接口声明的类型变量的二进制名称是其直接封闭类型的二进制名称,后跟$,然后是类型变量的简单名称。

  • 由泛型方法声明的类型变量的二进制名称是声明该方法的类型的二进制名称,后跟$,后跟 The Java Virtual Machine Specification, Java SE 7 Edition 中定义的方法描述符,后跟$,后跟类型变量的简单名称。

  • 由泛型构造函数声明的类型变量的二进制名称是声明构造函数的类型的二进制名称,后跟$,然后是 The Java Virtual Machine Specification, Java SE 7 Edition 中定义的构造函数的描述符,然后是$,后跟类型变量的简单名称。

于 2013-08-01T19:43:37.520 回答
0

使用包名(带点)更好,因为它是跨平台的(请记住 Windows 使用),并且如果您的程序位于 jar 文件中(其中必须指定为类名)\,则更接近于您所需要的Main-Class.

于 2013-08-01T16:40:31.520 回答
0

绝对使用点,因为它可以跨平台运行。Mac/Windows/Linux

于 2013-08-05T00:22:47.580 回答
0

您应该始终使用点,因为这适用于所有操作系统(win/unix/mac)。包不过是目录结构,在 Windows 中用斜杠 (/) 处理,因此 java 能够运行您的程序而不会出现任何错误。

于 2013-08-03T07:21:51.950 回答