Está en la página 1de 29

EXAMEN TEST

1- INTRODUCCION A JAVA
Codigo Bytecode – el resultad tras compilar un programa – codigo binario independiente

MVJ – Maquina virtual de Java – el núcleo del sistema de ejecución de Java

Codigo fuente - compilador– bytecode – MVJ(interpreta)- sistema del ordenador

Java es independiente de la plataforma, porque la salida de la compilación de java es


interpretada. Al ser un programa interpretado, aunque sea más lento que uno
compilado(codigo fuente- compilador- codigo binario- SO) es mas portable.

MVJ es un componente clave que permite que los programas escritos en Java se ejecuten
en cualquier dispositivo o sistema operativo que tenga una JVM instalada,
independientemente de las diferencias de hardware y software subyacentes.

Cuando escribes un programa en Java, el código fuente se compila en un formato


intermedio conocido como bytecode. Este bytecode no está destinado a ejecutarse
directamente en el hardware de la máquina, sino que se ejecuta en la JVM. La JVM toma el
bytecode y lo traduce a instrucciones específicas del sistema operativo y del hardware
subyacente en tiempo de ejecución.

Tipos básicos: int(0) float, char (\0) y boolean(false)

Complejos: String (null), array, objetos (null)

En java no hay conversión automática de tipos ni punteros.

En tiempo de compilación hay errores: ejecución, sintácticos, semánticos.

Java es concurrente- permite la realización de múltiples tareas simultáneamente.

Si se necesita usar el codigo nativo los compiladores just- in- time (JIT) traducen el
bytecode.

El sistema de ejecución Java soporta el enlace dinámico entre ficheros de clases locales y
aquéllos que son obtenidos a través de la red en tiempo de ejecución.
La liberación de memoria se ejecuta a través del proceso de recolección de basura
(Garbage Collector). Este proceso de recolección de basura es ejecutado de forma
automática y en segundo plano (background), aunque el programador puede invocarlo
directamente en el código. Este se activa cuando el numero de referencia es 0 en una
variable.

La seguridad en java se basa:

- El lenguaje:
No hay punteros
no pueden ser convertidos libremente de un tipo a otro

No pueden llamarse a métodos sobre clases que no los contemplan.

Los métodos no pueden devolver objetos de un tipo que sea incompatible

- La seguridad en tiempo de compilación:


genera errores para las sentencias que no sigan las reglas de tipos definidas.
Variables no inicializadas, no sean leídas y de que las constantes no sean
modificadas
- En tiempo de ejecución
- Del tiempo de ejecución
- Del cargador de clases
- Verificador bytecode
- Memoria en tiempo de ejecución

2- SINTAXIS
No struct pq no son sino tipos de datos compuestos que se asocian directamente con objetos.

Las clases e interfaces se organizan en ficheros con extensión “.java” que se compilan de forma
separada, formando lo que se denomina unidades de compilación

