web-dev-qa-db-ja.com

クラス、参照、オブジェクトとは何ですか?

Javaを2年間プログラミングしてきましたが、どうやらクラス、参照、オブジェクトを理解して区別することができないという問題に遭遇したようです。これらの概念を忘れてください)。

問題に取り掛かりましょう。オブジェクトとは何かはすでにわかっていますが、クラスまたは参照が同じかどうかはわかりません。

誰かがクラス、参照、オブジェクトとは何かをわかりやすく、完全に区別できますか?

私が知っているのは、クラスがオブジェクトのテンプレートに似ていることだけです(クラスが青写真で家がオブジェクトである家の設計図)。

48
user962206

コーディングするときは、

インスタンス(発生、コピー)

対象

クラス

そして保つ

参照

そのため、そのメソッドを呼び出すことができます。

また、いくつかの [〜#〜] oop [〜#〜] 基本: クラスオブジェクトインスタンス 、および 参照

12
Marcelo

ブルース・エッケルの著書「Thinking in Java」では、完全に説明されています。

「テレビ(オブジェクト)とリモートコントロール(参照)を想像できます。この参照を保持している限り、テレビに接続できますが、誰かが「チャンネルを変更する」または「下げるあなたが操作しているのは参照であり、それがオブジェクトを変更します。部屋を動き回ってテレビを制御したい場合は、テレビではなくリモート/参照を持ちます。

また、リモコンは、テレビなしで単独で立つことができます。つまり、参照があるからといって、必ずしも参照が接続されているわけではありません。したがって、Wordまたは文を保持する場合は、文字列参照を作成します。

String s;

しかし、ここではオブジェクトのみではなく、参照のみを作成しました。この時点でsにメッセージを送信することにした場合、sは実際には何にも添付されていない(テレビがない)ため、エラーが発生します。したがって、より安全な方法は、参照を作成するときに常に参照を初期化することです。

String s = "asdf";

ただし、これは特別なJava機能を使用します。文字列は引用符付きテキストで初期化できます。通常、オブジェクトにはより一般的なタイプの初期化を使用する必要があります。

参照を作成するとき、それを新しいオブジェクトに接続します。一般的には、new演算子を使用します。キーワードnewは、「これらのオブジェクトの新しいものを作成してください」と言います。したがって、前の例では、次のように言えます。

String s = new String("asdf");

これは、「新しい文字列にする」という意味だけでなく、初期文字列を指定して文字列を作成する方法に関する情報も提供します。もちろん、JavaにはStringに加えて既製の型がたくさんあります。さらに重要なのは、独自の型を作成できることです。実際、新しい型の作成はJavaプログラミング。 "

6
Farbod

そこに2行のコードを書くと仮定します。

Engine app1 = new Engine(); //LINE 1

Engine app2  = app1; //LINE 2

1行目では、エンジンはクラスであり、基本的には青写真です。

new Engine()は、ヒープ上で作成されるinstanceです。

コードでapp1とapp2を使用することでinstanceを参照しています。

したがって、app1とapp2はreferencesです。

3
Sunny Gupta

オブジェクトを作成すると、舞台裏で行われるのは、そのオブジェクトを格納するためにメモリが予約されることです。これは、大きな大きな記憶の風景のどこにでもあり得ます。それはオペレーティングシステムとコンパイラ次第であり、実際にそれがどこで終わるかについての制御や知識はありません。

それでは、メモリ内のどこにあるかわからない場合、そのオブジェクトをどのように使用するかを考えてください。値がどこに保存されているかわからない場合、どのようにして値を読み取ることができますか?これは参照があなたのために何をするかです。それらはオブジェクトと連絡を取り合う方法です。参照であるバルーンに接続されている小さな文字列です。

参照を使用して、「this object now!」に触れる、または「this object!から値を読み取りたい!」と言います。

2
Supr

クラスはテンプレートです、あなたは正しいです。データ構造に関する知識です。オブジェクトは、メモリ内のその構造インスタンスです。参照は、そのインスタンスのメモリアドレスです。

ObjectでJava識別子を意味する場合、Objectはすべての複雑なJavaクラスの基本クラスです。

1
Dims

クラス:構造またはブループリント

オブジェクト:体現形

参照:オブジェクトのアドレス

1
Abishek M

=========クラスとオブジェクト===========

クラス=>例:人(想像力に近い)

オブジェクト=>例:ジョン、マイク(実在の人物)

===========参照============

例:

テレビtv1;テレビはクラス、tv1はテレビのないリモコンです)

