La differenza tra Classi, Oggetti e Istanze

Che cos’è una class, un object e un’istanza in Java?

Java (e qualsiasi altro linguaggio di programmazione) è modellato in termini di tipi e valori . A livello teorico, un valore è una rappresentazione per un certo numero 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.

Questo è ciò che il termine “istanza” in realtà significa: 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 object Java è un’istanza di un tipo di riferimento.

Un object è un’istanza di class o un array. ( JLS 4.3.1 )

Questa è la visione teorica del tipo.

In pratica, la maggior parte degli sviluppatori Java considera le parole “istanza” e “object” come sinonimi. (E questo include me, quindi sto cercando di spiegare qualcosa in fretta.) E molti sviluppatori usano la parola “valore” piuttosto che “istanza” per riferirsi a un’istanza di un tipo primitivo.

Una class è un progetto che usi per creare oggetti . Un object è un’istanza di una class – è una “cosa” concreta che hai creato usando una class specifica. Quindi, “object” e “istanza” sono la stessa cosa, ma la parola “istanza” indica la relazione di un object con la sua class.

Questo è facile da capire se si guarda un esempio. Ad esempio, supponiamo di avere una class House . La tua casa è un object ed è un’istanza di class House . La casa di tua sorella è un altro object (un’altra istanza della class 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 class House descrive il concetto di cosa sia una casa, e ci sono case specifiche e concrete che sono oggetti e istanze di class House .

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

Una class è fondamentalmente una definizione e contiene il codice dell’object. Un object è un’istanza di una class

per esempio se dici

 String word = new String(); 

la class è la class String, che descrive la parola object (istanza).

Quando viene dichiarata una class, non viene allocata memoria in modo che la class sia solo un modello.

Quando viene dichiarato l’object della class, la memoria viene allocata.

Mi piace la spiegazione di Jesper in parole povere

Improvvisando esempi dalla risposta di Jesper,

 class House { // blue print for House Objects } class Car { // blue print for Instances of Class Car } House myHouse = House new(); Car myCar = Car new(); 

myHouse e myCar sono oggetti

myHouse è un’istanza di House (riferisce Object-myHouse al suo Class-House) myCar è un’istanza di Car

in breve

“myHouse è un’istanza di Class House” che equivale a dire “myHouse è un object di tipo House”

La class è il tipo di dati, si utilizza questo tipo per creare l’object.

  • L’istanza è logica ma l’object è che i mezzi fisici occupano parte della memoria.

  • Possiamo creare un’istanza per la class astratta e per l’interfaccia, ma non possiamo crearne una
    object per quelli.

  • L’object è istanza di class e istanza significa rappresentante di class ie object.

  • L’istanza si riferisce al riferimento di un object.

  • L’object sta effettivamente puntando all’indirizzo di memoria di quell’istanza.

  • Non è ansible passare l’istanza sui livelli ma è ansible passare l’object sui livelli

  • Non è ansible memorizzare un’istanza ma è ansible memorizzare un object

  • Un singolo object può avere più di un’istanza.

  • L’istanza avrà sia la definizione della class che la definizione dell’object dove, come nell’object, avrà solo la definizione dell’object.

Sintassi dell’object:

  Classname var=new Classname(); 

Ma per esempio la creazione restituisce solo un puntatore che si riferisce ad un object, la syntax è:

  Classname varname; 

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’object con il quale possiamo usare gli oggetti nella nostra applicazione. Un riferimento in breve non è altro che un nome della variabile che memorizza l’indirizzo dell’object istanziato in una posizione di memoria.

instance è un termine generale per l’ object . A proposito, Object è una class.

Per esempio,

 Class A{ } A ref = new A(); 

Per lo snippet di codice sopra riportato, ref è il riferimento per un object di class A generato su heap.

Se hai un programma che modella le auto hai una class per rappresentare le auto, quindi in Code puoi dire:

 Car someCar = new Car(); 

someCar è ora un’istanza della class Car. Se il programma viene utilizzato in un officina e la someCar rappresenta la tua auto nel loro sistema, allora la tua auto è l’object.

Quindi Car è una class che può rappresentare un’automobile del mondo reale someCar è un’istanza della class Car e someCare rappresenta un object di vita reale (la tua auto)

tuttavia, l’istanza e l’object sono molto spesso usati in modo intercambiabile quando si tratta di discutere della codifica

Qualsiasi tipo di dati memorizzati nel computer e processi è nella sua rappresentazione più semplice una fila di bit. Il modo in cui quei bit sono interpretati viene eseguito attraverso tipi di dati. I tipi di dati possono essere primitivi o complessi. I tipi di dati primitivi sono, per esempio, int o double. Hanno una lunghezza specifica e un modo specifico di essere interpretati. Nel caso di un intero, in genere il primo bit viene utilizzato per il segno, gli altri vengono utilizzati per il valore.

I tipi di dati complessi possono essere combinazioni di tipi di dati primitivi e altri complessi e sono denominati “Classe” in Java.

È ansible definire il tipo di dati complesso PeopleName composto da due stringhe chiamate nome e cognome. Ogni stringa in Java è un altro tipo di dati complesso. Le stringhe in cambio sono (probabilmente) implementate usando il tipo di dati primitivi char per cui Java conosce quanti bit prendono per memorizzare e come interpretarli.

Quando crei un’istanza di un tipo di dati, ottieni un object e i tuoi computer ne riservano memoria e ne memorizzano la posizione e il nome. Un’istanza di PeopleName in memoria occuperà lo spazio delle due variabili String e un po ‘di più per la contabilità. Un numero intero occupa 32 bit in Java.

Tipi di dati complessi possono avere metodi assegnati a loro. I metodi possono eseguire azioni sui loro argomenti o sull’istanza del tipo di dati da cui si chiama questo metodo. Se hai due istanze di PeopleName chiamate p1 e p2 e chiami un metodo p1.getFirstName (), di solito restituisce il primo nome della prima persona ma non quello della seconda persona.

Il concetto dietro classi e oggetti è incapsulare la logica in una singola unità di programmazione. Le classi sono i progetti di cui sono stati creati gli oggetti.

Ecco un esempio di una class che rappresenta un’auto:

 public class Car { int currentSpeed; String name; public void accelerate() { } public void park() { } public void printCurrentSpeed() { } } 

Puoi creare istanze dell’object Car in questo modo:

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

Ho preso l’esempio da questo tutorial

Classe

  • Ha un’esistenza logica, cioè nessuno spazio di memoria viene assegnato quando viene creato.

  • È un insieme di oggetti.

  • Una class può essere considerata come un progetto per creare oggetti.

    • Viene creato usando la parola chiave class

    • Una class definisce i metodi e i membri di dati che saranno posseduti dagli oggetti.


Oggetto

  • Ha un’esistenza fisica, cioè lo spazio di memoria viene assegnato quando viene creato.

  • È un’istanza di una class.

  • Un object è un’ quadro unica che contiene membri dati e funzioni membro insieme in linguaggio OOP.

    • Viene creato utilizzando una nuova parola chiave

    • Un object specifica le implementazioni dei metodi e i valori che saranno posseduti dai membri dei dati nella class.

Onestamente, mi sento più a mio agio con le definizioni del blog Alfred :

Oggetto : oggetti del mondo reale condivide 2 caratteristiche, stato e comportamento principali. Umano hanno stato (nome, età) e comportamento (correre, dormire). La vettura ha stato (velocità attuale, marcia corrente) e stato (applicazione del freno, cambio marcia). Gli oggetti software sono concettualmente simili agli oggetti del mondo reale: anch’essi sono costituiti da stati e comportamenti correlati. Un object memorizza il suo stato nei campi ed espone il suo comportamento attraverso i metodi.

Classe : è un “modello” / “progetto” che viene utilizzato per creare oggetti. Fondamentalmente, una class sarà composta da campo, campo statico, metodo, metodo statico e costruttore. Il campo viene utilizzato per mantenere lo stato della class (ad esempio: nome dell’object Studente). Il metodo è usato per rappresentare il comportamento della class (es .: come un object Student sta andando in piedi). Il costruttore viene utilizzato per creare una nuova istanza della class.

Istanza : un’istanza è una copia univoca di una class che rappresenta un object. Quando viene creata una nuova istanza di una class, la JVM allocherà una stanza di memoria per quell’istanza di class.

Dato il prossimo esempio:

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

Per il caso 1, ci sono due istanze della class Person, ma entrambe le istanze rappresentano lo stesso object.

Per il caso 2, ci sono due istanze della class Person, ma ogni istanza rappresenta un object diverso.

Quindi class, object e istanza sono cose diverse. Oggetto e istanza non sono sinonimi come suggerito nella risposta selezionata come risposta corretta.

La definizione “Oggetto è un’istanza di una class”, è concettualmente sbagliata, ma corretta secondo l’implementazione. In realtà le caratteristiche orientate agli oggetti sono tratte dalla vita reale, per focalizzare la mente del programmatore da più a meno. Nella vita reale le classi sono progettate per gestire l’object. Per esempio, noi esseri umani abbiamo una casta, una religione, una nazionalità e molto altro ancora. Questi calchi, religione, nazionalità sono le classi e non hanno esistenza senza esseri umani. Ma nell’implementazione non esiste esistenza di oggetti senza classi. Oggetto- Oggetto è un’ quadro discreta con alcuni attributi ben definiti. Qui discreto significa qualcosa che lo rende unico dagli altri. Attributi ben definiti hanno senso in alcuni contesti. Classificazione delle classi di oggetti con alcuni comportamenti o oggetti comuni di un tipo comune.

Mentre le risposte sopra sono corrette, un altro modo di pensare a Classi e Oggetti sarebbe di usare esempi del mondo reale: una class chiamata Animale potrebbe contenere oggetti come Gatto, Cane o Pesce. Un object con un titolo di Bibbia sarebbe di class Libro, ecc. Le classi sono generali, gli oggetti sono specifici. Questo esempio di pensiero mi ha aiutato quando stavo imparando Java.

La class è un modello o un tipo. Un object è un’istanza della class.

Per esempio:

 public class Tweet { } Tweet newTweet = new Tweet(); 

Tweet è una class e newTweet è un object della class.