La diferencia entre clases, objetos e instancias

Respuestas:

86

Java (y cualquier otro lenguaje de programación) se modela en términos de tipos y valores . En el nivel teórico, un valor es una representación de algún cuanto de información y un tipo es un conjunto de valores. Cuando decimos que el valor X es una instancia del tipo Y, simplemente estamos diciendo que X es un miembro del conjunto de valores que es el tipo Y.

Así que eso es lo que realmente significa el término "instancia": describe una relación, no una cosa.

El sistema de tipos del lenguaje de programación Java admite dos tipos de tipos, tipos primitivos y tipos de referencia . Los tipos de referencia se dividen además en clases y tipos de matriz . Un objeto Java es una instancia de un tipo de referencia.

Un objeto es una instancia de clase o una matriz. ( JLS 4.3.1 )

Esa es la visión de la teoría de tipos.

En la práctica, la mayoría de los desarrolladores de Java tratan las palabras "instancia" y "objeto" como sinónimos. (Y eso me incluye a mí, entonces estoy tratando de explicar algo rápidamente). Y la mayoría de los desarrolladores usan la palabra "valor" en lugar de "instancia" para referirse a una instancia de un tipo primitivo.

Esteban C
fuente
3
Realmente aprecio su respuesta, señor, y casi la entiendo, solo una pregunta más. Decimos: "Siempre que el compilador golpea el constructor de argumento 0, crea una instancia de una clase". En este contexto, ¿qué se crea realmente una instancia o un objeto? Supongo que un objeto y usamos la palabra "instancia" como sinónimo. Pero sería bueno, si es mejor confirmarlo.
Pranjut
3
@Ryan: Básicamente sí: está creando un Objeto que es una instancia de la Clase en cuestión. (Pero tenga en cuenta que la oración citada dice "instancia de una clase" en lugar de solo "instancia" ... por lo que el autor no está usando realmente "instancia" como sinónimo aquí).
Stephen C
1
@RuneFS: el "modelado" del que hablo no se trata de representación. Es teórico. Sí, en algunos lenguajes hay objetos que denotan tipos, o incluso que le permiten enumerar todas las instancias de un tipo. Pero esas propiedades aumentan el "modelado" genérico en lugar de invalidarlo.
Stephen C
1
@RuneFS - No ... estoy hablando de "teoría de tipos". Es una rama de las matemáticas. Es independiente de la tecnología que se utiliza para ejecutar programas. La teoría de tipos más cercana a la computación es el cálculo lambda. (Si está interesado, intente conseguir una copia de "Tipos y lenguajes de programación" de Benjamin C. Pierce.)
Stephen C
1
Estás cometiendo el mismo error que user2390183. Está tratando las variables como "nombres". No son. Las variables son "titulares de referencias" que contienen referencias a objetos. Los objetos no tienen nombres intrínsecos. Las referencias son lo más parecido que hay a un "nombre" para un objeto, excepto que no tienen una representación constante. (El GC puede mover un objeto que cambia el patrón de bits utilizado para representar la referencia.)
Stephen C
96

Una clase es un plano que usas para crear objetos . Un objeto es una instancia de una clase, es una 'cosa' concreta que creaste usando una clase específica. Entonces, 'objeto' e 'instancia' son lo mismo, pero la palabra 'instancia' indica la relación de un objeto con su clase.

