7

コンストラクターの1つにパラメーターとして「String」オブジェクトがあることがわかったときに、String.javaソースコードを調べていました。これは簡単に思えますが、私はそれを消化することができません。例えば:

public class Example {

    private String value;

    public Example() {
        // TODO Auto-generated constructor stub
    }

    public Example(Example e){
        value = e.getValue();
    }

    String getValue() {
        return value;
    }
}

クラスExampleを初めてコンパイルするときに、コンパイラーはパラメーターとして「Example」クラスオブジェクトを持つ2番目のコンストラクターに遭遇します。この時点で、まだこのクラスをコンパイルしているので、どのようにそれを見つけるのでしょうか?

4

2 に答える 2

13

クラスがコンパイルされるとき、アクセスする必要があるのは、完全な実装ではなく、クラスの宣言だけです。


言い換えれば、コンストラクターをコンパイルするとき

public Example(Example e) {
    value = e.getValue();
}

知っておく必要があるのは、という名前のクラスが存在Exampleし、メソッドがあることだけgetValueです。この情報は、実際にコードをコンパイルする前に、ソースファイルの別のパスで収集できます。

(ところで、コンストラクターはメソッドとそれほど変わらない動作をします。一見、メソッドをコンパイルする前にコンストラクターをコンパイルする必要があるように見えるかもしれませんが、その理由はコンパイル時の問題と実行時の問題を混同します。)

于 2012-07-13T07:28:22.920 に答える
-1

クラスにコピーコンストラクターがある場合は常に、もう1つのコンストラクターがあります。それがなくてもエラーは発生しませんが、実行時には機能しません。最初にオブジェクトは非コピーコンストラクターを使用して構築する必要があるため、その参照は他のコンストラクターのコンストラクターに渡されます。

これは、他のオブジェクトに「ねえ、私はすでに正常に機能しているいくつかのプロパティを取得しました。同じプロパティを使用することもできます」と伝えるようなものです。

他のオブジェクトがそのプロパティをコピーできるように、コピーされていない構築されたオブジェクトが常に存在することを忘れないでください。

于 2012-07-13T07:44:14.857 に答える