2

私は簡単なコードを持っています:

public class Hello
{
    public static void main(String[] args)
    {
        System.out.println("Hello World");
    }
}

すべてのJavaプログラムでクラスがデフォルトでインポートされることは知っていますが、または関数を使用している場合、クラスもデフォルトでインポートされるObjectかどうかを尋ねたかったのですか?PrintStreamprint()println()

Objectクラスはjava.langパッケージにPrintStream属し、クラスはパッケージに属しているためjava.io、デフォルトでインポートされていない場合、クラスのprintln()メソッドをどのように使用できるのPrintStreamでしょうか?

それ(PrintStreamクラス)がデフォルトでインポートされない場合、逆コンパイラがそれをインポートするのはなぜですか?

これは、逆コンパイル後の出力です。 この画像をチェック

4

3 に答える 3

0

print() または println() 関数を使用している場合、デフォルトで PrintStream クラスもインポートされるかどうかを尋ねたかった

いいえ、JLS から:

コンパイル ユニットは、そのパッケージで宣言されているすべての型に自動的にアクセスでき、定義済みパッケージで宣言されているすべてのパブリック型を自動的にインポートしますjava.lang

に属してSystemいるので使えます。java.lang


デフォルトでインポートされていない場合、PrintStream クラスの println() メソッドをどのように使用できるのでしょうか?

あなたのタイプSystem.outアクセスできるので、すべての目に見えるメソッドを使用できますSystem.out

于 2015-08-20T18:36:46.213 に答える
0

逆コンパイラがそれをインポートする理由

使用している逆コンパイラのバグのようです。このインポートは、ここでは完全に不要です。

次のように完全修飾クラス名を使用するだけで、インポートなしでプログラミングできます。

java.io.PrintStream out = System.out;

インポートは便宜上のみ使用されるため、コード内で単純なクラス名を使用できます。同じ単純な名前が異なるパッケージ (たとえばjava.awt.Listjava.util.List) に表示される可能性があるため、このあいまいさを解決するには、完全なクラス名を使用するか、必要なものをインポートする必要があります (両方を使用する場合でも、それらのいずれかにフルネームを使用する必要があります)。あなたが正しく述べたように、デフォルトでは常にからのクラスのみ java.langがインポートされます。繰り返しますが、これは便宜上行われているため、System代わりに ofを使用できますjava.lang.System(ただし、これjava.lang.System.out.println()も有効です)。

あなたの例PrintStreamでは、ソースに直接言及していないため、インポートする必要はありません。インポートは、クラスのロード (コンパイル時ではなく、実行時に発生します) とは何の共通点もありません。

于 2015-08-22T03:27:45.793 に答える