La differenza tra classi, oggetti e istanze


Risposte:


89

Java (e qualsiasi altro linguaggio di programmazione) è modellato in termini di tipi e valori . A livello teorico, un valore è una rappresentazione di un quanto di informazioni e un tipo è un insieme di valori. Quando diciamo che il valore X è un'istanza di tipo Y, stiamo semplicemente dicendo che X è un membro dell'insieme di valori che è il tipo Y.

Quindi questo è il significato del termine "istanza": descrive una relazione, non una cosa.

Il sistema di tipi del linguaggio di programmazione Java supporta due tipi di tipi, tipi primitivi e tipi di riferimento . I tipi di riferimento sono ulteriormente suddivisi in classi e tipi di array . Un oggetto Java è un'istanza di un tipo di riferimento.

Un oggetto è un'istanza di classe o un array. ( JLS 4.3.1 )

Questa è la visione teorica del tipo.

In pratica, la maggior parte degli sviluppatori Java tratta le parole "istanza" e "oggetto" come sinonimi. (E questo include me, quindi sto cercando di spiegare qualcosa velocemente.) E la maggior parte degli sviluppatori usa la parola "valore" piuttosto che "istanza" per riferirsi a un'istanza di un tipo primitivo.


3
Apprezzo molto la tua risposta, signore, e l'ho quasi ricevuta, solo un'altra domanda. Diciamo: "Ogni volta che il compilatore colpisce il costruttore di argomenti 0, crea un'istanza di una classe.". In questo contesto cosa viene realmente creata un'istanza o un oggetto? Un oggetto immagino e usiamo la parola "istanza" come sinonimo. Ma sarebbe gentile, se lo confermi meglio.
Pranjut

3
@ Ryan: Fondamentalmente sì: sta creando un Object che è un'istanza della Classe in questione. (Ma nota che la frase citata sta dicendo "istanza di una classe" piuttosto che solo "istanza" ... quindi l'autore non sta effettivamente usando "istanza" come sinonimo qui.)
Stephen C

1
@RuneFS - la "modellazione" di cui sto parlando non riguarda la rappresentazione. È teorico. Sì, in alcune lingue ci sono oggetti che denotano tipi, o anche che ti permettono di enumerare tutte le istanze di un tipo. Ma queste proprietà aumentano la generica "modellazione" piuttosto che invalidarla.
Stephen C

1
@RuneFS - No ... sto parlando di "teoria dei tipi". È una branca della matematica. È indipendente dalla tecnologia utilizzata per eseguire i programmi. La teoria dei tipi più vicina al calcolo è il lambda calcolo. (Se sei interessato, prova a procurarti una copia di "Tipi e linguaggi di programmazione" di Benjamin C. Pierce.)
Stephen C

1
Stai facendo lo stesso errore di user2390183. Stai trattando le variabili come "nomi". Non sono. Le variabili sono "contenitori di riferimento" che contengono riferimenti a oggetti. Gli oggetti non hanno nomi intrinseci. I riferimenti sono la cosa più vicina che c'è a un "nome" per un oggetto, tranne per il fatto che non hanno una rappresentazione costante. (Il GC può spostare un oggetto che cambia lo schema di bit utilizzato per rappresentare il riferimento.)
Stephen C

99

Una classe è un progetto che usi per creare oggetti . Un oggetto è un'istanza di una classe: è una "cosa" concreta che hai creato utilizzando una classe specifica. Quindi, "oggetto" e "istanza" sono la stessa cosa, ma la parola "istanza" indica la relazione di un oggetto con la sua classe.

Questo è facile da capire se guardi un esempio. Ad esempio, supponi di avere una classe House. La tua casa è un oggetto ed è un'istanza di classe House. La casa di tua sorella è un altro oggetto (un'altra istanza di classe 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();

La classe Housedescrive il concetto di cosa sia una casa e ci sono case specifiche in cemento che sono oggetti e istanze di classe House.

Nota: questo è esattamente lo stesso in Java come in tutti i linguaggi di programmazione orientati agli oggetti.


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

myHouse e myCar sono oggetti myHouse è un'istanza di House (collega Object-myHouse alla sua Class-House) myCar è un'istanza di Car. È vero, si prega di vedere la risposta sopra di user2390183 è corretta o no?
Suraj Jain

30

Una classe è fondamentalmente una definizione e contiene il codice dell'oggetto. Un oggetto è un'istanza di una classe

per esempio se dici

String word = new String();

la classe è la classe String, che descrive la parola oggetto (istanza).

Quando viene dichiarata una classe, non viene allocata memoria, quindi la classe è solo un modello.