Esto es fácil de entender si mira un ejemplo. Por ejemplo, suponga que tiene una clase House. Tu propia casa es un objeto y es una instancia de clase House. La casa de tu hermana es otro objeto (otra instancia de clase 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 clase Housedescribe el concepto de lo que es una casa, y hay casas concretas específicas que son objetos e instancias de clase.House .

Nota: Esto es exactamente lo mismo en Java que en todos los lenguajes de programación orientados a objetos.

Jesper
fuente
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 y myCar son objetos myHouse es una instancia de House (relaciona Object-myHouse con su Class-House) myCar es una instancia de Car. ¿Es esto cierto? Consulte la respuesta anterior del usuario 2390183. ¿Es correcta o no?
Suraj Jain
29

Una clase es básicamente una definición y contiene el código del objeto. Un objeto es una instancia de una clase

por ejemplo si dices

String word = new String();

la clase es la clase String, que describe la palabra objeto (instancia).

Cuando se declara una clase, no se asigna memoria, por lo que la clase es solo una plantilla.

Cuando se declara el objeto de la clase, se asigna memoria.

Mustafabar
fuente
¿Querías decir que los objetos y las instancias son iguales?
Pranjut
Gracias david por el enlace. De los temas obtuve esto. Todas las cosas del mundo real que tienen un estado y comportamiento se pueden llamar "objeto". Y para clasificar estos objetos usamos class (una clase es el plano a partir del cual se crean los objetos individuales). Y dice que los objetos de la clase son instancias. Ahora, por favor, alguien me diga cuáles son las diferencias entre el objeto y la instancia. ¿Significa esto que el objeto no existe realmente en el contexto de la programación y la instancia representa el objeto en él?
Pranjut
@Mustafa: Lamento contradecirlo, pero según JLS, una matriz también es un objeto en Java. Y encontrará que JLS no define el término 'instancia' en absoluto. Mira mi respuesta.
Stephen C
@Ryan: Vea mi respuesta para la distinción entre "instancia" y "objeto". La respuesta y el comentario de @ Mustafa son (OMI) engañosos.
Stephen C
@mustafabar - "Cuando se declara una clase, no se asigna memoria, por lo que la clase es solo una plantilla". - Y esto tampoco es cierto. La memoria se asigna para (al menos) representar las staticvariables de la clase. (Y también para otras cosas que están relacionadas con el tipo de identidad de la clase.)
Stephen C
13

Me gusta la explicación de Jesper en términos sencillos.

Al improvisar ejemplos de la respuesta de 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 y myCar son objetos

myHouse es una instancia de House (relaciona Object-myHouse con su Class-House) myCar es una instancia de Car

en breve

"myHouse es una instancia de Class House", que es lo mismo que decir "myHouse es un objeto de tipo House"

usuario2390183
fuente
6

La clase es el tipo de datos. Utiliza este tipo para crear un objeto.

  • La instancia es lógica pero el objeto es físico significa que ocupa algo de memoria.

  • Podemos crear una instancia para la clase abstracta así como para la interfaz, pero no podemos crear un
    objeto para esas.

  • Objeto es instancia de clase y instancia significa representante de clase, es decir, objeto.

  • La instancia se refiere a la referencia de un objeto.

  • El objeto en realidad apunta a la dirección de memoria de esa instancia.

  • No puede pasar la instancia sobre las capas, pero puede pasar el objeto sobre las capas

  • No puedes almacenar una instancia pero puedes almacenar un objeto

  • Un solo objeto puede tener más de una instancia.

  • La instancia tendrá tanto la definición de la clase como la definición del objeto, mientras que en el objeto tendrá solo la definición del objeto.

Sintaxis del objeto:

 Classname var=new Classname();

Pero, por ejemplo, la creación devuelve solo un puntero que se refiere a un objeto, la sintaxis es:

 Classname varname;
SwatiKothari
fuente
3

En java, los objetos se generan en la memoria del montón. Estos requieren referencia para ser señalados y utilizados en nuestra aplicación. La referencia tiene la ubicación de memoria del objeto con el que podemos usar los objetos en nuestra aplicación. En resumen, una referencia no es más que un nombre de la variable que almacena la dirección del objeto instanciado en una ubicación de memoria.

An instancees un término general para object. FYI, Objectes una clase.

Por ejemplo,

Class A{

}

A ref = new A();

Para el fragmento de código anterior, ref es la referencia para un objeto de clase A generado en el montón.

Arun
fuente
3

Honestamente, me siento más cómodo con las definiciones del blog de Alfred :

Objeto : los objetos del mundo real comparten 2 características principales, estado y comportamiento. Los humanos tienen estado (nombre, edad) y comportamiento (correr, dormir). El coche tiene estado (velocidad actual, marcha actual) y comportamiento (frenado, cambio de marcha). Los objetos de software son conceptualmente similares a los objetos del mundo real: también consisten en estados y comportamientos relacionados. Un objeto almacena su estado en campos y expone su comportamiento a través de métodos.

Clase : es una "plantilla" / "plano" que se utiliza para crear objetos. Básicamente, una clase constará de campo, campo estático, método, método estático y constructor. El campo se usa para contener el estado de la clase (por ejemplo: nombre del objeto Student). El método se utiliza para representar el comportamiento de la clase (p. Ej., Cómo se pone de pie un objeto de estudiante). El constructor se utiliza para crear una nueva instancia de la clase.

Instancia : una instancia es una copia única de una clase que representa un objeto. Cuando se crea una nueva instancia de una clase, la JVM asignará un espacio de memoria para esa instancia de clase.

Dado el siguiente ejemplo:

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

Para el caso 1, hay dos instancias de la clase Person, pero ambas instancias representan el mismo objeto.

Para el caso 2, hay dos instancias de la clase Person, pero cada instancia representa un objeto diferente.

Entonces, clase, objeto e instancia son cosas diferentes. Objeto e instancia no son sinónimos como se sugiere en la respuesta seleccionada como respuesta correcta.

Carlos Casallas
fuente
2

Si tiene un programa que modela automóviles, tiene una clase para representar automóviles, por lo que en Código podría decir:

Car someCar = new Car();

someCar es ahora una instancia de la clase Car. Si el programa se usa en un taller de reparación y someCar representa su automóvil en su sistema, entonces su automóvil es el objeto.

Entonces Car es una clase que puede representar cualquier automóvil del mundo real. SomeCar es una instancia de la clase Car y someCare representa un objeto de la vida real (su automóvil).

sin embargo, la instancia y el objeto se usan a menudo de manera intercambiable cuando se habla de codificación

Runa FS
fuente
1
Estrictamente hablando someCares una referencia a una instancia de Car. La instancia en sí no tiene nombre.
Joachim Sauer
2

Cualquier tipo de datos que su computadora almacena y procesa es, en su representación más básica, una fila de bits. La forma en que se interpretan esos bits se realiza mediante tipos de datos. Los tipos de datos pueden ser primitivos o complejos. Los tipos de datos primitivos son, por ejemplo, int o double. Tienen una duración determinada y una forma concreta de interpretación. En el caso de un número entero, generalmente se usa el primer bit para el signo, los otros se usan para el valor.

Los tipos de datos complejos pueden ser combinaciones de tipos de datos primitivos y otros complejos y se denominan "Clase" en Java.

Puede definir el tipo de datos complejo PeopleName que consta de dos cadenas llamadas nombre y apellido. Cada cadena en Java es otro tipo de datos complejo. Las cadenas a cambio se implementan (probablemente) utilizando el tipo de datos primitivo char para el que Java sabe cuántos bits necesitan para almacenar y cómo interpretarlos.

Cuando crea una instancia de un tipo de datos, obtiene un objeto y sus computadoras le reservan algo de memoria y recuerdan su ubicación y el nombre de esa instancia. Una instancia de PeopleName en la memoria ocupará el espacio de las dos variables String y un poco más para la contabilidad. Un número entero ocupa 32 bits en Java.

Los tipos de datos complejos pueden tener métodos asignados. Los métodos pueden realizar acciones en sus argumentos o en la instancia del tipo de datos desde el que llama a este método. Si tiene dos instancias de PeopleName llamadas p1 y p2 y llama a un método p1.getFirstName (), generalmente devuelve el primer nombre de la primera persona pero no el de la segunda.

Kage
fuente
2

El concepto detrás de las clases y los objetos es encapsular la lógica en una sola unidad de programación. Clases son los planos de los objetos que se crean.

Aquí un ejemplo de una clase que representa un automóvil:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Puede crear instancias del objeto Car de esta manera:

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

He tomado el ejemplo de este tutorial.

filip_j
fuente
2

Clase : Estructura

Objeto : Manifestación física

Instancia : cada objeto creado a partir de la clase

Referencia : Dirección del objeto

Abishek M
fuente
1

Clase

  • Tiene existencia lógica, es decir, no se asigna espacio de memoria cuando se crea.

  • Es un conjunto de objetos.

  • Una clase puede considerarse como un modelo para crear objetos.

    • Se crea usando la palabra clave de clase.

    • Una clase define los métodos y los miembros de datos que poseerán los Objetos.


Objeto

  • Tiene existencia física, es decir, se asigna espacio de memoria cuando se crea.

  • Es una instancia de una clase.

  • Un objeto es una entidad única que contiene miembros de datos y funciones de miembros juntos en lenguaje OOP.

    • Se crea utilizando una nueva palabra clave.

    • Un objeto especifica las implementaciones de los métodos y los valores que poseerán los miembros de datos en la clase.


fuente
1
Se puede asignar espacio cuando se "crea" una clase. El espacio es necesario para cualquier variable estática definida por la clase. (Y "lógico" versus "físico" lo está estirando, ya que una representación de objeto es solo ayuda de patrones de bits en algún dispositivo de memoria).
Stephen C
@StephenC, ¿cuál podría ser la otra diferencia entonces?
Vea mi respuesta. Esta pregunta no puede responderse correctamente hablando solo de las diferencias.
Stephen C
0

Una clase es un plano que se necesita para hacer un objeto (= instancia).

La diferencia entre un objeto y una instancia es que un objeto es una cosa y una instancia es una relación.

En otras palabras, instancia describe la relación de un objeto con la clase de la que se hizo el objeto.

Yoji Yamamoto
fuente
-1

La definición "Objeto es una instancia de una clase" es conceptualmente incorrecta, pero correcta según la implementación. En realidad, las características orientadas a objetos se toman de la vida real, para enfocar la mente del programador de más a menos. En la vida real las clases están diseñadas para gestionar el objeto. Por ejemplo, los seres humanos tenemos casta, religión, nacionalidad y mucho más. Estos elencos, religión, nacionalidad son las clases y no tienen existencia sin seres humanos. Pero en la implementación no existen objetos sin clases. Objeto: el objeto es una entidad discreta que tiene algún atributo bien definido. Aquí discreto significa algo que lo hace único de los demás. Un atributo bien definido tiene sentido en algún contexto. Clase: clasificación de objeto que tiene algún comportamiento común u objetos de algún tipo común.

Gaurav Kathuria
fuente
-1

Si bien las respuestas anteriores son correctas, otra forma de pensar sobre las clases y los objetos sería utilizar ejemplos del mundo real: una clase llamada Animal puede contener objetos como gato, perro o pez. Un objeto con un título de Biblia sería de la clase Libro, etc. Las clases son generales, los objetos son específicos. Este ejemplo de pensamiento me ayudó cuando estaba aprendiendo Java.

kurdtpage
fuente
Sí ... pero las analogías también pueden resultar confusas. Si Animales una clase y Cates una instancia, ¿cuál es mi gatito "Fluffy"?
Stephen C
-2

La clase es una plantilla o tipo. Un objeto es una instancia de la clase.

Por ejemplo:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet es una clase y newTweet es un objeto de la clase.

Gagan
fuente
Estas son solo palabras. En realidad, no explicas lo que significan las palabras. (Y, de hecho, las clases de Java NO se comportan como plantillas, ni en la vida real ni de la forma en que lo hacen en lenguajes como Javascript, Python, Ruby, etc.)
Stephen C