Stack Overflow en español Asked by Gabriel Godoy Osses on August 27, 2021
No logro entender cuando dentro de la invocación de un método a través de un objeto se envía un new Objeto()
, por ejemplo Controlador controlador = new Controlador(new Perro());
.
No logro entender qué es lo que se está enviando en este caso al parámetro del constructor. ¿Cómo se está enviando un new? Normalmente uno envía datos, un objeto ya instanciado, una variable, un String pero un new Objeto(), y como se comporta dentro del constructor cuando ya llega ese new Objeto()
, esa asignación this._animal = animal
, ¿o esto se puede hacer solamente cuando hay una interfaz como parámetro?
Ejemplo inventado por mí:
public interface Animal {
void comer();
}
public class Perro implements Animal {
@Override
public void comer() {
System.out.println("Estoy comiendo como un Canino");
}
}
public class Gato implements Animal {
@Override
public void comer() {
System.out.println("Estoy comiendo como un Felino");
}
}
public class Controlador {
private Animal _animal;
public Controlador(Animal animal) { // Como llegaría al Parametro ??
this._animal = animal; // Sería lo mismo que decir _animal = new Perro(); ??
}
public void comerImpl() {
_animal.comer();
}
}
public class Principal {
public static void main(String[] args) {
Controlador controlador = new Controlador(new Perro());
controlador.comerImpl();
}
}
Según la documentación de Java:
The new operator returns a reference to the object it created. This reference is usually assigned to a variable of the appropriate type, like:
Point originOne = new Point(23, 94);
Traducido al español:
El operador new
devuelve una referencia al objeto que creó. Esta referencia generalmente se asigna a una variable del tipo apropiado.
Esto significa que la variable originOne
guarda una referencia devuelta por new Point(23, 94)
, en la cual servirá para referirnos al objeto o llegar hacia el.
Sabiendo esto, podemos responder esta duda:
No logro entender qué es lo que se está enviando en este caso al parámetro del constructor. ¿Cómo se está enviando un new?
El parámetro (que también es una variable) del constructor lo que recibe es la referencia. Una referencia no es más que un identificador para poder identificar al objeto.
Por lo tanto cuando haces esta asignación:
this._animal = animal;
Lo que sucede es que estás asignando la referencia que tiene guardada la variable animal
en _animal
. Por lo tanto, la variable _animal
y animal
hacen referencia al mismo objeto.
Sería lo mismo que decir _animal = new Perro();
No es lo mismo. Ya que ahí estarías asignando una nueva referencia a _animal
y eso hace que _animal
y animal
no se refieran al mismo objeto.
¿o esto se puede hacer solamente cuando hay una interfaz como parámetro?
Nada que ver. El tipo del parámetro podría ser una clase también.
Observación:
Los nombres de las variables no deben empezar con guion bajo..
Answered by MrDave1999 on August 27, 2021
Java, en su funcionalidad, tiene dos localidades de memoria: el stack y el heap.
En el stack se encuentran la declaracion de las variables que guardan el valor (en caso de los primitivos como int, long, boolean) o la dirección de los objetos en el heap.
Cuando estas pasando un new Objeto() como parametro, estas creando una locacion de memoria en el heap para almacenar este objeto, pero este objeto no tiene una referencia directa en el stack, si no que dentro del objeto donde lo pasaste como parametro esta la referencia.
En tu ejemplo, la variable controlador esta en el stack y hace referencia al heap con new Controlador(), dentro del heap donde se guardo new Controlador() hay una referencia a new Animal().
Básicamente, lo unico que te estas ahorrando es una localidad de memoria en el stack al no declarar una variable para almacenar la referencia de new Animal().
Eue esto te puede ayudar a entender el heap y el stack.
http://www.javahispano.org/certificacion/2011/9/27/stack-y-heap.html
Answered by faxterol on August 27, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP