5

Java がコピー コンストラクターをどのようにサポートしているか、C++ とどのように違うのか興味がありますか? ストーリーのコンパイラ側から、3 つのルール (コピー コンストラクタ、デストラクタ、代入演算子) を実行するロジックに相当する Java を理解したいと思います。

4

2 に答える 2

8

Java には、コピー コンストラクターに対する特定の言語サポートはありません。むしろ、コンストラクターで手動でコピーする状態をコーディングするだけです。例えば

public class Person {
    private String firstName;
    private String lastName;

    public Person(Person other) {
        this.firstName = other.firstName;
        this.lastName = other.lastName;
    }
    ...
}

ストーリーのコンパイラ側から、3 つのルール (コピー コンストラクタ、デストラクタ、代入演算子) を実行するロジックに相当する Java を理解したいと思います。

コピーコンストラクタは上記の通りです。本当に単なる(単純な)デザインパターンです。

Java は、C++ 代入演算子の読み込みに相当するものを提供していません。Java は、プリミティブ型と参照型の割り当てをサポートしていますが、C++ と同じ方法でのオブジェクトの割り当てはサポートしていません。Java で値を割り当てるときに特別なアクションが必要になることはめったにありません。これを行う必要がある場合は、ロジックをセッターメソッドに入れるのが通例です。

Java は、いくつかの点で C++ デストラクタにfinalize似ているメソッドをサポートしています。主な違いは、メソッドは変数を参照しないオブジェクトに対する操作であり、通常、オブジェクトの最後の参照がスコープ外になってからかなりの時間が経過してから呼び出されることです。finalize

ただし、メソッドを使用する必要はほとんどありません。finalize

  • Java は完全にガベージ コレクションを行う言語であり、メモリ管理の最善の戦略は、GC に処理させることです。

  • 他のリソースは、「try / finally」または「try with resources」を使用して管理するのが最適です。

私の知る限り、メソッドの唯一の健全なユースケースfinalizeは、誤って失われたリソースをクリーンアップすることです。たとえば、誰かが推奨されるメカニズムを使用してそれらを「閉じる」のを忘れたためです。

于 2013-09-28T03:01:22.860 に答える
5

Java にはオブジェクトへの参照しかありません。インライン (スタック上またはオブジェクト内) オブジェクトを宣言することはできません。

コピーコンストラクター

Javaにはそれがありません。あなたはそれを書くことができますが、これはめったに行われません。

、デストラクタ

Javaにはそれがありません。それは持っていますfinalize()が、これは非常にお勧めできません。

代入演算子

Javaにはオブジェクト用のものはなく、オブジェクトへの参照のみがあります。

于 2013-09-28T03:04:09.497 に答える