1

new今日、セパレーター ( .、または「ドット演算子」)と一緒に演算子を使用できることを学びました。これは、Java が new 演算子のすべての出現に対して暗黙的に同じ手法を使用するかどうか疑問に思いました。

次のステートメントは、新しい「InnerClass オブジェクト」を作成します。を使用して、新しい ParentClass オブジェクトでこれを行います.new。ただし、newこのステートメントの最初の演算子の前にコンストラクター (またはオブジェクト) がありません。では、Java はコンパイル時に 1 つ追加しますか? このステートメントに( ) を明示的に追加しようとMain()しましたが、コードはコンパイルされません。

ParentClass.InnerClass ic = new ParentClass().new InnerClass();
4

3 に答える 3

3

フォーム

someObject.new InnerClass()

内部クラスにのみ使用されます。内部クラスのインスタンスは、それを囲むクラスのインスタンスに関連付ける必要があります。多くの場合this、外側のインスタンスは であり、ドット表記の必要性を否定しますが、別のオブジェクトに関連付けられた内部クラスのインスタンスを明示的に作成する場合は、上記の構文を使用します。

Java のほとんどのクラスは内部クラスではありません。囲んでいるインスタンスは必要ないため、Java はnew Something()すべてのnew呼び出しの前に暗黙的に挿入しません。(もしそうなら、new Something()挿入された呼び出しのnew Something()前とそれらの前に挿入する必要があり、何も構築できませんでした。)

于 2013-12-23T10:11:03.130 に答える
1

私はこれの内部を見ていませんが、最初に、コンパイラがコンパイル時に新しいオブジェクトを追加すると仮定しましょう。これは、すべてのクラスが別のクラスの内部クラスであることを意味します。それらは別のクラス内で宣言されていないため、これは当てはまりません。だから:いいえ、コンパイル時にこのようなものを追加しません。

実際に、これを分解してみましょう。

public class Outer {

    String strHello = "Hello ^^";

    public void printHello() {
        System.out.println(strHello);
    }

    public static void main(String[] args) {

        // This will print: Hello ^^
        Outer outer = new Outer();
        outer.printHello();

        // This will print: Hello ^^
        new Outer().printHello();
    }
}

このようなコードを以前に見たことがあると思います。インスタンス化されたクラスのメソッドを呼び出すだけです。ドット表記を使用して、変数や内部クラスにアクセスすることもできます。上記では、インスタンスメソッドに使用しました。キーワードをstatic使用すると、クラスのすべてのインスタンスまたは個別のクラスでメソッドと変数を共有できます。

public class Outer {

    static String strHello = "Hello ^^";

    public static void printHello() {
        System.out.println(strHello);
    }

    static class StaticInner {
    }

    static class Inner {
    }

    public static void main(String[] args) {

        // Prints: Hello ^^
        Outer.printHello();

        // Constructs a new Example.StaticInner
        Outer.StaticInner inner = new Outer.StaticInner();

        // Constructs a new Outer.Inner     
        Outer.Inner inner = new Example().new Inner();

        // Constructs a new Outer.Inner
        Example ex = new Example();
        Outer.Inner inner = ex.new Inner();
    }
}

上記のコードは、静的な内部クラスを使用して、内部コンストラクターが他のコンストラクターとまったく同じであることを示しています。ただし、別のクラス内にあるため、別の (外部) クラスを介してアクセスする必要があります。静的な内部クラスではない場合、アクセス修飾子のためにインスタンスを使用してアクセスする必要があります。

于 2013-12-23T10:47:25.640 に答える