Sé que este tipo de pregunta se ha hecho antes , pero todavía siento que la respuesta es demasiado ambigua para mí (y, por extensión, para algunos / la mayoría de los principiantes) para comprender.
He estado tratando de enseñarme a mí mismo conceptos más amplios de programación que OOP procedimental y básico. Entiendo los conceptos concretos de la programación orientada a objetos (crea una clase que tiene datos (miembros) y funciones (métodos) y luego crea una instancia de esa clase en tiempo de ejecución para hacer cosas, ese tipo de cosas).
Creo que tengo una idea de lo que es una clase (una especie de plano de diseño para una instancia que se creará a su semejanza en el momento de la compilación ). Pero si ese es el caso, ¿qué es un objeto? También sé que en los lenguajes basados en prototipos, esto puede estropear las cosas aún más, pero quizás por eso es necesario que haya una clara distinción entre objeto e instancia en mi mente.
Más allá de eso, lucho con los conceptos de "objeto" e "instancia". Muchos de los recursos que leí (incluidas las respuestas en SO) dicen que son en gran parte iguales y que la diferencia está en la semántica. Otras personas dicen que existe una verdadera diferencia conceptual entre los dos.
¿Pueden los expertos de SO ayudar a un principiante a tener ese momento "ajá" para avanzar en el mundo de OOP?
Nota: esto no es tarea, no voy a la escuela; sin embargo, creo que ayudaría a las personas que buscan ayuda con la tarea.
Respuestas:
Un plano para el diseño de una casa es como una descripción de clase. Todas las casas construidas a partir de ese plano son objetos de esa clase. Una casa determinada es un ejemplo.
fuente
La verdad es que la programación orientada a objetos a menudo crea confusión al crear una desconexión entre el lado filosófico del desarrollo y el funcionamiento mecánico real de la computadora. Intentaré contrastar los dos para ti:
El concepto básico de OOP es este: Clase >> Objeto >> Instancia.
La clase = el anteproyecto. El Objeto es una cosa real que se construye sobre la base del 'plano' (como la casa). Una instancia es una copia virtual (pero no una copia real) del objeto.
La explicación más técnica de una 'instancia' es que es una 'referencia de memoria' o una variable de referencia. Esto significa que una 'instancia' es una variable en la memoria que solotiene una dirección de memoria de un objeto. El objeto al que se dirige es el mismo objeto del que se dice que la instancia es 'una instancia de'. Si tiene muchas instancias de un objeto, en realidad solo tiene muchas variables en lugares diferentes en su memoria que tienen la misma dirección de memoria exacta, que son todas la dirección del mismo objeto exacto. Nunca puede 'cambiar' una instancia, aunque parece que puede hacerlo en su código. Lo que realmente hace cuando 'cambia' una instancia es cambiar el objeto original directamente. Electrónicamente, el procesador pasa por un lugar adicional en la memoria (la variable / instancia de referencia) antes de cambiar los datos del objeto original.
El proceso es: procesador >> ubicación de memoria de la instancia >> ubicación de memoria del objeto original.
Tenga en cuenta que no importa qué instancia utilice, el resultado final siempre será el mismo. TODAS las instancias continuarán manteniendo la misma información exacta en sus ubicaciones de memoria, la dirección de memoria del objeto, y solo el objeto cambiará.
La relación entre clase y objeto es un poco más confusa, aunque filosóficamente es la más fácil de entender (plano >> casa). Si el objeto son datos reales que se encuentran en algún lugar de la memoria, ¿qué es 'clase'? Resulta que mecánicamente el objeto es una copia exacta de la clase. Entonces, la clase es solo otra variable en algún otro lugar de la memoria que contiene exactamente la misma información que el objeto. Note la diferencia entre las relaciones:
El objeto es una copia de la clase. La instancia es una variable que contiene la dirección de memoria del objeto.
También puede tener varios objetos de la misma clase y luego varias instancias de cada uno de esos objetos. En estos casos, el conjunto de instancias de cada objeto tiene un valor equivalente, pero las instancias entre objetos no lo son. Por ejemplo:
Deje que la clase A de la clase A sea Object1, Object2 y Object3.
// Object1 tiene exactamente el mismo valor que object2 y object3, pero están en diferentes lugares de la memoria.
de Object1 >> deje obj1_Instance1, obj1_Instace2, obj1_Instance3
// todas estas instancias también son equivalentes en valor y en diferentes lugares de la memoria. Sus valores = Object1.MemoryAddress.
etc.
Las cosas se complican cuando empiezas a introducir tipos. A continuación, se muestra un ejemplo con tipos de c #:
// asumimos que la clase Person existe Person john = new Person ();
En realidad, este código es más fácil de analizar si lo divide en dos partes:
En términos técnicos, la primera línea 'declara una variable de tipoPersona. ¿¿Pero qué significa eso?? La explicación general es que ahora tengo una variable vacía que solo puede contener un objeto Person. Pero espere un minuto, ¡es una variable vacía! No hay nada en esa ubicación de memoria de variables. Resulta que los "tipos" carecen mecánicamente de significado. Los tipos se inventaron originalmente como una forma de administrar datos y nada más. Incluso cuando declara tipos primitivos como int, str, chr (sin inicializarlo), no sucede nada dentro de la computadora. Este extraño aspecto sintáctico de la programación es parte de donde la gente tiene la idea de que las clases son el modelo de los objetos. Los POO se han vuelto aún más confusos con tipos con tipos de delegados, controladores de eventos, etc. Intentaría no centrarme demasiado en ellos y recordar que todos son un nombre inapropiado.
La segunda línea también es un poco confusa porque hace dos cosas a la vez:
Primero se evalúa la "nueva Persona ()" del lado derecho. Crea una nueva copia de la clase Person, es decir, crea un nuevo objeto.
El lado izquierdo "john =", se evalúa después de eso. Convierte a john en una variable de referencia dándole la dirección de memoria del objeto que se acaba de crear en el lado derecho de la misma línea.
Si desea convertirse en un buen desarrollador, es importante comprender que ningún entorno informático funciona según los ideales filosóficos. Las computadoras ni siquiera son tan lógicas, en realidad son solo una gran colección de cables que están pegados entre sí mediante circuitos booleanos básicos (principalmente NAND y OR).
fuente
La palabra Clase proviene de Clasificación ( una categoría en la que se coloca algo ). Ahora todos hemos escuchado que una clase es como un plano, pero ¿qué significa esto exactamente? Significa que la Clase contiene una Descripción de una Categoría en particular ( me gustaría mostrar la diferencia entre Clase, Objeto e Instancia con un ejemplo usando Java y pediría a los lectores que la visualicen como una Historia mientras la leen, y si no están familiarizados con Java, no importa ) Así que comencemos con crear una Categoría llamada HumanBeing , para que el programa Java lo exprese de la siguiente manera
Ahora, ¿qué atributos tiene un Ser Humano en general Nombre , Edad , Altura , Peso? Por ahora limitemos nuestro ser a estos cuatro atributos, agreguemos a nuestra Categoría.
Ahora cada categoría tiene un comportamiento, por ejemplo, la categoría Perro tiene un comportamiento para ladrar, buscar, rodar, etc., de manera similar, nuestra categoría HumanBeing también puede tener cierto comportamiento, por ejemplo, cuando le preguntamos a nuestro HumanBeing cuál es su nombre / edad / peso / ¿altura? Debería darnos su nombre / edad / peso / altura, así que en java lo hacemos de la siguiente manera
Ahora hemos agregado comportamiento a nuestra categoría HumanBeing , por lo que podemos preguntar su nombre, edad, altura, peso, pero a quién le pedirá estos detalles, porque
class HumanBeing
es solo una categoría, es un plano, por ejemplo, un arquitecto hace un plano en un papel del edificio que quiere construir, ahora no podemos seguir viviendo en el plano ( su descripción del edificio ) solo podemos vivir en el edificio una vez que esté construido Así que aquí tenemos que hacer un ser humano de nuestra categoría que hemos descrito anteriormente, entonces, ¿cómo hacemos eso en JavaAhora, en el ejemplo anterior, hemos creado nuestro primer ser humano con nombre edad altura peso, entonces, ¿qué está sucediendo exactamente en el código anterior? . Estamos creando una instancia de nuestra categoría Ser humano, es decir, se crea un objeto de nuestra clase
Caso 1: Objeto e Instancia parecen ser sinónimos
Permítanme desarrollar un poco, cuando decimos que
HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);
un objeto de nuestra categoría se crea en la memoria del montón y se le asigna una dirección, yfirstHuman
tiene una referencia a esa dirección, ahora este objeto es Un Objeto del Ser Humano y también una Instancia del Ser Humano . Aquí parece que Objetos e Instancia son sinónimos, me repito que no son sinónimosReanudamos nuestra historia, hemos creado nuestro primer humano, ahora podemos preguntarle su nombre, edad, estatura, peso, así es como lo hacemos en Java
así que tenemos el primer ser humano y vamos a mover la pluma al darle a nuestro primer ser humano alguna calificación, vamos a convertirlo en Doctor, entonces necesitamos una categoría llamada Doctor y darle a nuestro Doctor un comportamiento, así que en Java hacemos lo siguiente
Aquí hemos usado el concepto de Herencia que trae cierta reutilización en el código, Cada Doctor siempre será un HumanBeing primero, por lo que un Doctor tendrá Nombre, Edad, Peso, Altura que se heredará de HumanBeing en lugar de escribirlo de nuevo. tenga en cuenta que acabamos de escribir una descripción de un médico, aún no hemos creado una, así que creemos un Doctor en nuestro
class Birth
Caso 2: Objeto e Instancia no son Sinónimos
En el código anterior podemos visualizar que estamos instanciando nuestra categoría Doctor y dándole vida, es decir, simplemente estamos creando un Objeto de la categoría Doctor , Como ya sabemos, los Objetos se crean en la Memoria Heap y
firstDoctor
contiene una referencia a ese Objeto en el montón;Este objeto en particular
firstDoctor
es el siguiente (tenga en cuenta quefirstDoctor
contiene una referencia al objeto, no es el objeto en sí)firstDoctor
es un objetoclass Doctor
y una instancia de Aclass Doctor
firstDoctor
noclass HumanBeing
es un objeto de sino una instancia declass HumanBeing
Entonces, un objeto en particular puede ser una instancia de una clase en particular, pero no necesita ser un objeto de esa clase dada
Conclusión:
El ejemplo del mundo real será el siguiente, nacemos como seres humanos, así que imagínenos como un objeto humano, ahora, cuando crecemos, asumimos responsabilidades y aprendemos nuevas habilidades y desempeñamos diferentes roles en la vida. , madre ahora ¿Qué somos en realidad? Podemos decir que somos Objetos de Humanos, Pero Instancias de Hermano, hija, ..., etc.
espero que esto ayude
Gracias
fuente
Los objetos son cosas en la memoria, mientras que las instancias son cosas que hacen referencia a ellos. En la foto de arriba:
fuente
Un objeto es una instancia de una clase (para lenguajes basados en clases).
Creo que esta es la explicación más simple que se me ocurre.
fuente
Una clase define un objeto. Puede ir aún más lejos en muchos idiomas y decir que una interfaz define atributos y métodos comunes entre objetos.
Un objeto es algo que puede representar algo en el mundo real. Cuando desee que el objeto represente realmente algo en el mundo real, se debe crear una instancia de ese objeto. La instanciación significa que debe definir las características (atributos) de este objeto específico, generalmente a través de un constructor.
Una vez que haya definido estas características, ahora tiene una instancia de un objeto.
Espero que esto aclare las cosas.
fuente
"Una clase describe un conjunto de objetos llamados sus instancias". - Grupo de investigación de aprendizaje de Xerox, "El sistema Smalltalk-80", Revista Byte Volumen 06 Número 08, p39, 1981.
fuente
¿Qué es un objeto?
Un objeto es una instancia de una clase. El objeto se puede entender mejor al encontrar ejemplos del mundo real a tu alrededor. Su escritorio, su computadora portátil, su automóvil son buenos ejemplos del mundo real de un objeto.
Los objetos del mundo real comparten dos características, todos tienen estado y comportamiento. Los seres humanos también son un buen ejemplo de un objeto. Los seres humanos tenemos un estado / atributos - nombre, altura, peso y comportamiento - caminar, correr, hablar, dormir, codificar: P.
¿Qué es una clase?
Una clase es un plano o una plantilla que describe los detalles de un objeto. Estos detalles son a saber
atributos de nombre / operaciones de estado / métodos
Considere el ejemplo anterior, los campos
speed
ygear
representarán el estado del objeto y los métodoschangeGear
,speedUp
yapplyBrakes
definirán el comportamiento del objeto Car con el mundo exterior.Referencias:
fuente
Creo que es importante señalar que generalmente hay dos cosas. El plano y las copias. La gente tiende a nombrar estas cosas diferentes; clases, objetos, instancias son solo algunos de los nombres que la gente usa para ellos. Lo importante es que existe el plano y las copias del mismo, independientemente de sus nombres. Si ya comprende estos dos, simplemente evite las otras cosas que lo confunden.
fuente
Comparemos manzanas con manzanas. Todos sabemos lo que es una manzana. Qué aspecto tiene. A qué sabe. Eso es una clase. Es la definición de una cosa. Es lo que sabemos sobre una cosa.
Ahora ve a buscar una manzana. Esa es una instancia. Lo podemos ver. Podemos saborearlo. Podemos hacer cosas con él. Es lo que tenemos.
Clase = Lo que sabemos sobre algo. Una definicion.
Objeto / Instancia = Algo que se ajuste a esa definición que tenemos y con lo que podemos hacer cosas.
fuente
En algunos casos, el término "objeto" puede usarse para describir una instancia, pero en otros casos se usa para describir una referencia a una instancia. El término "instancia" solo se refiere a la instancia real.
Por ejemplo, una lista puede describirse como una colección de objetos, pero lo que realmente contiene son referencias a instancias de objetos.
fuente
Siempre me ha gustado la idea de que la definición de una clase sea igual a la de un "Tipo de datos abstracto" . Es decir, cuando definiste una clase, estás definiendo un nuevo tipo de "algo", su representación del tipo de datos, en términos de primitivas y otros "algo", y su comportamiento en términos de funciones y / o métodos. (Perdón por la generalidad y el formalismo)
Cada vez que definió una clase, abre una nueva posibilidad para definir ciertas entidades con sus propiedades y comportamiento, cuando crea una instancia y / o crea un objeto en particular a partir de ella, en realidad está materializando esa posibilidad.
A veces, los términos objeto e instancias son intercambiables. Algunos puristas de OOP mantendrán que todo es un objeto, no me quejaré, pero en el mundo real de OOP, los desarrolladores usamos dos conceptos:
fuente
La programación orientada a objetos es una metáfora del sistema que le ayuda a organizar el conocimiento que su programa necesita manejar, de una manera que le facilitará el desarrollo de su programa. Cuando elige programar usando OOP, toma sus OOP-Googles y decide que verá el problema del mundo real como muchos objetos colaborando entre ellos, enviando mensajes. En lugar de ver a un chico conduciendo un coche, ves a un chico enviando un mensaje al coche indicando lo que quiere que haga. El automóvil es un objeto grande y responderá a ese mensaje enviando un mensaje a su motor o rueda para poder responder correctamente a lo que el conductor le dijo que hiciera en el mensaje, etc.
Una vez que ha creado la metáfora de su sistema y está viendo toda la realidad como objetos que envían mensajes, decide poner todas las cosas que está viendo que son relevantes para el dominio de su problema en la PC. Ahí te das cuenta de que hay muchos Guys manejando diferentes tarjetas, y no tiene sentido programar el comportamiento de cada uno de ellos por separado porque todos se comportan de la misma manera ... Entonces puedes decir dos cosas:
Luego comienza a poner en la computadora la información de cómo se comportan todos los controladores (o cómo se comporta el primer controlador, y cómo el segundo y el tercero difieren de ese), y después de un tiempo tiene su programa y usa el código para cree tres controladores que sean el modelo que está utilizando dentro de esa PC para hacer referencia a los controladores que vio en el mundo real. Esos 3 controladores que creó dentro de la PC son instancias del prototipo (en realidad, el primero es el prototipo, el primero podría ser el prototipo en sí, dependiendo de cómo modele las cosas) o la clase que creó. La diferencia entre instancia y objeto es que el objeto es la metáfora que usas en el mundo real. Eliges ver al chico y al coche como objetos (sería incorrecto decir que los ves como instancias) colaborando entre sí. Y luego lo usa como inspiración para crear su código. La instancia solo existe en su programa, después de haber creado el prototipo o la clase. Los "objetos" existen fuera de la PC porque es el mapeo que usa para unir el mundo real con el programa. Une a Guy con la instancia de Driver que creaste en la PC. Por tanto, el objeto y la instancia están extremadamente relacionados, pero no son exactamente lo mismo (una instancia es un "tramo" de un objeto en el programa, y el otro "tramo" está en el mundo real).
fuente
Supongo que ya se ha dado la mejor respuesta.
Las clases son planos y los objetos son edificios o ejemplos de ese plano también me sirvieron.
A veces, me gustaría pensar que las clases son plantillas (como en MS Word), mientras que los objetos son los documentos que usan la plantilla.
fuente
Ampliando uno de los ejemplos dados anteriormente en este hilo ...
Considere un escenario: existe el requisito de que se deben construir 5 casas en un vecindario con fines residenciales. Las 5 casas comparten una arquitectura de construcción común. La arquitectura de la construcción es una clase . La casa es un objeto . Cada casa con gente alojada en ella es un ejemplo .
fuente