una tiene son sirven resueltos que programacion para metodo las ejercicios ejemplo definicion clases clase abstracto abstractas abstracta java c++ object creation

tiene - que son las clases abstractas en java



¿Cuál es la principal diferencia en la creación de objetos entre Java y C++? (7)

Me estoy preparando para un examen en Java y una de las preguntas de un examen anterior fue: "¿Cuál es la principal diferencia en la creación de objetos entre Java y C ++?"

Creo que conozco los conceptos básicos de la creación de objetos como, por ejemplo, cómo se llama a los constructores y qué hacen los bloques de inicialización en Java y qué sucede cuando el constructor de una clase llama a un método de otra clase que aún no está construido y así sucesivamente, pero puedo No encuentro nada obvio. Se supone que la respuesta es una o dos oraciones, por lo que no creo que la descripción de todo el proceso de creación de objetos en Java sea lo que tenían en mente.

¿Algunas ideas?


¿Cuál es la principal diferencia en la creación de objetos entre Java y C ++?

A diferencia de Java, en C ++ también se pueden crear objetos en la pila.

Por ejemplo en C ++ puedes escribir

Class obj; //object created on the stack

En Java puedes escribir

Class obj; //obj is just a reference(not an object) obj = new Class();// obj refers to the object



Además de otras respuestas excelentes, una cosa es muy importante, y generalmente se ignora / se olvida, o se malinterpreta (lo que explica por qué detallo el proceso a continuación):

  • En Java, los métodos son virtuales, incluso cuando se los llama desde el constructor (lo que podría provocar errores)
  • En C ++, los métodos virtuales no son virtuales cuando se los llama desde el constructor (lo que podría llevar a malentendidos)

¿Qué?

  • Imaginemos una clase base, con un método virtual foo ().
  • Imaginemos una clase Derivada, heredada de Base, que reemplaza el método foo ()

La diferencia entre C ++ y Java es:

  • En Java, llamar a foo () desde el constructor de la clase Base llamará a Derived.foo ()
  • En C ++, llamar a foo () desde el constructor de la clase Base llamará a Base.foo ()

¿Por qué?

Los "bugs" para cada idioma son diferentes:

  • En Java, llamar a cualquier método en el constructor podría llevar a errores sutiles, ya que el método virtual anulado podría intentar acceder a una variable que fue declarada / inicializada en la clase Derivada.

Conceptualmente, el trabajo del constructor es traer el objeto a la existencia (lo cual no es una hazaña ordinaria). Dentro de cualquier constructor, el objeto completo podría formarse solo parcialmente; solo puede saber que los objetos de clase base se han inicializado, pero no puede saber qué clases se heredan de usted. Sin embargo, una llamada a un método enlazado dinámicamente llega "hacia adelante" o "hacia afuera" a la jerarquía de herencia. Se llama a un método en una clase derivada. Si haces esto dentro de un constructor, llamas a un método que podría manipular a los miembros que aún no se han inicializado, una receta segura para el desastre.

Bruce Eckel, http://www.codeguru.com/java/tij/tij0082.shtml

  • En C ++, uno debe recordar que un virtual no funcionará como se espera, ya que solo se llamará al método de la clase construida actual. El motivo es evitar el acceso a miembros de datos o incluso métodos que aún no existen.

Durante la construcción de la clase base, las funciones virtuales nunca pasan a clases derivadas. En cambio, el objeto se comporta como si fuera del tipo base. Hablando de manera informal, durante la construcción de la clase base, las funciones virtuales no lo son.

Scott Meyers, http://www.artima.com/cppsource/nevercall.html


En Java, la Máquina Virtual de Java (JVM) que ejecuta el código Java tiene que registrar todos los objetos que se crean (o las referencias a ellos para que sean exactos), de modo que la memoria asignada para ellos pueda ser liberada automáticamente por la recolección de basura cuando No se hace referencia más.

EDIT: No estoy seguro de si esto se puede atribuir a la creación de objetos en sentido estricto, pero seguramente ocurre en algún momento entre la creación y la asignación de una variable, incluso sin una asignación explícita (cuando crea un objeto sin asignarlo, la JVM tiene para liberarlo un poco después, ya que no hay más referencias).

En C ++, solo los objetos creados en la pila se liberan automáticamente (cuando se salen del alcance) a menos que use algún mecanismo que maneje esto por usted.

1 : Dependiendo de la implementación de la JVM.


Hay una diferencia de diseño principal entre los constructores en C ++ y Java. Otras diferencias se derivan de esta decisión de diseño.

La principal diferencia es que la JVM primero inicializa todos los miembros a cero, antes de comenzar a ejecutar cualquier constructor. En C ++, la inicialización de miembros es parte del constructor.

El resultado es que durante la ejecución de un constructor de clase base, en C ++, ¡los miembros de la clase derivada aún no se han inicializado! En Java, se han inicializado cero.

De ahí la regla, que se explica en la respuesta de paercebal , de que las llamadas virtuales desde un constructor no pueden descender a una clase derivada. De lo contrario se podría acceder a los miembros sin inicializar.


Suponiendo que c ++ utiliza alloc () cuando se realiza la nueva llamada, entonces eso podría ser lo que están buscando. (No sé C ++, así que aquí puedo estar muy equivocado)

El modelo de memoria de Java asigna una porción de memoria cuando la necesita, y para cada nuevo uso de esta área asignada previamente. Esto significa que un nuevo en java es simplemente establecer un puntero a un segmento de memoria y mover el puntero libre mientras que un nuevo en C ++ (dado que usa malloc en segundo plano) resultará en una llamada al sistema.

Esto hace que los objetos sean más baratos de crear en Java que los lenguajes que utilizan malloc; Al menos cuando no hay inicialización en curso.

En resumen, crear objetos en Java es barato, no te preocupes a menos que crees un montón de ellos.


Yo respondería: C ++ permite crear un objeto en todas partes: en el montón, pila, miembro. Java te obliga a asignar objetos en el montón, siempre .