Javaのクラス、オブジェクト、インスタンスとは何ですか?
Java(およびその他のプログラミング言語)は、typesおよびvaluesの観点からモデル化されています。理論レベルでは、valueは情報の一部の表現であり、typeは値のセットです。値XがタイプYのインスタンスであると言うとき、XはタイプYである値のセットのメンバーであると単純に言っています。
それが、「インスタンス」という用語が本当に意味するものです。それは、物ではなく関係を表します。
Javaプログラミング言語の型システムは、2種類の型、プリミティブ型および参照型をサポートします。参照型は、さらにclassesおよびarray typesに分類されます。 Javaobjectは、参照型のインスタンスです。
オブジェクトは、クラスインスタンスまたは配列です。 ( JLS 4.3.1 )
それが型理論的なビューです。
実際には、ほとんどのJava開発者は、「インスタンス」と「オブジェクト」という単語を同義語として扱います。 (そして、それは私を含んでいて、私はすぐに何かを説明しようとしています。)そして、ほとんどの開発者はプリミティブ型のインスタンスを参照するために「インスタンス」ではなく「値」という言葉を使用します。
classは、objectsの作成に使用する青写真です。オブジェクトは、クラスのインスタンスです。特定のクラスを使用して作成した具体的な「もの」です。したがって、「オブジェクト」と「インスタンス」は同じものですが、「インスタンス」という言葉は、オブジェクトとそのクラスの関係を示しています。
例を見れば、これは簡単に理解できます。たとえば、クラス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();
クラスHouse
は家の概念を説明し、クラスHouse
のオブジェクトおよびインスタンスである特定の具体的な家があります。
注:これは、Javaでもすべてのオブジェクト指向プログラミング言語とまったく同じです。
クラスは基本的に定義であり、オブジェクトのコードが含まれています。オブジェクトはクラスのインスタンスです
たとえば、あなたが言うなら
String Word = new String();
このクラスは、オブジェクト(インスタンス)Wordを記述するStringクラスです。
クラスが宣言されると、メモリは割り当てられないため、クラスは単なるテンプレートになります。
クラスのオブジェクトが宣言されると、メモリが割り当てられます。
素人用語でのジェスパーの説明が好き
ジェスパーの回答から即興で例を挙げれば、
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はインスタンス of クラス House」で、これは「myHouseはObject of type House」と同じです」
クラスはデータ型です。この型を使用してオブジェクトを作成します。
インスタンスは論理的ですが、オブジェクトは物理的手段であり、メモリを占有します。
インターフェイスだけでなく抽象クラスのインスタンスも作成できますが、作成することはできません
それらのオブジェクト。
オブジェクトはクラスのインスタンスであり、インスタンスはクラスの代表、つまりオブジェクトを意味します。
インスタンスとは、オブジェクトの参照を指します。
オブジェクトは、実際にはそのインスタンスのメモリアドレスを指しています。
インスタンスをレイヤーに渡すことはできませんが、オブジェクトをレイヤーに渡すことはできます
インスタンスは保存できませんが、オブジェクトは保存できます
1つのオブジェクトに複数のインスタンスを含めることができます。
インスタンスにはクラス定義とオブジェクト定義の両方があり、オブジェクトの場合と同様にオブジェクト定義のみがあります。
オブジェクトの構文:
Classname var=new Classname();
しかし、インスタンスの作成では、オブジェクトを参照するポインターのみを返します。構文は次のとおりです。
Classname varname;
Javaでは、オブジェクトはヒープメモリ上に生成されます。これらを参照するには、アプリケーションでポイントして使用する必要があります。参照には、アプリケーションでオブジェクトを使用できるオブジェクトのメモリ位置があります。要するに参照は、メモリの場所でインスタンス化されたオブジェクトのアドレスを格納する変数の名前に他なりません。
instance
は、object
の一般的な用語です。参考までに、Object
はクラスです。
例えば、
Class A{
}
A ref = new A();
上記のコードスニペットでは、refはヒープで生成されたクラスAのオブジェクトの参照です。
クラスとオブジェクトの背後にある概念は、ロジックを単一のプログラミングユニットにカプセル化することです。 クラスは、オブジェクトが作成される青写真です。
ここに、車を表すクラスの例:
public class Car {
int currentSpeed;
String name;
public void accelerate() {
}
public void park() {
}
public void printCurrentSpeed() {
}
}
次のようなobjectCarのinstancesを作成できます:
Car audi = new Car();
Car toyota = new Car();
このチュートリアル から例を取りました
正直なところ、私は Alfred blog の定義についてより快適に感じています。
Object:現実世界のオブジェクトは、2つの主要な特性、状態および動作を共有します。人間には状態(名前、年齢)と行動(実行中、睡眠中)があります。車には状態(現在の速度、現在のギア)と動作(ブレーキの適用、ギアの変更)があります。ソフトウェアオブジェクトは、概念的には実世界のオブジェクトに似ています。それらも状態と関連する動作で構成されています。オブジェクトはその状態をフィールドに保存し、メソッドを介してその動作を公開します。
Class:オブジェクトの作成に使用される「テンプレート」/「ブループリント」です。基本的に、クラスはフィールド、静的フィールド、メソッド、静的メソッド、コンストラクターで構成されます。フィールドは、クラスの状態を保持するために使用されます(例:Studentオブジェクトの名前)。メソッドは、クラスの動作を表すために使用されます(例:Studentオブジェクトがどのように立ち上がるか)。コンストラクターは、クラスの新しいインスタンスを作成するために使用されます。
Instance:インスタンスは、オブジェクトを表すクラスの一意のコピーです。クラスの新しいインスタンスが作成されると、JVMはそのクラスインスタンスにメモリの領域を割り当てます。
次の例を考えます:
public class Person {
private int id;
private String name;
private int age;
public Person (int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (id != other.id)
return false;
return true;
}
public static void main(String[] args) {
//case 1
Person p1 = new Person(1, "Carlos", 20);
Person p2 = new Person(1, "Carlos", 20);
//case 2
Person p3 = new Person(2, "John", 15);
Person p4 = new Person(3, "Mary", 17);
}
}
ケース1の場合、クラスPersonの2つのインスタンスがありますが、両方のインスタンスは同じオブジェクトを表します。
ケース2では、Personクラスの2つのインスタンスがありますが、各インスタンスは異なるオブジェクトを表します。
したがって、クラス、オブジェクト、およびインスタンスは異なるものです。オブジェクトとインスタンスは、正しい答えとして選択された答えで提案されている同義語ではありません。
コンピュータが保存および処理するあらゆる種類のデータは、その最も基本的な表現ではビット列です。これらのビットの解釈方法は、データ型を介して行われます。データ型は、プリミティブまたは複雑な場合があります。プリミティブデータ型は、たとえば、intまたはdoubleです。特定の長さと特定の解釈方法があります。整数の場合、通常は最初のビットが符号に使用され、他のビットは値に使用されます。
複合データ型は、プリミティブデータ型と他の複合データ型の組み合わせであり、Javaでは「クラス」と呼ばれます。
姓と名という2つの文字列で構成される複雑なデータ型PeopleNameを定義できます。 Javaの各文字列は、別の複合データ型です。返される文字列は、(おそらく)プリミティブデータ型charを使用して実装されます。Javaは、格納に必要なビット数とその解釈方法を知っています。
データ型のインスタンスを作成すると、オブジェクトが取得され、コンピューターはそのオブジェクト用にメモリを予約し、その場所とそのインスタンスの名前を記憶します。メモリ内のPeopleNameのインスタンスは、2つの文字列変数のスペースに加えて、簿記用にもう少しスペースを占有します。 Javaでは整数は32ビットを使用します。
複雑なデータ型には、メソッドを割り当てることができます。メソッドは、引数またはこのメソッドを呼び出したデータ型のインスタンスでアクションを実行できます。 p1とp2というPeopleNameの2つのインスタンスがあり、メソッドp1.getFirstName()を呼び出す場合、通常、2番目の人ではなく最初の人の名を返します。
車をモデル化するプログラムがある場合、車を表すクラスがあるため、コードでは次のように言えます。
Car someCar = new Car();
someCarは、クラスCarのインスタンスになりました。プログラムが修理工場で使用され、someCarがシステム内の車を表す場合、車はオブジェクトです。
Carは実世界の車を表すことができるクラスですsomeCarはCarクラスのインスタンスであり、someCareはone real life object(your car)を表します
ただし、コーディングについて議論する場合、インスタンスとオブジェクトは頻繁に交換可能に使用されます
論理的に存在します。つまり、作成時にメモリ空間は割り当てられません。
オブジェクトのセットです。
クラスは、オブジェクトを作成するための青写真と見なされる場合があります。
クラスキーワードを使用して作成されます
クラスは、オブジェクトが所有するメソッドとデータメンバーを定義します。
物理的に存在します。つまり、作成時にメモリ空間が割り当てられます。
クラスのインスタンスです。
オブジェクトは、OOP言語でデータメンバーとメンバー関数を一緒に含む一意のエンティティです。
新しいキーワードを使用して作成されます
オブジェクトは、クラスのデータメンバーが所有するメソッドと値の実装を指定します。
クラス:構造
オブジェクト:体現形
インスタンス:クラスから作成された各オブジェクト
参照:オブジェクトのアドレス
クラスは、オブジェクト(=インスタンス)を作成するために必要な設計図です。
オブジェクトとインスタンスの違いは、オブジェクトはモノであり、インスタンスはリレーションであるということです。
言い換えると、インスタンスは、オブジェクトとそのオブジェクトが作成されたクラスとの関係を表します。