8

私はクラスを持っていHelloます。そこから .class ファイルを正常にコンパイルし、それを dir/subdir ディレクトリに配置し、コードで dir.subdir パッケージを割り当てました。そして、コマンドを使用してコマンドラインから実行したいと思いjavaます。

コマンドで実行しました: java dir/subdir/Helloで、正常に実行されました! しかし、私はそれが単に完全修飾されたクラス名で行われるべきであることをドキュメントで読みました。私は実行しようとしました: java dir.subdir.Helloそして、それも正常に実行されました!!

これらの方法のどれが健全なアプローチであり、より正確ですか? それぞれの具体的な意味は?それらの根本的な違いは何ですか?

4

4 に答える 4

1

ドット形式を使用する必要がありますが、プラットフォームの互換性のためではありません。

dir/subdir/HelloJava のデフォルトのClassLoader実装では引数が正しく処理されるため、ここでの引数の使用は有効です。ただし、すべてのClassLoader実装がこれをサポートしているわけではありません。ドキュメンテーションによると、名前はバイナリ名ClassLoader.loadClassであると想定されているため、ドット形式を使用する必要があります。JLS は、 JLS 13.1の項目 1でバイナリ名を定義します。

クラスまたはインターフェイスは、次の制約を満たす必要があるバイナリ名で命名する必要があります。

  • トップレベルの型のバイナリ名は、その正規名です。

  • メンバー型のバイナリ名は、すぐ外側の型のバイナリ名、$、メンバーの単純名で構成されます。

  • ローカル クラスのバイナリ名は、すぐ外側の型のバイナリ名、 、$空でない一連の数字、ローカル クラスの単純名で構成されます。

  • 匿名クラスのバイナリ名は、すぐ外側の型のバイナリ名と、それに$続く 、空でない一連の数字で構成されます。

  • ジェネリック クラスまたはインターフェイスによって宣言された型変数のバイナリ名は、すぐ外側の型のバイナリ名であり、その後に が続き$、その後に型変数の単純名が続きます。

  • ジェネリック メソッドによって宣言された型変数のバイナリ名は、メソッドを宣言する型のバイナリ名であり、その後に が続き$、その後に Java Virtual Machine Specification, Java SE 7 Edition で定義されているメソッドの記述子が続き、その後に , が続きます$。型変数の単純な名前が続きます。

  • 汎用コンストラクターによって宣言された型変数のバイナリー名は、コンストラクターを宣言する型のバイナリー名であり、その後に が続き$、その後に Java Virtual Machine Specification, Java SE 7 Edition で定義されているコンストラクターの記述子が続き、その後に , が続きます$。型変数の単純な名前が続きます。

于 2013-08-01T19:43:37.520 に答える
0

間違いなくドットを使用すると、クロスプラットフォームの実行が可能になります。Mac/Windows/Linux

于 2013-08-05T00:22:47.580 に答える
0

これはすべての OS (win/unix/mac) で機能するため、常にドットを使用する必要があります。パッケージは、Windows ではスラッシュ (/) で処理されるディレクトリ構造に他ならないため、Java はエラーなしでプログラムを実行できます。

于 2013-08-03T07:21:51.950 に答える