Programa principal- public static void main(String[] args) { es el primero en ejecutar

public: el método debe ser público ya que debe ser visible en todo el programa y desde el
exterior, para poder ser ejecutado por la MVJ.

static: indica que se aplica a toda la clase y no a objetos o instancias de la misma. Como este
método es el primero que se ejecuta, lo hace antes de que se haya creado ninguna instancia de
ninguna clase, de ahí su naturaleza static.

void: al ser el primer método en ejecutarse no puede devolver ningún valor, ya que no existe
código que pueda recibir ese valor.

args: el parámetro del método es un array de Strings, que se emplea para pasarle a la
aplicación parámetros mediante la línea de comandos
VARIABLES: (no globales)

1- Miembro o atributos:
2- Locales
3- Instancia – de objeto- Nombre_clase variable = new Constructor_clase(...);

// Variable de clase
static int contadorDeObjetos = 0;

// Variables de instancia
private int id;
private String nombre;

// Constructor
public EjemploVariables(String nombre) {
// Variable local
int contadorLocal = 0;

Las variables pueden empezar con una letra, un _ o un $

ARRAY:

String [] titulos = new String[10];

int[] edades = {18, 45, 26, 3, 22};

3- PROGRAMACION ORIENTADA A OBJETOS


CLASES

. La clase define una serie de propiedades comunes a todos los objetos que pertenecen a ella
(atributos) y el conjunto de mensajes y funciones que pueden operar sobre dichos objetos
(métodos)

modificadores_de_clase class Nombre_Clase

modificadores de clase son opcionales:

 abstract: su significado se estudiará en el apartado de Herencia.


 public: las clases así declaradas pueden referenciarse fuera de su paquete (veremos
qué es un paquete en el apartado de Paquetes).
 final: su significado se estudiará en el apartado de Herencia.

ATRIBUTOS

modificadores Nombre_Clase nombre_atributo ;

Fecha fecha_de_compra ;
METODOS

public final void setColor(String color) {

modificadores tipo_resultado nombre_método( tipo1 arg1, ..., tipoN argN) { ... //


implementación del método }

OBJETOS

1- Declarar el objeto: para ello se escribe el nombre de la clase a la que pertenece seguido del
nombre del objeto: INICIALIZAR

Ej: Coche mi_coche;

2- Crear el objeto: mediante una llamada al constructor de la clase a la que pertenece


precedida del operador new. CONSTRUIR

Ej: mi_coche = new Coche( ) ;

NOTA: ambos pasos se pueden realizar en uno solo:

Ej: Coche mi_coche = new Coche( )

Para referenciar a los atributos o métodos de una instancia se utiliza la notación:


nombre_instancia.nombre_atributo
nombre_instancia.nombre_método(parámetro1,...,parámetroN

CONSTRUCTOR

class Cliente {

Cliente ( String nombre) {

this(nombre, Cuenta.obtener_nuevo_numero( ) );

Cliente (String nombre, int num_cuenta) {

nombre_cliente = nombre;

numero_cuenta = num_cuenta;

compras_efectuadas = 1;

Observemos la aparición de la palabra “this”; aunque insistiremos en ella más adelante, por
ahora conviene saber que (entre otras funciones) actúa como sustituto del nombre del
constructor de una clase, y que por tanto la línea

this(nombre, Número_Cuenta.obtener_nuevo_numero( ) );

equivale a

Cliente(nombre, Número_Cuenta.obtener_nuevo_numero( ) )
POR COPIA O REFERENCIA

DESTRUCTOR

En contraposición a los métodos constructores existe un método denominado finalize() que se


ejecuta cuando un objeto es eliminado de la memoria mediante el recolector de basura
(garbage collector). El método no lleva asociada ninguna acción por defecto, por lo que deberá
ser sobreescrito por una clase que requiera un proceso de finalización especial, normalmente
relacionada con la liberación de recursos.

THIS

1. Cuando queramos llamar a un método pasándole como parámetro el objeto actual.

2. Para resolución de variables dentro de un ámbito: si queremos pasar a un método


parámetros con el mismo nombre que alguno de los atributos de la clase, necesitamos
poderlos diferenciar de alguna manera
3. Para invocar – dentro de un constructor – a otro constructor de la clase

this(nombre, Número_Cuenta.obtener_nuevo_numero( ) );

PAQUETES

package nombre_paquete;

Hay que tener en cuenta que si en un mismo fichero fuente se escriben varias clases o
interfaces sólo uno de ellos puede ser declarado como público

Uso de un paquete:

Hay que tener en cuenta que el * sólo importa un paquete, no una jerarquía. Ejemplo: la
sentencia “import java. *; ” no importa todos los paquetes que cuelgan de “java”, como
java.lang, java.awt, etc

MODIFICADORES

DE ACCESO
La manera en que desde fuera de un objeto es posible referenciar a alguno de sus métodos o
atributos está.

1. public: estamos permitiendo que desde cualquier otra clase puedan referenciarlo
directamente.
nombre_instancia.nombre_atributo;
nombre_instancia.nombre_método(parámetros);

2. private: si declaramos un atributo como privado no podremos acceder directamente a


él desde otra clase distinta, sino que tendremos que recurrir a algún método que nos
proporcione el valor. Si el método es privado, desde ninguna otra clase podrá
invocársele. En caso de que no queramos que algún atributo pueda ser visto desde
fuera, lo declararemos como private y no implementaremos métodos ni getter ni setter

3. protected: los atributos o métodos así declarados son accesibles directamente sólo
desde la clase en que se definieron, de las subclases de ésta y las clases que se
encuentran dentro de su mismo paquete. Además, éste es el modificador por defecto,
es decir, el que adquiere un método o atributo cuando no especificamos cuál es su
modificador.

PARA ATRIBUTOS

1. static: un atributo declarado como static se asocia con la clase, de modo que toma un
mismo valor para todos los objetos de dicha clase

inicializador estático (static initializer), que son bloques de código utilizados para dar
valor a las variables estáticas de una clase.
static {
inicialización de variables estáticas;
}

2. final: las variables de este tipo no son en realidad variables, sino constantes, por lo que
deben inicializarse antes de poder ser referenciadas

PARA METODOS

1. static: identifica a un método de clase, es decir, que sólo puede acceder a variables de
clase (atributos static). Estos métodos se pueden ejecutar sin crear una instancia de la
clase. Por tanto, se invocan anteponiendo el nombre de la clase, no el de una instancia
2. final: un método de este tipo no puede ser sobreescrito por las subclases de la clase a
que pertenece. Sólo los métodos static pueden ser final

3. abstract: se verá en el apartado de Herencia.


4. native: identifica a métodos escritos en un lenguaje que no es Java.
5. syncronized: su significado se estudia en el tema de Threads.

MAIN

Debido a que el método main se encuentra dentro de la clase, podría considerarse como un
método más, y desde el mismo realizar llamadas o utilizar los métodos y atributos de ésta. En
el caso de así hacerlo, al compilar el código obtendríamos sendos errores comunicándonos
que, debido a que el método main es static, sólo puede actuar sobre atributos y métodos
también estáticos.

PARAMETROS

No se pasan por referencia pq los objetos sean referencias.

Un método no puede cambiar el valor de sus parámetros.

Si se pueden cambiar si llamas a un metodo


ACCESO PROTEGIDO Y CLONACION

Se modifican los dos objetos

Si se quiere crear un objeto idéntico pero más adelante cambiar- java.lang.Object.clone().

Si son objetos q no son tipo simple clone no sirve y hay q redefinir el método

Para poder clonar un objeto es necesario:

• Que la clase implemente el interfaz Cloneable.

• Ver si la implementación que ofrece Object del método clone se adapta a nuestras
necesidades

HERENCIA

DE IMPLEMENTACION – no hay herencia multiple

el compilador buscará primero en la clase a la que pertenece ese objeto; si no encuentra el


método allí ascenderá un nivel, y así sucesivamente hasta localizarlo.

redefinición de un método, que consiste en permitir que una clase hija reescriba cualquier
método de la clase padre para adaptarlo a sus necesidades. Así, cuando invoquemos a un
método de un objeto el compilador lo buscará en la subclase a la que pertenezca y, si lo
encuentra en ella, lo ejecuta como allí se indique sin importar cómo lo ejecute ninguna de las
clases de nivel superior

no es conveniente que existan en él jerarquías de herencia de muchos niveles (más de cuatro)

la herencia de implementación se realiza incluyendo la palabra clave extends al final de la


declaración de la clase hija.

a todas las clases heredan por defecto de una superclase denominada Object (paquete
java.lang)

no podemos utilizar una variable perteneciente a una superclase en el lugar de otra


perteneciente a la subclase. Pero si una de la subclase en una de la superclase

hijo en padre- SI

padre en hijo- NO
eje: : todo mamífero es un animal, pero no todo animal es un mamífero.

LA PALABRA SUPER

para referenciar a la clase padre, ya sea a sus atributos o a sus métodos

super.atributo;

super.método(parámetros)

teniendo en cuenta que los demás constructores deberán invocar al que llama a super a través
de this para que al final se consiga dar valor a los atributos heredados

CLASES FINALES Y METODOS FINALES


Análogamente, si queremos evitar que una clase hija pueda redefinir un método
implementado por la clase padre tenemos que añadir el modificador final en la declaración del
método. Por defecto, todos los métodos de una clase final son finales.

DE INTERFAZ

a existen dos mecanismos para llevar a cabo este tipo de herencia: las clases y métodos
abstractos y los interfaces.

CLASES Y METODOS ABSTRACTOS

Un método abstracto es un método que no se implementa en la clase que lo declara, obligando


a que sean las clases hijas quienes lo hagan.

se mantiene la restricción de que la clase hija sólo puede tener una clase padre.

No se pueden crear instancias de las clases abstractas directamente con el operador new, dado
que su implementación no está completamente definida
INTERFACES – si hay herecia multiple (Así por ejemplo, que una persona sea informático no le
impide ser jugador de baloncesto.)

No tiene atributos (sólo permite constantes) y que contiene en su interior declaraciones de


métodos sin implementar ninguno de ellos.

el interfaz define un comportamiento, indica qué funciones deben desempeñar las clases que
pretendan heredar de él sin entrar en detalles de implementación, pues será cada clase
particular quien decida cómo quiere hacer las cosas.

los métodos carecen de cuerpo

.Una clase que hereda de un interfaz lo hace de manera similar a como si heredara
implementación de una clase, pero sustituyendo la palabra reservada extends por la palabra
reservada implements. Cuando hereda de varios interfaces a la vez, los nombres de dichos
interfaces se separan por “,”.
Para heredar si es interfaz interfaz se usa extends igual que clase clase.

¿HERENCIA DE IMPLEMENTACION O INTERFAZ?

 Los interfaces favorecen la reusabilidad


 Los interfaces son muy robustos frente a cambios: si se desea cambiar algún detalle
sobre cómo un objeto hace las cosas, no será necesario recorrer toda la jerarquía para
buscar en qué punto se encuentra esa funcionalidad y cómo la desempeña una clase
padre, ni preocuparse de cómo afecta el cambio a otros objetos hermanos.

Ejemplo: tenemos una clase Empleado que implementa el método subir_sueldo, y que tiene
dos clases hijas que son Directivo y Programador. Si decidimos que a los directivos les subimos
el sueldo según un criterio diferente al del resto de empleados, tendremos que mirar en la
clase padre para ver cómo implementa el método y reescribirlo para la clase Directivo,
teniendo mucho cuidado con las llamadas a super. Si lo hubiésemos implementado mediante
un interfaz, cada tipo de empleado tendría un mecanismo para subirse el sueldo y podríamos
cambiar el modo en que se realiza esta operación para los directivos sin preocuparnos de nada
más.

 Los interfaces permiten que un objeto presente varios comportamientos de manera


simultánea, mientras que las herencias de implementación sólo pueden estar referidas
a una clase padre
 cuando se usan interfaces la llamada a los métodos durante la ejecución se realiza a
través de una búsqueda dinámica,
CASTING

Consiste en convertir una variable de un tipo origen en otro tipo destino

sólo puede realizarse entre tipos básicos

(Tipo_destino) variable

sólo es posible realizarlo de la clase hija a la clase padre

conviene asegurarse de que el objeto a convertir es del tipo adecuado mediante la palabra

reservada instanceof
POLIMORFISMO

es un concepto que permite que un método tenga múltiples implementaciones que se


seleccionan en virtud del número y tipo de los parámetros que recibe el método (signatura del
método), lo cual se conoce como sobrecarga del método

La sobreescritura de métodos es una forma de polimorfismo

Errores de ejecución (Exception) dinámicos – se para el


programa
1- ClassCastException)
convertir un objeto a un tipo incompatible, puede generar errores en tiempo de ejecución

DownCasting- no puedes hacer un casting de un hijo para q sea un padre pq no cabe.

Hijo= (clase Hijo)

2- NullPointerException
El error que estás viendo es una excepción de Java conocida como NullPointerException, que se
produce cuando intentas acceder a un método o propiedad de un objeto que es nulo (es decir,
no se ha inicializado).

Errores de Ejecución:

1. NullPointerException (Excepción de Puntero Nulo): Ocurre cuando intentas acceder a


un método o propiedad en un objeto que es null.

2. ArrayIndexOutOfBoundsException (Excepción de Índice Fuera de Rango): Ocurre


cuando intentas acceder a un índice que está fuera del rango válido de un arreglo.

3. ArithmeticException (Excepción Aritmética): Ocurre cuando se realiza una operación


aritmética inválida, como la división por cero.

4. ClassCastException (Excepción de Conversión de Clase): Ocurre cuando intentas


realizar un casting (conversión de tipos) entre clases que no están relacionadas.

5. FileNotFoundException (Excepción de Archivo No Encontrado): Ocurre cuando intentas


abrir un archivo que no existe.

6. IOException (Excepción de Entrada/Salida): Ocurre en situaciones relacionadas con


operaciones de entrada/salida, como problemas al leer o escribir archivos.

7. InterruptedException (Excepción de Interrupción de Hilo): Ocurre cuando se trabaja


con hilos y se produce un problema relacionado con la ejecución concurrente.

Errores de compilación- escrito mal


Errores de Compilación (Errores Sintácticos): (los de los laterares, no deja no probar bien)

1. Error de sintaxis: Ocurre cuando el código no cumple con las reglas de sintaxis de Java.
Esto puede incluir olvidar un punto y coma, un paréntesis sin cerrar, una llave sin
cerrar, entre otros.

2. Uso de variables no declaradas: Si intentas usar una variable que no ha sido declarada,
obtendrás un error de compilación. Por ejemplo, si escribes x = 10; sin declarar x,
obtendrás un error.

3. Incompatibilidad de tipos: Si intentas asignar un valor de un tipo incompatible a una


variable (por ejemplo, asignar un String a una variable int), obtendrás un error de
compilación.

4. Uso de métodos o propiedades inexistentes: Si intentas llamar a un método o acceder


a una propiedad que no existe en la clase o el objeto, obtendrás un error de
compilación.

dynamic binding
La dynamic binding se refiere al proceso en el que el método específico que se va a llamar en
tiempo de ejecución se determina en función del tipo real del objeto en lugar del tipo
declarado de la variable.
En tu código, estás iterando a través de un arreglo de puntos y realizando una operación de
impresión. La parte relevante para el dynamic binding se encuentra en la línea donde se llama
a los métodos getX() y getY() en los objetos puntos[i]. El dynamic binding asegura que se llame
al método apropiado en función del tipo real del objeto en puntos[i].

Si puntos[i] es un objeto de tipo Punto, entonces se llama al método getX() y getY() de la clase
Punto. Sin embargo, si puntos[i] es un objeto de tipo Punto3D, entonces se llama al método
getX() y getY() de la clase Punto3D, que puede tener una implementación diferente.

El uso de instanceof en el código verifica si puntos[i] es una instancia de la clase Punto3D. Si es


así, se realiza un casting a Punto3D para poder acceder al método getZ(), que es específico de
la clase Punto3D.

Lo que sucede es lo siguiente:

1. Se verifica si puntos[i] es una instancia de la clase Punto3D usando el operador


instanceof. Si es verdadero, significa que puntos[i] es un objeto de tipo Punto3D.
2. Luego, realizas un casting (Punto3D) para convertir puntos[i] de tipo Punto a Punto3D.
Esto se hace porque el compilador solo conoce el tipo declarado de puntos[i], que es
Punto, pero sabes que en este punto es realmente un Punto3D (ya que pasó la
verificación del instanceof).

3. Después de realizar el casting, la referencia m ahora se trata como un objeto de tipo


Punto3D, y puedes acceder a los métodos específicos de Punto3D, como getZ(). En
este caso, m.getZ() llama al método getZ() de la clase Punto3D.

En resumen, el dynamic binding garantiza que se llamen a los métodos adecuados en tiempo
de ejecución según el tipo real de los objetos en el arreglo puntos, lo que permite un
comportamiento polimórfico en tu código.

Casting
La conversión automática de tipos sólo se produce cuando el compilador determina
que la variable destino es lo suficientemente grande como para contener a la variable
origen. Si no es así, se necesita conversión explícita (casting).

1- Verificación de tipos: Debes verificar el tipo de objeto antes de realizar un casting


utilizando el operador instanceof. Esto te permite asegurarte de que el objeto es
compatible antes de intentar la conversión.

2- Herencia de interfaces: Puedes realizar castings entre tipos que implementen una
misma interfaz. Por ejemplo, si tienes una interfaz MiInterfaz, puedes hacer castings
entre objetos que implementen esta interfaz.

3- Casting entre tipos numéricos: Puedes realizar castings entre tipos numéricos
compatibles, como de int a double, o de double a int. Sin embargo, ten en cuenta que
la pérdida de información puede ocurrir si estás reduciendo la precisión, como de
double a int.

int tipoNuevo = (int) miDouble;

4- Casting entre tipos relacionados: En algunos casos, puedes realizar castings entre tipos
que tengan una relación de herencia o una relación compatible, como entre tipos
primitivos y sus envoltorios (por ejemplo, de int a Integer, o viceversa).

Preguntas https://www.daypo.com/herencia-polimorfismo.html#test

https://www.digitallearning.es/tests/java-poo.html

También podría gustarte