tipos que objeto metodos ejercicios ejemplos constructores constructor

que - tipos de constructores en java



¿Por qué los constructores no devuelven valores? (17)

¿Cómo se supone que un constructor debe devolver un valor de retorno? El new operador devuelve la instancia recién creada. No llamas a un ctor, new hace.

MyClass instance = new MyClass();

Si el ctor devolvería un valor, así:

public int MyClass() { return 42; }

¿Dónde recibirías el número entero?

Por favor, dime por qué el constructor no devuelve ningún valor. Quiero una razón técnica perfecta para explicar a mis alumnos por qué el constructor no tiene ningún tipo de devolución.


(Estoy predispuesto hacia C ++, por lo que con respecto a otros idiomas, tome esto con un grano de sal.)

Respuesta corta: no desea tener que comprobar explícitamente el éxito de cada construcción de objeto en su código.

Respuesta algo más larga: en C ++, los constructores son llamados dinámicamente y también para objetos asignados global y automáticamente. En este código

void f() { std::string s; }

no hay forma de que el constructor de s ( std::string::string() ) devuelva ningún valor. O tiene éxito, luego podemos usar el objeto, o lanza una excepción, nunca tenemos la oportunidad de intentar usarlo.

OMI, así es como debería ser.


A pesar de que la implementación de VM de un constructor no devuelve ningún valor, en la práctica lo hace, la referencia del nuevo objeto. Sería sintácticamente extraño y / o confuso poder almacenar una o ambas referencias del nuevo objeto y un valor de retorno adicional en una declaración.


Bueno, de alguna manera devuelve la instancia que acaba de construirse.

Incluso lo llamas así, por ejemplo es Java

Object o = new Something();

que se parece a llamar a un método "regular" con un valor de retorno

Object o = someMethod();


Como sabe, cuando se crea un objeto, el constructor se llamará automáticamente. Entonces imagine que el constructor está devolviendo un valor int. Entonces el código debería tener esto ...

Class ABC { int i; public: int ABC() { i=0; return i; } ....... }; int main() { int k= ABC abc; //constructor is called so we have to store the value return by it .... }

Pero como saben, esa frase como int k= ABC abc; no es posible en ningún lenguaje de programación. Espero que puedas entenderlo.


Constructor no es llamado directamente por el código del usuario. Es llamado por la asignación de memoria y el código de inicialización de objeto en el tiempo de ejecución. Su valor no es visible para el usuario.


Cuando llamas a un constructor, el valor de retorno es el nuevo objeto:

Point pt = new Point(1,2);

Pero dentro del propio constructor, en realidad no está creando y devolviendo el objeto; ha sido creado antes de que comience el código, solo estás configurando los valores iniciales.

Point::Point(int x, int y) { this->x = x; this->y = y; }

La falta de un tipo de devolución refleja el hecho de que los constructores se utilizan de forma diferente que otras funciones. Un tipo de retorno null , aunque técnicamente preciso, no refleja bien el hecho de que el código se utiliza como si devuelve un objeto. Sin embargo, cualquier otro tipo de devolución indicaría que su código debe return algo al final, lo que también es incorrecto.


En el caso de C #, la sintaxis para declarar el objeto es:

classname objectname= new constructor();

De acuerdo con esta línea, si estamos usando el operador de asignación (=) entonces debería devolver algún valor. Pero el objetivo principal de un constructor es asignar valores a las variables, de modo que cuando usamos una nueva palabra clave crea una instancia de esa clase, y el constructor asigna valores a la variable para esa instancia particular de objeto, por lo que el constructor devuelve los valores asignados para ese objeto ejemplo.


Lo que realmente sucede con el constructor es que el tiempo de ejecución usa datos de tipo generados por el compilador para determinar cuánto espacio se necesita para almacenar una instancia de objeto en la memoria, ya sea en la pila o en el montón.

Este espacio incluye todas las variables de miembros y vtbl. Después de asignar este espacio, se llama al constructor como parte interna del proceso de creación de instancias e inicialización para inicializar los contenidos de los campos.

Luego, cuando el constructor sale, el tiempo de ejecución devuelve la instancia recién creada. Por lo tanto, la razón por la que el constructor no devuelve un valor es porque el código no lo llama directamente, sino que lo llama la asignación de memoria y el código de inicialización de objetos en el tiempo de ejecución.

Su valor de retorno (si realmente tiene uno cuando se compila en código máquina) es opaco para el usuario; por lo tanto, no puede especificarlo.


No podemos llamar constructores de forma independiente. En su lugar, se llaman automáticamente cada vez que se crean objetos. Ex:

MyDate md = new Mydate(22,12,2012);

En el ejemplo anterior, new devolverá una ubicación de memoria que será mantenida por md, y programáticamente no podemos devolver múltiples valores en sentencias únicas. Entonces los constructores no pueden devolver nada.


Por lo que sé sobre las metodologías de diseño de OO, diría lo siguiente:

1) Al permitir que un constructor devuelva un valor, el desarrollador del framework permitiría que el programa se bloquee en un instante en el que no se maneja el valor devuelto. Para mantener la integridad del flujo de trabajo del programa, no permitir un valor de retorno desde la inicialización de un objeto es una decisión válida. En cambio, el diseñador del lenguaje sugeriría / obligaría a los codificadores a usar los métodos getter / setter - access.

