Javaのクラス、オブジェクト、インスタンスとは何ですか?
回答:
Java(およびその他のプログラミング言語)は、型と値の観点からモデル化されています。理論レベルでは、値は情報の量子の表現であり、タイプは値のセットです。値XがタイプYのインスタンスであると言うとき、 XはタイプYである値のセットのメンバーであると単に言っています。
つまり、「インスタンス」という用語が実際に意味するのは、物ではなく関係を表すということです。
Javaプログラミング言語の型システムは、プリミティブ型と参照型の2種類の型をサポートしています。参照型はさらにクラスと配列型に分けられます。Javaオブジェクトは、参照型のインスタンスです。
オブジェクトは、クラスインスタンスまたは配列です。(JLS 4.3.1)
それが型理論の見方です。
実際には、ほとんどのJava開発者は、「インスタンス」と「オブジェクト」という単語を同義語として扱います。(そしてそれは私を含みます、そして私は何かを素早く説明しようとしています。)そしてほとんどの開発者はプリミティブ型のインスタンスを指すのに「インスタンス」ではなく「値」という言葉を使用します。
user2390183
ます。あなたは変数を「名前」として扱っています。ではない。変数は、オブジェクトへの参照を含む「参照ホルダー」です。オブジェクトには固有の名前はありません。参照は、定数表現を持たないことを除いて、オブジェクトの「名前」に最も近いものです。(GCは、参照を表すために使用されるビットパターンを変更するオブジェクトを移動できます。)
クラスは、あなたが作成するために使用する青写真であるオブジェクトを。オブジェクトはクラスのインスタンスです。これは、特定のクラスを使用して作成した具体的な「もの」です。したがって、「オブジェクト」と「インスタンス」は同じものですが、「インスタンス」という単語は、オブジェクトとそのクラスの関係を示します。
例を見れば、これは簡単に理解できます。たとえば、クラスがあるとします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でもすべてのオブジェクト指向プログラミング言語とまったく同じです。
class House {
// blue print for House Objects
}
class Car {
// blue print for Instances of Class Car
}
House myHouse = House new();
Car myCar = Car new();
クラスは基本的に定義であり、オブジェクトのコードが含まれています。オブジェクトはクラスのインスタンスです
例えばあなたが言うなら
String word = new String();
クラスはStringクラスであり、オブジェクト(インスタンス)の単語を記述します。
クラスが宣言されると、メモリは割り当てられないため、クラスは単なるテンプレートになります。
クラスのオブジェクトが宣言されると、メモリが割り当てられます。
static
クラスの変数を表すために割り当てられます。(そして、クラスのタイプIDに関連する他のことについても。)
私は素人の言葉でジェスパーの説明が好きです
ジェスパーの答えから例を即興で作ることによって、
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はあるインスタンスのクラス」myHouseがあると言って同じであるハウス「オブジェクトの種類家」
クラスはデータ型です。この型を使用してオブジェクトを作成します。
インスタンスは論理的ですが、オブジェクトは物理的です。つまり、メモリを占有します。
抽象クラスとインターフェイスのインスタンスを作成することはでき
ますが、それらのオブジェクトを作成することはできません。
オブジェクトはクラスのインスタンスであり、インスタンスはクラス、つまりオブジェクトを表すことを意味します。
インスタンスは、オブジェクトの参照を指します。
オブジェクトは実際にはそのインスタンスのメモリアドレスを指しています。
インスタンスをレイヤーに渡すことはできませんが、オブジェクトをレイヤーに渡すことはできます
インスタンスを保存することはできませんが、オブジェクトを保存することはできます
1つのオブジェクトに複数のインスタンスを含めることができます。
インスタンスにはクラス定義とオブジェクト定義の両方がありますが、オブジェクトの場合と同様に、インスタンスにはオブジェクト定義のみがあります。
オブジェクトの構文:
Classname var=new Classname();
ただし、インスタンスの作成では、オブジェクトを参照するポインタのみが返されます。構文は次のとおりです。
Classname varname;
正直なところ、私はアルフレッドのブログの定義に慣れています。
オブジェクト:実世界のオブジェクトは、状態と動作という2つの主要な特性を共有しています。人間には状態(名前、年齢)と行動(走る、眠る)があります。車には状態(現在の速度、現在のギア)と動作(ブレーキの適用、ギアの変更)があります。ソフトウェアオブジェクトは、概念的には実際のオブジェクトに似ています。それらも状態と関連する動作で構成されています。オブジェクトはその状態をフィールドに格納し、メソッドを通じてその動作を公開します。
クラス:は、オブジェクトの作成に使用される「テンプレート」/「青写真」です。基本的に、クラスはフィールド、静的フィールド、メソッド、静的メソッド、コンストラクターで構成されます。フィールドは、クラスの状態を保持するために使用されます(例:Studentオブジェクトの名前)。メソッドは、クラスの動作を表すために使用されます(例:Studentオブジェクトがどのように立ち上がるか)。コンストラクターは、クラスの新しいインスタンスを作成するために使用されます。
インスタンス:インスタンスは、オブジェクトを表すクラスの一意のコピーです。クラスの新しいインスタンスが作成されると、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つのインスタンスがありますが、各インスタンスは異なるオブジェクトを表します。
したがって、クラス、オブジェクト、インスタンスは別のものです。正解として選択された回答で示唆されているように、オブジェクトとインスタンスは同義語ではありません。
車をモデル化するプログラムがある場合は、車を表すクラスがあるため、コードでは次のように言うことができます。
Car someCar = new Car();
someCarは、クラスCarのインスタンスになりました。プログラムが修理工場で使用され、someCarがシステム内であなたの車を表す場合、あなたの車がオブジェクトになります。
つまり、Carは実際の車を表すことができるクラスです。someCarはCarクラスのインスタンスであり、someCareは1つの実際のオブジェクト(あなたの車)を表します。
ただし、コーディングについて説明する場合、インスタンスとオブジェクトは同じ意味で使用されることがよくあります。
someCar
、Carインスタンスへの参照です。インスタンス自体には名前がありません。
コンピュータが保存および処理するあらゆる種類のデータは、最も基本的な表現ではビットの行です。これらのビットが解釈される方法は、データ型を介して行われます。データ型は、プリミティブまたは複雑にすることができます。プリミティブデータ型は、たとえば、intまたはdoubleです。それらには、特定の長さと特定の解釈方法があります。整数の場合、通常、最初のビットが符号に使用され、他のビットが値に使用されます。
複雑なデータ型は、プリミティブデータ型と他の複雑なデータ型の組み合わせであり、Javaでは「クラス」と呼ばれます。
姓名と呼ばれる2つの文字列で構成される複雑なデータ型PeopleNameを定義できます。Javaの各文字列は、別の複雑なデータ型です。代わりの文字列は、(おそらく)プリミティブデータ型charを使用して実装されます。このデータ型に対して、Javaは、格納に必要なビット数とその解釈方法を認識しています。
データ型のインスタンスを作成すると、オブジェクトが取得され、コンピューターはそのオブジェクト用にメモリを予約し、その場所とそのインスタンスの名前を記憶します。メモリ内のPeopleNameのインスタンスは、2つのString変数のスペースに加えて、簿記のためにもう少しスペースを占有します。Javaでは整数は32ビットを使用します。
複雑なデータ型には、メソッドを割り当てることができます。メソッドは、引数またはこのメソッドを呼び出すデータ型のインスタンスに対してアクションを実行できます。p1とp2というPeopleNameの2つのインスタンスがあり、メソッドp1.getFirstName()を呼び出すと、通常は最初の人の名が返されますが、2番目の人の名前は返されません。
クラスとオブジェクトの背後にある概念は、ロジックを単一のプログラミングユニットにカプセル化することです。クラスは、オブジェクトが作成される青写真です。
車を表すクラスの例を次に示します。
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();
このチュートリアルの例を取り上げました
論理的に存在します。つまり、作成時にメモリスペースは割り当てられません。
これはオブジェクトのセットです。
クラスは、オブジェクトを作成するための青写真と見なすことができます。
クラスキーワードを使用して作成されます
クラスは、オブジェクトが所有するメソッドとデータメンバーを定義します。
物理的に存在します。つまり、作成時にメモリスペースが割り当てられます。
これはクラスのインスタンスです。
オブジェクトは、OOP言語でデータメンバーとメンバー関数を一緒に含む一意のエンティティです。
新しいキーワードを使用して作成されます
オブジェクトは、クラスのデータメンバーが所有するメソッドと値の実装を指定します。
「オブジェクトはクラスのインスタンスです」という定義は概念的には間違っていますが、実装に従って正しいです。実際、オブジェクト指向の機能は、プログラマーの心をより多くからより少なく集中させるために、実際の生活から取られています。実生活では、クラスはオブジェクトを管理するように設計されています。たとえば、私たち人間には、カースト、宗教、国籍などがあります。これらのキャスト、宗教、国籍はクラスであり、人間なしでは存在しません。しかし、実装では、クラスのないオブジェクトは存在しません。オブジェクト-オブジェクトは、明確に定義された属性を持つ個別のエンティティです。ここで離散とは、他とは異なる独自のものを意味します。明確に定義された属性は、あるコンテキストでは意味があります。クラス-いくつかの一般的な動作を持つオブジェクトまたはいくつかの一般的なタイプのオブジェクトの分類。