Quando l'oggetto della classe viene dichiarato, viene allocata la memoria.


Volevi dire che gli oggetti e le istanze sono gli stessi?
Pranjut

Grazie David per il link. Dagli argomenti ho ottenuto questo Ogni cosa del mondo reale che ha uno stato e un comportamento può essere chiamata "oggetto". E per classificare questi oggetti usiamo class (Una classe è il progetto da cui vengono creati i singoli oggetti). E dice che gli oggetti della classe sono istanze. Ora per favore qualcuno mi dica quali sono le differenze tra oggetto e istanza? Questo significa che l'oggetto non esiste realmente nel contesto della programmazione e l'istanza rappresenta l'oggetto in esso?
Pranjut

@Mustafa: mi dispiace contraddirti, ma secondo JLS, un array è anche un oggetto in Java. E scoprirai che JLS non definisce affatto il termine "istanza". Vedi la mia risposta.
Stephen C

@ Ryan: vedi la mia risposta per la distinzione tra "istanza" e "oggetto". La risposta e il commento di @ Mustafa sono (IMO) fuorvianti.
Stephen C

@mustafabar - "Quando viene dichiarata una classe, non viene allocata alcuna memoria, quindi la classe è solo un modello." - E nemmeno questo è vero. La memoria è allocata per (almeno) rappresentare le staticvariabili della classe. (E anche per altre cose che sono legate all'identità del tipo della classe.)
Stephen C

13

Mi piace la spiegazione di Jesper in termini laici

Improvvisando esempi dalla risposta di 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 e myCar sono oggetti

myHouse è un'istanza di House (collega Object-myHouse alla sua Class-House) myCar è un'istanza di Car

in breve

"myHouse è un'istanza di Class House" che equivale a dire "myHouse è un oggetto di tipo House"


6

La classe è il tipo di dati, si utilizza questo tipo per creare l'oggetto.

  • L'istanza è logica ma l'oggetto è fisico significa che occupa un po 'di memoria.

  • Possiamo creare un'istanza per la classe astratta così come per l'interfaccia, ma non possiamo creare un
    oggetto per quelle.

  • L'oggetto è l'istanza della classe e l'istanza significa rappresentativo della classe, ovvero l'oggetto.

  • L'istanza si riferisce al riferimento di un oggetto.

  • L'oggetto punta effettivamente all'indirizzo di memoria di quell'istanza.

  • Non puoi passare l'istanza sui livelli ma puoi passare l'oggetto sui livelli

  • Non puoi memorizzare un'istanza ma puoi memorizzare un oggetto

  • Un singolo oggetto può avere più di un'istanza.

  • L'istanza avrà sia la definizione della classe che la definizione dell'oggetto, mentre come in object avrà solo la definizione dell'oggetto.

Sintassi dell'oggetto:

 Classname var=new Classname();

Ma per la creazione di istanze restituisce solo un puntatore che fa riferimento a un oggetto, la sintassi è:

 Classname varname;

3

In java, gli oggetti vengono generati nella memoria heap. Questi richiedono un riferimento per essere puntati e utilizzati nella nostra applicazione. Il riferimento ha la posizione di memoria dell'oggetto con cui possiamo usare gli oggetti nella nostra applicazione. Un riferimento in breve non è altro che un nome della variabile che memorizza l'indirizzo dell'oggetto istanziato in una posizione di memoria.

An instanceè un termine generico per object. Cordiali saluti, Objectè una classe.

Per esempio,

Class A{

}

A ref = new A();

For the above code snippet, ref is the reference for an object of class A generated on heap.


3

Honestly, I feel more comfortable with Alfred blog definitions:

Object: real world objects shares 2 main characteristics, state and behavior. Human have state (name, age) and behavior (running, sleeping). Car have state (current speed, current gear) and behavior (applying brake, changing gear). Software objects are conceptually similar to real-world objects: they too consist of state and related behavior. An object stores its state in fields and exposes its behavior through methods.

Class: is a “template” / “blueprint” that is used to create objects. Basically, a class will consists of field, static field, method, static method and constructor. Field is used to hold the state of the class (eg: name of Student object). Method is used to represent the behavior of the class (eg: how a Student object going to stand-up). Constructor is used to create a new Instance of the Class.

Instance: An instance is a unique copy of a Class that representing an Object. When a new instance of a class is created, the JVM will allocate a room of memory for that class instance.

Given the next example:

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

For case 1, there are two instances of the class Person, but both instances represent the same object.

For case 2, there are two instances of the class Person, but each instance represent a different object.

So class, object and instance are different things. Object and instance are not synonyms as is suggested in the answer selected as right answer.


2

If you have a program that models cars you have a class to represent cars, so in Code you could say:

Car someCar = new Car();

someCar is now an instance of the class Car. If the program is used at a repairshop and the someCar represents your car in their system, then your car is the object.

So Car is a class that can represent any real world car someCar is an instance of the Car class and someCare represents one real life object (your car)

however instance and object is very often used interchangably when it comes to discussing coding


1
Strictly speaking someCar is a reference to a Car instance. The instance itself doesn't have a name.
Joachim Sauer

2

Any kind of data your computer stores and processes is in its most basic representation a row of bits. The way those bits are interpreted is done through data types. Data types can be primitive or complex. Primitive data types are - for instance - int or double. They have a specific length and a specific way of being interpreted. In the case of an integer, usually the first bit is used for the sign, the others are used for the value.

Complex data types can be combinations of primitive and other complex data types and are called "Class" in Java.

You can define the complex data type PeopleName consisting of two Strings called first and last name. Each String in Java is another complex data type. Strings in return are (probably) implemented using the primitive data type char for which Java knows how many bits they take to store and how to interpret them.

When you create an instance of a data type, you get an object and your computers reserves some memory for it and remembers its location and the name of that instance. An instance of PeopleName in memory will take up the space of the two String variables plus a bit more for bookkeeping. An integer takes up 32 bits in Java.

Complex data types can have methods assigned to them. Methods can perform actions on their arguments or on the instance of the data type you call this method from. If you have two instances of PeopleName called p1 and p2 and you call a method p1.getFirstName(), it usually returns the first name of the first person but not the second person's.


2

The concept behind classes and objects is to encapsulate logic into single programming unit. Classes are the blueprints of which objects are created.

Here an example of a class representing a Car:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

You can create instances of the object Car like this:

Car audi = new Car();
Car toyota = new Car();

I have taken the example from this tutorial


2

Class : Structure

Object : Physical Manifestation

Instance : each object created from class

Reference : Address of Object


1

Class

  • It has logical existence, i.e. no memory space is allocated when it is created.

  • It is a set of objects.

  • A class may be regarded as a blueprint to create objects.

    • It is created using class keyword

    • A class defines the methods and data members that will be possessed by Objects.


Object

  • It has physical existence, i.e. memory space is allocated when it is created.

  • It is an instance of a class.

  • An object is a unique entity which contains data members and member functions together in OOP language.

    • It is created using new keyword

    • An object specifies the implementations of the methods and the values that will be possessed by the data members in the class.


1
Space may be allocated when a class is "created". The space is required for any static variables defined by the class. (And "logical" versus "physical" is stretching it, since an object representation is only bit patterns help in some memory device.)
Stephen C

@StephenC what could be the other difference then?

See my Answer. This question cannot be answered properly by just talking about differences.
Stephen C

0

A class is a blueprint that is needed to make an object(= instance).

The difference between an object and an instance is, an object is a thing and an instance is a relation.

In other words, instance describes the relation of an object to the class that the object was made from.


-1

The definition "Object is an instance of a class", is conceptually wrong, but correct as per implementation. Actually the object oriented features are taken from the real life, for focusing the mind of programmer from more to less. In real life classes are designed to manage the object.For eg- we human beings have a caste, religion,nationality and much more. These casts, religion, nationality are the classes and have no existence without human beings. But in implementation there is no existence of objects without classes. Object- Object is an discrete entity having some well defined attribute. Here discrete mean something that makes it unique from other. Well defined attribute make sense in some context. Class- Classification of object having some common behaviour or objects of some common type.


-1

While the above answers are correct, another way of thinking about Classes and Objects would be to use real world examples: A class named Animal might contain objects like Cat, Dog or Fish. An object with a title of Bible would be of class Book, etc. Classes are general, objects are specific. This thought example helped me when I was learning Java.


Yes ... but analogies can also be confusing. If Animal is a class and Cat is an instance, what is my pet pussy cat "Fluffy"?
Stephen C

In fact, in the real world (and in type theory), Animal denotes the set of all animals, and Cat denotes the set of all cats. Cat is a subset of Animal not an instance of Animal.
Stephen C

-2

Class is a template or type. An object is an instance of the class.

For example:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet is a class and newTweet is an object of the class.


These are just words. You don't actually explain what the words mean. (And in fact, Java classes do NOT behave like templates, either in real life or in the way that the do in languages like Javascript, Python, Ruby, etc.)
Stephen C
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.