En Java, new MyClass()
creates a new instance de MyClass
y devuelve una referencia al mismo.
Mientras tanto, la declaración:
MyClass foo;
define una variable foo
que puede almacenar una referencia a una instancia de MyClass
, o el valor especial null
que indica la ausencia de dicha referencia. Si no hace referencia a foo
, su valor predeterminado será null
.
Sin duda, puede combinar estas cosas, p. de esta manera:
MyClass foo; // define a variable foo that can store an object reference
foo = new MyClass(); // create a new object and assign a reference to it to foo
o, equivalentemente, de esta manera:
MyClass foo = new MyClass(); // combined variable definition and assignment
Pero usted no tiene para crear una nueva instancia cada vez que se asigna algo a una variable de referencia. También podría hacer, por ejemplo, esto:
MyClass foo, bar; // define two reference variables, foo and bar
foo = new MyClass(); // create a new object and assign a reference to it to foo
bar = foo; // now foo and bar point to the same object
o incluso:
MyClass foo = new MyClass(), bar = foo; // same, but shorter
Tenga en cuenta que en Java, a diferencia de algunos otros lenguajes como C++, nunca se puede asignar (una copia de) un objeto real en una variable. Por el contrario, siempre se accede a los objetos Java mediante referencias a ellos. Cuando alguien habla de "asignar un objeto a una variable" o "pasar un objeto como parámetro" o "devolver un objeto de un método" en Java, lo que siempre significan en realidad es asignar o pasar o devolver una referencia a un objeto.
Los métodos que sus llamadas de código pueden (y suelen hacer) también devuelven referencias a objetos.Por ejemplo, si su clase tenía un método como este:
private MyClass getSomeObject() {
// ...some code here...
}
se le puede llamar y guardar la referencia se vuelve en una variable de la siguiente manera:
MyClass foo;
foo = getSomeObject();
o como esto:
MyClass foo = getSomeObject();
Podemos decir por la declaración de método que getSomeObject()
siempre devolverá una referencia a una instancia MyClass
(o null
), pero no donde th por ejemplo, en realidad proviene de. Eso depende completamente de lo que haga el código dentro del método getSomeObject()
. El código siempre puede crear una nueva instancia MyClass
con new MyClass()
cada vez que se invoca, y devolver una referencia a ella, o siempre puede devolver una referencia al mismo objeto . O, por supuesto, a veces podría devolver una referencia a un nuevo objeto, y a veces a uno previamente creado.
Tenga en cuenta que, si asigna un nuevo valor a una variable, cualquiera que sea la variable contenida anteriormente será olvidada. Si el valor olvidado es la última referencia a algún objeto, ese mismo objeto será destruido por el recolector de basura de Java.
Así, por ejemplo, aunque sin duda es posible a hacer algo como esto:
MyClass foo = new MyClass(); // create a new object and assign (a reference to) it to foo
foo = getSomeObject(); // forget the previous content of foo and replace it with whatever getSomeObject() returns
que normalmente no tiene sentido, ya que estaría creando una nueva MyClass
ejemplo solo para arrojarlo inmediatamente lejos su solo hace referencia a él y lo reemplaza con otra cosa. En efecto, el código anterior es exactamente equivalente a:
new MyClass(); // create a new object and throw away(!) the reference to it
MyClass foo = getSomeObject(); // assign whatever getSomeObject() returns to foo
La única vez que puede llegar incluso a distancia tiene sentido sería si quería para crear una nueva instancia MyClass
e inmediatamente deja que sea basura recogida, por ejemplo, porque el constructor MyClass
tuvo algunos efectos secundarios que quería activar. Pero dado que generalmente se considera un mal estilo para los constructores tener efectos secundarios no triviales (o, más en general, para hacer algo más que configurar el nuevo objeto), normalmente no debería tener ninguna excusa para escribir dicho código.
¿Cómo se puede saber si un objeto ya se ha creado? – foobar5512
Cuando intente hacer referencia a él, será nulo. Puede verificarlo por algo como (consulte mi actualización) – AedonEtLIRA
. Obtiene esta información de la documentación, o experiencia. Por ejemplo, los administradores a menudo se usan como singleton (o similar), por lo que solo hay una instancia. Este tipo de clases no se crean, pero hay una función para recuperar el objeto. –