1

違いは何ですか

ClassABC objectName = new ClassABC();

ClassABC objectName = differentVariable.methodReturnsClassABCTypeValue();

2 番目の例は最初の例と同じように開始されますか? いいえの場合、これら 2 種類の「初期化」の違いは何ですか?

これが紛らわしい場合は、別の Java クラスを使用した 2 番目の例を示します。

Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = new Dimension();

Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();

new Dimension();最初の例で Dimension オブジェクトを作成し、それに値を設定しなかったことに注目してください。 toolKitObject.getScreenSize();

4

5 に答える 5

13

Java でオブジェクトを作成するには、さまざまな方法があります。

A. new キーワードの使用 Java でオブジェクトを作成する最も一般的な方法です。オブジェクトのほぼ 99% は、この方法で作成されます。

MyObject object = new MyObject();

B. Class.forName() の使用 クラスの名前が分かっていて、そのクラスに public デフォルト コンストラクタがある場合、この方法でオブジェクトを作成できます。

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

C. clone() の使用 clone() を使用して、既存のオブジェクトのコピーを作成できます。

MyObject anotherObject = new MyObject();
MyObject object = anotherObject.clone();

D. オブジェクトの逆シリアル化の使用 オブジェクトの逆シリアル化は、シリアル化された形式からオブジェクトを作成することに他なりません。

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

E. リフレクションを別の方法で使用する。

this.getClass().getClassLoader().loadClass(“com.abc.myobject”).newInstance();
于 2013-04-21T09:18:18.503 に答える
3

Achintya さんの回答は気に入っていますが、質問よりも回答が進んでいるような気がします。

Java では、変数 (整数などのプリミティブ型を除く)はメモリ内のオブジェクトを参照します。

したがって、次のスニペットは、2 つの異なる変数によって参照されるオブジェクトを 1 つだけ作成します。

Object a = new Object();
Object b = a;

より隠された方法ではありますが、同じことがあなたの例でも起こります。

次のスニペットは、Toolkitオブジェクトを作成します。このオブジェクトには、オブジェクトが含まれていDimensionます。2 行目は、既存のオブジェクトへの参照を作成するだけです。

Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();
于 2013-04-21T09:30:52.950 に答える
1

どちらの例も、new演算子を使用することになります。

Dimension screenSize = toolKitObject.getScreenSize();

getScreenSize上記の行で呼び出しているソースコードは次のとおりです。

// implementation as per SunToolkit.class
public Dimension getScreenSize() {
    return new Dimension(getScreenWidth(), getScreenHeight());
}

舞台裏では、new Dimension(高さと幅を取得するオーバーロードされたバージョン) がまだ呼び出されていることがわかります。

于 2013-04-21T09:37:32.537 に答える
0

下の行で

ClassABC objectName = new ClassABC();

ヒープに新しいインスタンスを作成し、スタックに新しい参照を作成し、この新しいオブジェクト参照を作成された新しい参照に割り当てます。. したがって、このコードを使用すると、確実にヒープ上に新しいオブジェクトを取得できます。したがって、上記の行 objectName が確実に null になることはありません。

でもこれで

ClassABC objectName = differentVariable.methodReturnsClassABCTypeValue()

スタックに新しい参照のみを作成しています。メソッド内で作成/参照される可能性のあるヒープ上の既存のオブジェクトにそれを向けます。

したがって、この段階では、間違いなくスタックに参照が作成されます。ただし、新しいオブジェクトがヒープ上に作成されるかどうかは、メソッドの実装に依存します。

したがって、上記の行 objectName の後、メソッドから返されたものに応じて、null または非 null になる可能性があります。. それが物事をクリアすることを願っています。

于 2013-04-22T05:33:24.037 に答える
0

いいえ。!!

2番目のものはオブジェクトを作成しません。別のメソッドから作成されたオブジェクトを取得します。そのメソッドが新しいオブジェクトを作成する場合は問題ありません。そのメソッドが既存のメソッドを使用している場合は、いいえ。

于 2013-04-21T09:18:09.603 に答える