Prediga la salida de los siguientes programas Java.
Pregunta 1:
Java
package main; class Base { public void Print() { System.out.println("Base"); } } class Derived extends Base { public void Print() { System.out.println("Derived"); } } class Main { public static void DoPrint(Base o) { o.Print(); } public static void main(String[] args) { Base x = new Base(); Base y = new Derived(); Derived z = new Derived(); DoPrint(x); DoPrint(y); DoPrint(z); } }
Producción:
Base Derived Derived
Predecir la primera línea de salida es fácil. Creamos un objeto de tipo Base y llamamos a DoPrint(). DoPrint llama a la función de impresión y obtenemos la primera línea.
DoPrint(y) genera la segunda línea de salida. Al igual que C++, Java permite asignar una referencia de clase derivada a una referencia de clase base. Por lo tanto, la expresión Base y = new Derived() es una declaración válida en Java. En DoPrint(), o comienza a referirse al mismo objeto al que hace referencia y. Además, a diferencia de C++, las funciones son virtuales por defecto en Java. Entonces, cuando llamamos a o.print(), se llama al método print() de la clase Derivada debido al polimorfismo de tiempo de ejecución presente de forma predeterminada en Java.
DoPrint(z) genera la tercera línea de salida, pasamos una referencia de tipo Derivado y se vuelve a llamar al método print() de la clase Derivado. El punto a tener en cuenta aquí es: a diferencia de C++, el corte de objetos no ocurre en Java. Porque los tipos no primitivos siempre se asignan por referencia.
Pregunta 2:
Java
package main; // filename Main.java class Point { protected int x, y; public Point(int _x, int _y) { x = _x; y = _y; } } public class Main { public static void main(String args[]) { Point p = new Point(); System.out.println("x = " + p.x + ", y = " + p.y); } }
Producción:
Compiler Error
En el programa anterior, no hay problemas de permisos de acceso porque Point y Main están en el mismo paquete y se puede acceder a los miembros protegidos de una clase en otras clases del mismo paquete. El problema con el código es que no hay un constructor predeterminado en Point.
Al igual que C++ , si escribimos nuestro propio constructor parametrizado, el compilador de Java no crea el constructor predeterminado. Entonces, hay dos cambios siguientes en la clase Point que pueden arreglar el programa anterior.
- Elimina el constructor parametrizado.
- Agregue un constructor sin ningún parámetro.
Java no admite argumentos predeterminados, por lo que no es una opción.
Escriba comentarios si encuentra que alguna de las respuestas/explicaciones es incorrecta, o si desea compartir más información sobre los temas discutidos 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