Cuando declara una clase en Java, solo está creando un nuevo tipo de datos. Una clase proporciona el modelo para los objetos. Puede crear un objeto a partir de una clase. Sin embargo, obtener objetos de una clase es un proceso de dos pasos:
- Declaración: primero, debe declarar una variable del tipo de clase. Esta variable no define un objeto. En cambio, es simplemente una variable que puede referirse a un objeto. A continuación se muestra la sintaxis general de la declaración con un ejemplo:
Syntax : class-name var-name; Example : // declare reference to an object of class Box Box mybox;
Una variable en este estado, que actualmente no hace referencia a ningún objeto, se puede ilustrar de la siguiente manera (el nombre de la variable, mybox, más una referencia que no apunta a nada):
- Creación de instancias e inicialización: en segundo lugar, debe adquirir una copia física real del objeto y asignarla a esa variable. Puedes hacer esto usando el operador new . El operador new instancia una clase asignando dinámicamente (es decir, asignación en tiempo de ejecución) memoria para un nuevo objeto y devolviendo una referencia a esa memoria. Esta referencia luego se almacena en la variable. Por lo tanto, en Java, todos los objetos de clase deben asignarse dinámicamente.
El operador new también va seguido de una llamada a un constructor de clase, que inicializa el nuevo objeto. Un constructor define lo que ocurre cuando se crea un objeto de una clase. Los constructores son una parte importante de todas las clases y tienen muchos atributos significativos. En el siguiente ejemplo, usaremos el constructor predeterminado . A continuación se muestra la sintaxis general de creación de instancias e inicialización con un ejemplo:
Syntax : var-name = new class-name(); Example : // instantiation via new operator and // initialization via default constructor of class Box mybox = new Box();
Antes de entender cómo new asigna memoria dinámicamente, veamos el prototipo de Class Box .
class Box { double width; double height; double depth; }
Una variable después del segundo paso, actualmente se refiere a un objeto de clase, se puede ilustrar de la siguiente manera (el nombre de la variable, mybox, más una referencia que apunta al objeto Box):
Por lo tanto, la declaración de una variable de clase, la instanciación de una clase y la inicialización de un objeto de clase se pueden ilustrar juntas de la siguiente manera:
Puntos importantes :
- Las dos declaraciones anteriores se pueden reescribir como una sola declaración.
Box mybox = new Box();
- La referencia devuelta por el operador new no tiene que estar asignada a una variable de clase. También se puede utilizar directamente en una expresión. Por ejemplo:
double height = new Box().height;
- Dado que las arrays son objetos en Java , por lo tanto, al crear instancias de arrays, usamos el operador new . Por ejemplo:
int arr[] = new int[5];
- En este punto, es posible que se pregunte por qué no necesita usar el operador new para los tipos de datos primitivos . La respuesta es que los tipos primitivos de Java no se implementan como objetos. Más bien, se implementan como variables «normales». Esto se hace en aras de la eficiencia. Para ver las versiones de objetos de los tipos de datos primitivos, consulte Wrapper Classes .
- La frase «crear una instancia de una clase» significa lo mismo que «crear un objeto». Cuando crea un objeto, está creando una «instancia» de una clase, por lo tanto, «instanciando» una clase.
Asignación de variables de referencia de objetos
Cuando asigna una variable de referencia de objeto a otra variable de referencia de objeto, no está creando una copia del objeto, solo está haciendo una copia de la referencia. Entendamos esto con un ejemplo.
// Java program to demonstrate assigning // of object reference variables // Box class class Box { double width; double height; double depth; } // Driver class public class Test { // Driver method public static void main(String[] args) { // creating box object Box b1 = new Box(); // assigning b2 to b1 Box b2 = b1; // height via b1 and b2 System.out.println(b1.height); System.out.println(b2.height); // changing height via b2 b2.height = 20; // height via b1 and b2 // after modification through b2 System.out.println(b1.height); System.out.println(b2.height); } }
Producción :
0.0 0.0 20.0 20.0
Explicación :
Primero, comprendamos qué hace el siguiente fragmento en el programa anterior.
Box b1 = new Box(); Box b2 = b1;
Podría pensar que a b2 se le está asignando una referencia a una copia del objeto al que se refiere b1 . Es decir, podría pensar que b1 y b2 se refieren a objetos separados y distintos. Sin embargo, esto estaría mal. En cambio, después de que se ejecute este fragmento, b1 y b2 se referirán al mismo objeto. La asignación de b1 a b2 no asignó ninguna memoria ni copió ninguna parte del objeto original. Simplemente hace que b2 se refiera al mismo objeto que b1 . Por lo tanto, cualquier cambio realizado en el objeto a través de b2 afectará al objeto al que b1se refiere, ya que son el mismo objeto. Lo mismo se puede verificar mediante la salida cuando cambiamos la altura del cuadro a través de b2 .
Esta situación se puede ilustrar de la siguiente manera:
Nota: aunque b1 y b2 se refieren al mismo objeto, no están vinculados de ninguna otra manera. Por ejemplo, una asignación posterior a b1 simplemente desenganchará b1 del objeto original sin afectar el objeto ni afectar a b2 . Por ejemplo:
Box b1 = new Box(); Box b2 = b1; // ... b1 = null;
Aquí, b1 se ha establecido en nulo , pero b2 aún apunta al objeto original.
Pasar variables de referencias de objetos a métodos
Cuando pasamos una referencia de objeto a un método, el parámetro que lo recibe se referirá al mismo objeto al que hace referencia el argumento. Para obtener más información con ejemplos, consulte Pasar y devolver objetos en Java.
Este artículo es una contribución de Gaurav Miglani . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA