web-dev-qa-db-ja.com

Javaの参照とオブジェクトの違いは何ですか?

私はクラスGUIを持っているので、次のようなオブジェクトを作成できます。

GUI g1 = new GUI();

そして、このような参照変数:

GUI g2;

今私が知る限り、g2はGUIクラスへの参照を与える参照変数であり、g1はGUIクラスのオブジェクトです。 g1とg2の違いは何ですか?オブジェクトでGUIクラスのプロパティを使用できますが、g2の可能な使用法は何ですか?

19
Rahul Virpara

参照は名前です。オブジェクトはものです。実際には存在しないものでも、異なる名前を付けることができます。

次のように、実際に意味を持たせずに名前を宣言できます。

GUI g1;

=演算子を使用して、名前に意味(参照する実際のもの)を名前に割り当てることができます。

GUI g1 = some_gui;

名前は時間の経過とともに意味が変わる可能性があります。同じ名前は、歴史のさまざまな時点でさまざまなものを参照できます。

GUI g1 = some_gui;

doSomething();

g1 = some_other_gui;

同義語もあります:複数の名前が同じものを参照できます:

GUI g2 = g1;

これは、参照が行うこととほぼ同じです。彼らはものを指すことを意図した名前です。

スタッフを作成できます:

new GUI();

後で参照するために、その場でスタッフを作成して名前を付けることができます(文字通り!):

GUI g1 = new GUI();

そして、その名前(またはその名前のいずれか)を使用して、ものを参照できます:

g1.doSomething();
g2.doSomethingAgain();

同じ種類の異なるもの(クラス)を作成し、異なる名前を付けることができます。

GUI g1 = new GUI();
GUI g2 = new GUI();
GUI g3 = new GUI();

GUI g1_synonym = g1;

:)

27
slezica

Javaの参照とオブジェクトの違いは何ですか?

参照は、そのタイプのオブジェクトにアクセスする方法を提供するエンティティです。オブジェクトは、そのクラスまたはタイプのメンバーにアクセスする方法を提供するエンティティです。

一般に、オブジェクトへの参照がないと、オブジェクトにアクセスできません。

class GUI
{
    void aMethod()
    {
        // some business logic.
    }
}

aMethodは、参照の有無にかかわらず呼び出すことができます。しかし、間違いなくオブジェクトが必要です。

リファレンスなし:

new GUI().aMethod(); 
// you can't reuse the object
// bad way to code.

参照して:

GUI aGUIReference = new GUI();
aGUIReference.aMethod();
// Now, the object can be reused.
// Preferred way to code

ここで、コード行について少し説明します。

GUI g1 = new GUI();
// g1 is a reference to an object of GUI class.

GUI g2;
// g2 is a reference that can point to an object of GUI class
// but currently not pointing to any.

唯一の違いb/w g1およびg2はそのg1はオブジェクトで初期化されますが、g2nullを指します

g2 = g1;
// it means g2 will point to the same object g1 is pointing to
// only one object but two references.
15
Azodious

g2はすでにGUIオブジェクトを指しており、それを使用することができますが、現在はオブジェクトを指していないため、オブジェクトを割り当てるまでg1を使用できません。

この:

GUI g1 = new GUI();

とほぼ同等です:

GUI g1;
g1 = new GUI();
5
MByD

Referencesは、objects.と呼ばれるメモリブロックへのポインタの一種です

GUI g1 = new GUI();

説明のために、上のステートメントを壊してみましょう。

GUI g1;
g1 = new GUI();

最初のステップ:g1は参照変数(ポインタ)であり、まだ有効なメモリ位置を指し示していません。

2番目のステップ:2番目のステップは、クラスGUIのオブジェクトにメモリを割り当て、割り当て操作は、参照変数g1がこのオブジェクト(メモリロケーション)を指すようにします。 newキーワードは、クラスGUIのオブジェクトにメモリを割り当てます。

3
Sumit Trehan

オブジェクトは、ヒープと呼ばれる空間を浮遊する泡のようなものです。変数はこれらのバブルへのリンクにすぎません。式new GUI()はオブジェクトを作成し、=演算子はそれを変数g1にリンクします。 g2も変数ですが、どのオブジェクトにもリンクされていません。あなたは書くことで簡単にそれらを交換することができます

g2 = g1;
g1 = null;

現在、g2g1が最初に参照していたオブジェクトを参照し、g1は何も参照していません。オブジェクトはそのままで、変数のみが変更されました。

2
Eser Aygün

参照は、オブジェクトを掛けることができる「フック」です。オブジェクトは複数のフックにある場合があります。

0
Chriseyre2000

実際にはJava変数の名前は参照です(プリミティブ型を除く)。g2は初期化されておらず、nullでもないため、使用できません。 g2のメソッドを呼び出そうとすると、コンパイル時エラーが発生します。GUI g2;の後、g2はメモリ内のオブジェクトを指していません。このようにg2をnullに設定すると、GUI g2 = null;宣言後に使用しますが、g2のメソッドを呼び出すと、ランタイムNullPointerExceptionが発生します。

0
shift66

G1とg2はどちらも参照です。しかし、g2は初期化されていないため、コードで使用できませんでした。

//Tells that g1 g2 should hold Gui object. Currently they are not holding any object.
Gui g1;
Gui g2;

//Now g1 reference holds object. g2 reference still doesn't point to any object.
g1 = new GUI();

参照は名前です。オブジェクトはものです。実際には存在しないものでも、異なる名前を付けることができます。

次のように、実際に「実際の」意味を与えることなく、名前を宣言できます。

GUI g1;

名前は時間の経過とともに意味が変わる可能性があります。同じ名前が異なるときに異なるものを参照する場合があります。

GUI g1 = some_gui;

doSomething();

g1 = some_other_gui;

これは、参照が行うこととほぼ同じです。彼らはものを指すことを意図した名前です。

スタッフを作成できます:

new GUI();

後で参照するために、その場でスタッフを作成して名前を付けることができます(文字通り!):

GUI g1 = new GUI();

:)

0
slezica