---(テレビtv2 =新しいTelevision();現在、tv2リモートコントローラーにはテレビがあります)

---(tv1 = tv2;tv1とtv2は同じテレビを制御できるようになりました)

---(テレビtv3 =新しいTelevision();-(tv3は新しいテレビを備えた新しいリモートコントローラーです)

1
Tsasaa

Objectは、Classdefinitionのランタイム表現です。 オブジェクトを使用する名前referenceと呼ばれます(メモリ内の実際のオブジェクトの場所を参照するため)

MyClass ref = new MyClass();

ここで、MyClassは(含む)class定義です。

new MyClass()は、このクラスに対してobjectを作成します(実行中にのみ行われるため、ランタイム表現)

refは、クラスオブジェクトの操作に使用する名前であり、referenceです。

0
Nrj

クラス:プログラミング環境に実際のエンティティを定義するために使用されます。

少なくとも1つのpropertyと対応するbehaviourを持つ実際のエンティティは、クラスと見なすことができます。 Carの例を見てみましょう。これは、車が動き、速度を制御するのに役立つacceleratorプロパティを持っています。対応する動作はaccelerationです。これは、アクセラレータに適用されるプッシュに直接比例します。

_class Car {
    private String tier;
    private String tierFriction;
    private double weight;
    private double gasFedToEngine;
}
_

上記のクラスは、加速が依存するCarのプロパティをいくつか示しています。動作(_method in the class_)は常にプロパティ(global attribute(s) of the class)に依存します。さらに詳細が必要な場合は、Tierを別のエンティティとして定義すると、定義は次のようになります。

_class Tier {
    private String tierMaterial;
    private String tierFriction;
    private double weight;
    private double tierDiameter;
}

class Car {
    private Tier tier;  // getting all properties of Tier here itself
    private double weight;
    private double gasFedToEngine;
}
_

Object:エンティティのさまざまなフレーバーを定義し、それらに対して個別にデータ操作を実行するために使用されます。

これで、プログラムにエンティティを定義しました。たとえば、中古車のショールームがあり、さまざまな会社の車があります。したがって、各車はエンティティのobjectになります。オブジェクトはアウディ、日産、フェラーリなどです。ショールームを開いた後、このように車を追加します

_static List<Car> showroomCars = new ArrayList<Car>();
public boolean addCarToShowroom() {
    Car carNissan = new Car();  // always creates a new objects and allocates some memory in heap
    carNissan.setName("Nissan");
    carNissan.setColor(RED);
    carNissan.setWeight(300);
    showroomCars.add(carNissan);

    Car carAudi = new Car();
    carAudi.setName("Audi");
    carAudi.setColor(BLACK);
    carAudi.setWeight(270);
    showroomCars.add(carAudi);
}
_

そのため、ショールームに2台の新しい車が追加されました。1台は日産、もう1台はアウディで、それぞれに固有の属性値があります。

Classは定義のみを提供し、操作はObjectで行われます。任意のクラスで操作を行うには、オブジェクトを作成する必要があります。オブジェクトがクラスに対して作成されるたびに、そのすべての非静的(インスタンス)変数はそれぞれのデフォルト値でメモリにロードされます。

参照:オブジェクトのアドレス指定に使用

Car carAudi = new Car();と言うと、Carに新しいオブジェクトを定義し、そのオブジェクトにメモリロケーションが割り当てられます。参照変数carAudiは、そのオブジェクトのメモリアドレスを保持します。オブジェクトはユーザーによって直接アクセスされることはなく、メモリの場所にも直接アクセスされません。参照変数が重要なのは、hexadecimal形式のメモリ位置を保存する場所です。オブジェクトを修正したい場合は、直接ではなく参照の助けを借りて行います。

オブジェクトは任意の数の参照を持つことができますが、参照は一度に1つのオブジェクトのみを指すことができます。

_class Car {
    void test() {
        Car car1 = new Car();  // (1)
        Car car2 = new Car();  // (2)
        car2 = car1;
        /** 
         Says that car2 should point to where car1 points, so now both points to first object of Car
         But for this car2 has to loose its current object-(2), making it an Abandoned object (An object with no active reference from the stack).
        **/
    }
}
_
0
Arun Sudhakaran