Javaのクラス、オブジェクト、インスタンスとは何ですか?
16 に答える
クラスは、オブジェクトの作成に使用する設計図です。オブジェクトはクラスのインスタンスです。特定のクラスを使用して作成した具体的な「もの」です。したがって、「オブジェクト」と「インスタンス」は同じものですが、「インスタンス」という言葉はオブジェクトとそのクラスの関係を示します。
これは例を見れば分かりやすいです。たとえば、 class があるとしますHouse
。自分の家はオブジェクトであり、クラスのインスタンスですHouse
。あなたの妹の家は別のオブジェクト (クラスの別のインスタンスHouse
) です。
// Class House describes what a house is
class House {
// ...
}
// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();
classHouse
は、家とは何かという概念を記述し、 class のオブジェクトとインスタンスである特定の具体的な家がありますHouse
。
注: これは、すべてのオブジェクト指向プログラミング言語とまったく同じです。
Java (およびその他のプログラミング言語) は、型と値の観点からモデル化されています。理論的なレベルでは、値は情報の量子の表現であり、型は値のセットです。値 Xがタイプ Y のインスタンスであると言うとき、単に X がタイプ Y である値のセットのメンバーであると言っているだけです。
これが「インスタンス」という用語の本当の意味です。これは、物ではなく関係を表します。
Java プログラミング言語の型システムは、プリミティブ型と参照型の 2 種類の型をサポートしています。参照型は、さらにクラスと配列型に分けられます。Javaオブジェクトは参照型のインスタンスです。
オブジェクトは、クラス インスタンスまたは配列です。( JLS 4.3.1 )
それが型理論の見方です。
実際には、ほとんどの Java 開発者は、「インスタンス」と「オブジェクト」という言葉を同義語として扱います。(そして、私も含めて、簡単に説明しようとしています。) ほとんどの開発者は、プリミティブ型のインスタンスを参照するために、「インスタンス」ではなく「値」という言葉を使用します。
クラスは基本的に定義であり、オブジェクトのコードを含みます。オブジェクトはクラスのインスタンスです
たとえば、あなたが言うなら
String word = new String();
このクラスは、オブジェクト (インスタンス) 単語を記述する String クラスです。
クラスが宣言されると、メモリは割り当てられないため、クラスは単なるテンプレートです。
クラスのオブジェクトが宣言されると、メモリが割り当てられます。
Jesperの素人の言葉での説明が好き
Jesperの答えから例を即興で作ることで、
class House {
// blue print for House Objects
}
class Car {
// blue print for Instances of Class Car
}
House myHouse = new House();
Car myCar = new Car();
myHouse と myCar はオブジェクトです
myHouse は House のインスタンスです (Object-myHouse をその Class-House に関連付けます) myCar は Car のインスタンスです
要するに
「myHouse はClass House のインスタンスです」は、「myHouse はタイプHouseのオブジェクトです」と言っているのと同じです
クラスはデータ型です。この型を使用してオブジェクトを作成します。
インスタンスは論理的ですが、オブジェクトは物理的であることは、メモリを占有することを意味します。
抽象クラスとインターフェイスのインスタンスを作成できますが、それらのオブジェクトを作成することはできません。オブジェクトはクラスのインスタンスであり、インスタンスはクラス、つまりオブジェクトの代表を意味します。
インスタンスとは、オブジェクトの参照を指します。
オブジェクトは実際にはそのインスタンスのメモリ アドレスを指しています。
レイヤーを介してインスタンスを渡すことはできませんが、レイヤーを介してオブジェクトを渡すことはできます
インスタンスは保存できませんが、オブジェクトは保存できます
1 つのオブジェクトが複数のインスタンスを持つことができます。
インスタンスはクラス定義とオブジェクト定義の両方を持ちますが、オブジェクトの場合はオブジェクト定義のみを持ちます。
オブジェクトの構文:
Classname var=new Classname();
ただし、インスタンスの作成では、オブジェクトを参照するポインターのみを返します。構文は次のとおりです。
Classname varname;
Javaでは、オブジェクトはヒープメモリに生成されます。これらには、当社のアプリケーションで指定および使用される参照が必要です。参照には、アプリケーションでオブジェクトを使用できるオブジェクトのメモリ位置があります。要するに、参照は、メモリの場所にインスタンス化されたオブジェクトのアドレスを保存する変数の名前に他なりません。
アンinstance
は の総称ですobject
。参考までObject
に、クラスです。
例えば、
Class A{
}
A ref = new A();
上記のコード スニペットの場合、ref はヒープ上に生成されたクラス A のオブジェクトの参照です。
車をモデル化するプログラムがある場合、車を表すクラスがあるため、コードでは次のように言えます。
Car someCar = new Car();
someCar は Car クラスのインスタンスになりました。プログラムが修理工場で使用され、 someCar がそのシステムであなたの車を表している場合、あなたの車がオブジェクトです。
したがって、Car は現実世界のあらゆる車を表すことができるクラスです someCar は Car クラスのインスタンスであり、someCare は1 つの現実のオブジェクト (あなたの車)を表します
ただし、インスタンスとオブジェクトは、コーディングの議論になると、ほとんど同じ意味で使用されます
コンピュータが保存および処理するあらゆる種類のデータは、最も基本的な表現ではビットの列です。これらのビットが解釈される方法は、データ型によって行われます。データ型は、プリミティブまたは複合型にすることができます。プリミティブ データ型は、たとえば int または double です。それらには、特定の長さと特定の解釈方法があります。整数の場合、通常は最初のビットが符号に使用され、残りのビットが値に使用されます。
複合データ型は、プリミティブ データ型と他の複合データ型の組み合わせであり、Java では「クラス」と呼ばれます。
姓名と呼ばれる 2 つの文字列で構成される複合データ型 PeopleName を定義できます。Java の各文字列は、もう 1 つの複雑なデータ型です。返される文字列は (おそらく) プリミティブ データ型 char を使用して実装されます。Java は、格納に必要なビット数とその解釈方法を認識しています。
データ型のインスタンスを作成すると、オブジェクトが取得され、コンピューターはそのオブジェクト用にメモリを予約し、その場所とそのインスタンスの名前を記憶します。メモリ内の PeopleName のインスタンスは、2 つの String 変数のスペースに加えて、簿記のためにもう少し多くのスペースを占有します。Java では、整数は 32 ビットを占めます。
複合データ型には、メソッドを割り当てることができます。メソッドは、引数に対して、またはこのメソッドを呼び出すデータ型のインスタンスに対してアクションを実行できます。p1 と p2 という名前の PeopleName の 2 つのインスタンスがあり、メソッド p1.getFirstName() を呼び出すと、通常、最初の人の名前は返されますが、2 番目の人の名前は返されません。
クラスとオブジェクトの背後にある概念は、ロジックを単一のプログラミング単位にカプセル化することです。クラスは、オブジェクトが作成される青写真です。
Car を表すクラスの例を次に示します。
public class Car {
int currentSpeed;
String name;
public void accelerate() {
}
public void park() {
}
public void printCurrentSpeed() {
}
}
次のようにオブジェクトCarのインスタンスを作成できます。
Car audi = new Car();
Car toyota = new Car();
このチュートリアルの例を取り上げました
上記の答えは正しいですが、クラスとオブジェクトについての別の考え方は、実際の例を使用することです: Animal という名前のクラスには、Cat、Dog、Fish などのオブジェクトが含まれる場合があります。Bible というタイトルのオブジェクトはクラス Book などになります。クラスは一般的なもので、オブジェクトは特定のものです。この思考例は、私が Java を学んでいたときに役立ちました。