クラス、オブジェクト、インスタンスの違い


回答:


86

Java(およびその他のプログラミング言語)は、値の観点からモデル化されています。理論レベルでは、は情報の量子の表現であり、タイプは値のセットです。値XタイプYのインスタンスあると言うとき XタイプYである値のセットのメンバーであると単に言っています。

つまり、「インスタンス」という用語が実際に意味するのは、物ではなく関係を表すということです。

Javaプログラミング言語の型システムは、プリミティブ型参照型の2種類の型をサポートしています。参照型はさらにクラス配列型に分けられます。Javaオブジェクトは、参照型のインスタンスです。

オブジェクトは、クラスインスタンスまたは配列です。(JLS 4.3.1

それが型理論の見方です。

実際には、ほとんどのJava開発者は、「インスタンス」と「オブジェクト」という単語を同義語として扱います。(そしてそれは私を含みます、そして私は何かを素早く説明しようとしています。)そしてほとんどの開発者はプリミティブ型のインスタンスを指すのに「インスタンス」ではなく「値」という言葉を使用します。


3
私はあなたの答えに本当に感謝しています、そして私はほとんどそれを理解しました、もう一つの質問です。「コンパイラが0引数のコンストラクタにヒットするたびに、クラスのインスタンスが作成されます。」と言います。このコンテキストでは、実際にインスタンスまたはオブジェクトが作成されるのは何ですか?私が推測するオブジェクトであり、「インスタンス」という単語を同義語として使用します。しかし、確認していただければ幸いです。
Pranjut 2009

3
@Ryan:基本的にはい:問題のクラスのインスタンスであるオブジェクトを作成しています。(ただし、引用文は単に「インスタンス」ではなく「クラスのインスタンス」と言っていることに注意してください...したがって、著者は実際にはここで「インスタンス」を同義語として使用していません。)
Stephen C

1
@ RuneFS-私が話している「モデリング」は表現に関するものではありません。それは理論的です。ええ、一部の言語では、型を表すオブジェクトがあります。また、型のすべてのインスタンスを列挙できるオブジェクトもあります。しかし、これらのプロパティは、一般的な「モデリング」を無効にするのではなく、強化します。
スティーブンC

1
@ RuneFS-いいえ...私は「型理論」について話している。それは数学の一分野です。これは、プログラムの実行に使用されるテクノロジーとは無関係です。計算に最も近い型理論はラムダ計算です。(興味がある場合は、ベンジャミンC.ピアスの「Typesand ProgrammingLanguages」のコピーを入手してみてください。)
Stephen C

1
あなたはと同じ間違いを犯していuser2390183ます。あなたは変数を「名前」として扱っています。ではない。変数は、オブジェクトへの参照を含む「参照ホルダー」です。オブジェクトには固有の名前はありません。参照は、定数表現を持たないことを除いて、オブジェクトの「名前」に最も近いものです。(GCは、参照を表すために使用されるビットパターンを変更するオブジェクトを移動できます。)
Stephen C

96

クラスは、あなたが作成するために使用する青写真であるオブジェクトを。オブジェクトはクラスのインスタンスです。これは、特定のクラスを使用して作成した具体的な「もの」です。したがって、「オブジェクト」と「インスタンス」は同じものですが、「インスタンス」という単語は、オブジェクトとそのクラスの関係を示します。

例を見れば、これは簡単に理解できます。たとえば、クラスがあるとします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();
Suraj Jain 2016

myHouseとmyCarはオブジェクトですmyHouseはHouseのインスタンスです(Object-myHouseをそのClass-Houseに関連付けます)myCarはCarのインスタンスです。これは本当ですか、user2390183による上記の回答を参照してくださいそれは正しいかどうか?
Suraj Jain 2016

29

クラスは基本的に定義であり、オブジェクトのコードが含まれています。オブジェクトはクラスのインスタンスです

例えばあなたが言うなら

String word = new String();

クラスはStringクラスであり、オブジェクト(インスタンス)の単語を記述します。

クラスが宣言されると、メモリは割り当てられないため、クラスは単なるテンプレートになります。

クラスのオブジェクトが宣言されると、メモリが割り当てられます。


オブジェクトとインスタンスが同じということですか?
Pranjut 2009

リンクをありがとうdavid。トピックから私はこれを手に入れました状態と振る舞いを持っているすべての現実世界のものは「オブジェクト」と呼ぶことができます。そして、これらのオブジェクトを分類するために、クラスを使用します(クラスは、個々のオブジェクトが作成される青写真です)。そしてそれは、クラスのオブジェクトはインスタンスであると言っています。オブジェクトとインスタンスの違いは何ですか?これは、オブジェクトがプログラミングのコンテキストに実際には存在せず、インスタンスがその中のオブジェクトを表すことを意味しますか?
Pranjut 2009

@Mustafa:矛盾して申し訳ありませんが、JLSによると、配列はJavaのオブジェクトでもあります。また、JLSでは「インスタンス」という用語がまったく定義されていないことがわかります。私の答えを見てください。
スティーブンC

@ライアン:「インスタンス」と「オブジェクト」の違いについては、私の答えを参照してください。@Mustafaの回答とコメントは(IMO)誤解を招くものです。
スティーブンC

@ mustafabar- 「クラスが宣言されると、メモリは割り当てられないため、クラスは単なるテンプレートです。」-そして、これも真実ではありません。メモリは(少なくとも)staticクラスの変数を表すために割り当てられます。(そして、クラスのタイプIDに関連する他のことについても。)
Stephen C

13

私は素人の言葉でジェスパーの説明が好きです

ジェスパーの答えから例を即興で作ることによって、

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があると言って同じであるハウス「オブジェクト種類家」


6

クラスはデータ型です。この型を使用してオブジェクトを作成します。

  • インスタンスは論理的ですが、オブジェクトは物理的です。つまり、メモリを占有します。

  • 抽象クラスとインターフェイスのインスタンスを作成することはでき
    ますが、それらのオブジェクトを作成することはできません。

  • オブジェクトはクラスのインスタンスであり、インスタンスはクラス、つまりオブジェクトを表すことを意味します。

  • インスタンスは、オブジェクトの参照を指します。

  • オブジェクトは実際にはそのインスタンスのメモリアドレスを指しています。

  • インスタンスをレイヤーに渡すことはできませんが、オブジェクトをレイヤーに渡すことはできます

  • インスタンスを保存することはできませんが、オブジェクトを保存することはできます

  • 1つのオブジェクトに複数のインスタンスを含めることができます。

  • インスタンスにはクラス定義とオブジェクト定義の両方がありますが、オブジェクトの場合と同様に、インスタンスにはオブジェクト定義のみがあります。

オブジェクトの構文:

 Classname var=new Classname();

ただし、インスタンスの作成では、オブジェクトを参照するポインタのみが返されます。構文は次のとおりです。

 Classname varname;

3

Javaでは、オブジェクトはヒープメモリ上に生成されます。これらは、アプリケーションで参照して使用する必要があります。参照には、アプリケーションでオブジェクトを使用できるオブジェクトのメモリ位置が含まれています。要するに、参照は、メモリ位置にインスタンス化されたオブジェクトのアドレスを格納する変数の名前に他なりません。

Aninstanceはの総称ですobject。参考までObjectに、クラスです。

例えば、

Class A{

}

A ref = new A();

上記のコードスニペットの場合、refはヒープ上で生成されたクラスAのオブジェクトの参照です。


3

正直なところ、私はアルフレッドのブログの定義に慣れています。

オブジェクト:実世界のオブジェクトは、状態と動作という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つのインスタンスがありますが、各インスタンスは異なるオブジェクトを表します。

したがって、クラス、オブジェクト、インスタンスは別のものです。正解として選択された回答で示唆されているように、オブジェクトとインスタンスは同義語ではありません。


2

車をモデル化するプログラムがある場合は、車を表すクラスがあるため、コードでは次のように言うことができます。

Car someCar = new Car();

someCarは、クラスCarのインスタンスになりました。プログラムが修理工場で使用され、someCarがシステム内であなたの車を表す場合、あなたの車がオブジェクトになります。

つまり、Carは実際の車を表すことができるクラスです。someCarはCarクラスのインスタンスであり、someCareは1つの実際のオブジェクト(あなたの車)を表します。

ただし、コーディングについて説明する場合、インスタンスとオブジェクトは同じ意味で使用されることがよくあります。


1
厳密に言えばsomeCar、Carインスタンスへの参照です。インスタンス自体には名前がありません。
ヨアヒムザウアー

2

コンピュータが保存および処理するあらゆる種類のデータは、最も基本的な表現ではビットの行です。これらのビットが解釈される方法は、データ型を介して行われます。データ型は、プリミティブまたは複雑にすることができます。プリミティブデータ型は、たとえば、intまたはdoubleです。それらには、特定の長さと特定の解釈方法があります。整数の場合、通常、最初のビットが符号に使用され、他のビットが値に使用されます。

複雑なデータ型は、プリミティブデータ型と他の複雑なデータ型の組み合わせであり、Javaでは「クラス」と呼ばれます。

姓名と呼ばれる2つの文字列で構成される複雑なデータ型PeopleNameを定義できます。Javaの各文字列は、別の複雑なデータ型です。代わりの文字列は、(おそらく)プリミティブデータ型charを使用して実装されます。このデータ型に対して、Javaは、格納に必要なビット数とその解釈方法を認識しています。

データ型のインスタンスを作成すると、オブジェクトが取得され、コンピューターはそのオブジェクト用にメモリを予約し、その場所とそのインスタンスの名前を記憶します。メモリ内のPeopleNameのインスタンスは、2つのString変数のスペースに加えて、簿記のためにもう少しスペースを占有します。Javaでは整数は32ビットを使用します。

複雑なデータ型には、メソッドを割り当てることができます。メソッドは、引数またはこのメソッドを呼び出すデータ型のインスタンスに対してアクションを実行できます。p1とp2というPeopleNameの2つのインスタンスがあり、メソッドp1.getFirstName()を呼び出すと、通常は最初の人の名が返されますが、2番目の人の名前は返されません。


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();

このチュートリアルの例を取り上げました


2

クラス:構造

オブジェクト:物理的症状

インスタンス:クラスから作成された各オブジェクト

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


1

クラス

  • 論理的に存在します。つまり、作成時にメモリスペースは割り当てられません。

  • これはオブジェクトのセットです。

  • クラスは、オブジェクトを作成するための青写真と見なすことができます。

    • クラスキーワードを使用して作成されます

    • クラスは、オブジェクトが所有するメソッドとデータメンバーを定義します。


オブジェクト

  • 物理的に存在します。つまり、作成時にメモリスペースが割り当てられます。

  • これはクラスのインスタンスです。

  • オブジェクトは、OOP言語でデータメンバーとメンバー関数を一緒に含む一意のエンティティです。

    • 新しいキーワードを使用して作成されます

    • オブジェクトは、クラスのデータメンバーが所有するメソッドと値の実装を指定します。


1
クラスが「作成」されるときにスペースが割り当てられる場合があります。このスペースは、クラスによって定義された静的変数に必要です。(そして、オブジェクト表現は一部のメモリデバイスで役立つビットパターンにすぎないため、「論理的」対「物理的」はそれ
Stephen C

@StephenCでは、他の違いは何でしょうか?

私の答えを参照してください。この質問は、違いについて話すだけでは適切に答えることができません。
スティーブンC

0

クラスは、オブジェクト(=インスタンス)を作成するために必要な青写真です。

オブジェクトとインスタンスの違いは、オブジェクトはモノであり、インスタンスはリレーションであるということです。

言い換えると、インスタンスは、オブジェクトと、そのオブジェクトが作成されたクラスとの関係を表します。


-1

「オブジェクトはクラスのインスタンスです」という定義は概念的には間違っていますが、実装に従って正しいです。実際、オブジェクト指向の機能は、プログラマーの心をより多くからより少なく集中させるために、実際の生活から取られています。実生活では、クラスはオブジェクトを管理するように設計されています。たとえば、私たち人間には、カースト、宗教、国籍などがあります。これらのキャスト、宗教、国籍はクラスであり、人間なしでは存在しません。しかし、実装では、クラスのないオブジェクトは存在しません。オブジェクト-オブジェクトは、明確に定義された属性を持つ個別のエンティティです。ここで離散とは、他とは異なる独自のものを意味します。明確に定義された属性は、あるコンテキストでは意味があります。クラス-いくつかの一般的な動作を持つオブジェクトまたはいくつかの一般的なタイプのオブジェクトの分類。


-1

上記の答えは正しいですが、クラスとオブジェクトについての別の考え方は、実際の例を使用することです。Animalという名前のクラスには、Cat、Dog、Fishなどのオブジェクトが含まれる場合があります。聖書のタイトルのオブジェクトは、クラスBookなどになります。クラスは一般的で、オブジェクトは特定のものです。この思考例は、私がJavaを学んでいたときに役立ちました。


はい...しかし、類推も混乱を招く可能性があります。場合はAnimalクラスであり、Catインスタンスである、私のペットの猫の猫「ふわふわ」とは何ですか?
スティーブンC

-2

クラスはテンプレートまたはタイプです。オブジェクトはクラスのインスタンスです。

例えば:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweetはクラスであり、newTweetはクラスのオブジェクトです。


これらはただの言葉です。あなたは実際にその言葉が何を意味するのかを説明していません。(実際、Javaクラスは、実際の生活でも、Javascript、Python、Rubyなどの言語での動作のように、テンプレートのように動作しません)
Stephen C
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.