2) Permitir que el objeto devuelva un valor en la inicialización también abre posibles fugas de información. Especialmente cuando hay múltiples capas o modificaciones de acceso aplicadas a las variables / métodos.


Por lo tanto, la razón por la que el constructor no devuelve un valor es porque el código no lo llama directamente, sino que lo llama la asignación de memoria y el código de inicialización de objetos en el tiempo de ejecución. Su valor de retorno (si realmente tiene uno cuando se compila en código máquina) es opaco para el usuario; por lo tanto, no puede especificarlo.


Un constructor es un método al que se llama automáticamente cuando inicializa una nueva instancia de un objeto.

Este método está ahí si necesita inicializar su objeto a un estado determinado y ejecutar algunos métodos predeterminados.

De hecho, puedes imaginar que el constructor siempre devuelve la instancia del objeto creado que sería una buena imagen.


Un punto que aún no se ha discutido es que el constructor de la clase "foo" debe ser utilizable no solo al crear instancias de foo, sino también al crear instancias de clases derivadas de foo. En ausencia de genéricos (que no estaban disponibles cuando se diseñaron Java, C ++ o .net) no habría forma de que el constructor de foo devolviera un objeto de cualquier clase derivada. Por lo tanto, lo que debe suceder es que el objeto de la clase derivada se cree a través de otros medios y luego esté disponible para el constructor de foo (que luego podrá usar el objeto en cuestión como un foo al hacer su inicialización).


Usaría Java como mi idioma en la respuesta.

class SayHelloOnCreation { public SayHelloOnCreation() { System.out.println("Hello, Thanks For Creating me!"); } } class Test { public static void main(String[]args) { SayHelloOnCreation thing = new SayHelloOnCreation(); //This line here, produces an output - Hello, Thanks For Creating me! } }

Ahora veamos qué está pasando aquí. en java, usamos la nueva palabra clave para crear una instancia de una clase. Y como puede ver en el código, en la línea, SayHelloOnCreation thing = new SayHelloOnCreation (); , la expresión después de que el operador de asignación se ejecute antes de que se realice la asignación. Entonces, usando la palabra clave new , llamamos al constructor de esa clase ( SayHelloOnCreation () ) y este constructor crea un objeto en el Heap de Java. Después de crear el objeto, se asigna una referencia a ese objeto a la referencia de cosa de tipo SayHelloOnCreation .

El punto que intento mantener aquí es que si se permite a los constructores tener un tipo de devolución, en primer lugar , la naturaleza fuertemente tipada del lenguaje se vería comprometida (Recuerde que estoy hablando de Java aquí).

En segundo lugar , se crea aquí un objeto de la clase SayHelloOnCreation , así que, de forma predeterminada, supongo que el constructor devuelve una referencia del mismo tipo, para evitar ClassCastException .


todas las respuestas están sesgadas hacia C ++ / Java. no hay ninguna razón para que un constructor no devuelva un valor que no sea el diseño del idioma.

mira a un constructor en un sentido más amplio: es una función que construye un nuevo objeto. puedes escribir constructores perfectamente válidos en C:

typedef struct object object; int object_create( object **this );

esto es POO perfecto en C y el constructor devuelve valor (esto también se puede llamar fábrica, pero el nombre depende de la intención).

sin embargo, para crear un objeto automáticamente (para satisfacer algún tipo de conversión, o conversión, por ejemplo), tiene que haber algunas reglas definidas. en C ++, hay un constructor sin argumento, que el compilador infiere si no está definido.

la discusión es más amplia de lo que pensamos. Programación orientada a objetos es un nombre que describe una forma de pensar acerca de la programación. puede tener OO en casi cualquier idioma: todo lo que necesita son estructuras y funciones. Los lenguajes principales como C ++ y Java son tan comunes que creemos que definen "el camino". Ahora mire el modelo OO en Ada: está lejos del modelo de C ++ pero sigue siendo OO. estoy seguro de que idiomas como Lisp tienen otras formas de hacer OO.


lo encontré útil

Esta confusión surge de la suposición de que los constructores son como cualquier otra función / método definido por la clase. No, ellos no son.

Los constructores son solo parte del proceso de creación de objetos. No se llaman como otras funciones miembro.