我上课Hello
。我已成功编译了.class文件,并将其放入dir / subdir目录,并在其代码中为其分配了dir.subdir包。我想使用java
命令从命令行运行它。
我用命令运行它: java dir / subdir / Hello ,它运行成功!但我在docs中读到它应该用简单的完全限定的类名来完成。我试图执行: java dir.subdir.Hello ,它也成功运行!!
这些方法中哪一种方法更合理,更正确?他们每个人具体意味着什么?它们的根本区别是什么?
答案 0 :(得分:1)
您应该使用虚线形式,但不是因为平台兼容性。
参数dir/subdir/Hello
在此处有效,因为Java的默认ClassLoader
实现正确处理它。但是,并非所有ClassLoader
实现都支持此功能。您应该使用虚线形式,因为根据ClassLoader.loadClass
中的文档,名称应该是binary names。 JLS在JLS 13.1中定义二进制名称,第1项:
类或接口必须以其二进制名称命名,该名称必须满足以下约束:
顶级类型的二进制名称是其规范名称。
成员类型的二进制名称由其直接封闭类型的二进制名称组成,后跟
$
,后跟成员的简单名称。本地类的二进制名称由其直接封闭类型的二进制名称组成,后跟
$
,后跟非空数字序列,后跟本地的简单名称类。匿名类的二进制名称由其直接封闭类型的二进制名称组成,后跟
$
,后跟非空数字序列。泛型类或接口声明的类型变量的二进制名称是其直接封闭类型的二进制名称,后跟
$
,后跟类型变量的简单名称。泛型方法声明的类型变量的二进制名称是声明方法的类型的二进制名称,后跟
$
,后跟Java虚拟中定义的方法描述符机器规范,Java SE 7版,后跟$
,后跟类型变量的简单名称。泛型构造函数声明的类型变量的二进制名称是声明构造函数的类型的二进制名称,后跟
$
,后跟Java虚拟程序中定义的构造函数的描述符机器规范,Java SE 7版,后跟$
,后跟类型变量的简单名称。
答案 1 :(得分:0)
使用包名称(带点)更好,因为它是跨平台的(请记住Windows使用\
)并且更接近于程序在jar文件中所需的内容(其中{ {1}}必须指定为类名。)
答案 2 :(得分:0)
你应该总是使用点,因为这适用于所有操作系统(win / unix / mac)。包只是目录结构,在windows中用斜杠(/)处理,所以java能够运行你的程序而没有任何错误。
答案 3 :(得分:0)
绝对使用点,然后才能跨平台运行。 MAC / WINDOWS / Linux的