B3-T6_JAVA Flashcards
En Java8, ¿cómo se define un INTERFACE?
Es una colección de MÉTODOS (con o sin implementación, pues, a partir de Java8, se pueden implementar con “Default”) y una serie de CONSTANTES (Ej: Static Final).
Una interface no tiene sentido que tenga “atributos”.
“Las interfaces pueden ser implementadas por otras clases para usar sus métodos o funciones”.
IMPORTANTE: las INTERFACES se declaran con la palabra clave implements. En cambio, las HERENCIAS se declaran con extends.
NOTA: Una CONSTANTE se diferencia de un ATRIBUTO, en que su valor NO varia.
¿En qué se diferencian IDE (Entorno de Desarrollo Integrado) y GUI (Interfaz de Usuario Gráfica) y pon ejemplos?
Un IDE es un entorno que sirve para desarrollar programas o software. Generalmente un IDE tiene un editor de código, un compilador o intérprete, y un depurador de código del programa en desarrollo.
En tanto un GUI es una interfaz gráfica de usuario, que proporciona un entorno visual gráfico que permite que un humano utilice un sistema operativo o un software.
En resumen, un entorno de desarrollo integrado (IDE) es un sistema de software para el diseño de aplicaciones que combina herramientas del desarrollador comunes en una sola interfaz gráfica de usuario (GUI).
NOTA: un depurador de código realiza el proceso de encontrar y solucionar errores en el código fuente de cualquier software
IDE: BlueJ, Eclipse, JDK (Oracle), JBuilder, JCreator, JDeveloper, IntelliJ IDEA, …
GUI:
1. Los entornos de escritorio Windows o concretamente la interfaz Aero (que puede deshabilitarse), introducida en Windows Vista
2. En GNU/Linux: X Windows, Open Look, GNOME o KDE.
3. O el de Mac OS X: Aqua
IMPORTANTE: la JRE esta incluida en la JDK. Algunas JDKs:
*OpenJDK
*Amazon Correto
*IBM JDK
¿Qué es JRE (Java Runtime Environment) en Java?
Entorno de ejecución de Java o máquina virtual de Java (JVM) + las bibliotecas de clases y otros componentes para que una aplicación escrita en lenguaje Java pueda ser ejecutada en MÚLTIPLES PLATAFORMAS.
El JRE interactúa con el Java Development Kit (JDK) para ejecutar archivos de programas de Java en cualquier máquina.
Al ser Java multi-plataformas (principal característica de Java) implica que el programa primero hay que compilarlo (JDK) y luego interpretarlo (JRE):
- COMPILARLO: pasar el código fuente de nuestro programa (programa.java) a código máquina (bytecode.class), que es el que será interpretado en cualquier plataforma:
programa.java -(Eclipse)-> bytecodes.class (este es interpretado en las JREs)
NOTA: el compilador de java se llama JavaC.
- INTERPRETAR: proceso que realiza la JRE de cualquier plataforma para “entender” el bytecodes.class. Es decir, el fichero.class es el bytecode.
NOTA: página de descarga de la JRE => java.com
Resume la historia de Java:
1991: Creado por James Gosling y Patric Naughton, en la empresa Sun Microsystem (ya NO existe, fue absorbida por Oracle).
NOMBRES: OAK (roble) x Gosling -> JAVA (tomar café).
1995: con la llegada de internet es cuando tuvo éxito, ya que funciona en cualquier plataforma. Crearon el navegador “Hot Java”.
¿Cuáles son las características de Java?
SENCILLO: ocupa poco.
ORIENTADO A OBJETOS.
DISTRIBUIDO: buen trato en red.
SEGURO: como se hizo para programar en red, se hizo seguro.
NEUTRO: multiplataformas.
ADAPTABLE: mismos tipos de datos primitivos en todas las plataformas.
INTERPRETADO: se compila y luego se interpreta.
MULTI HILO: varios procesos en paralelo.
CASE SENSITIVE.
¿Cuál es el modificador de acceso del siguiente método de Java y explicalos todos?
*public static void main (String args []) {
…
}
El modificador de acceso es public e indica que el método es accesible desde cualquier lugar del código.
En la foto vemos los otros 3 Modificadores de Acceso y sus alcances.
*“void” indica que el método main no retorna ningún valor, es decir, el método finalizará en ese punto sin ejecutar ninguna linea más.
*(String args []) => es la definición de los argumentos que recibe el método main. [] -> indica que el argumento es un arreglo o matriz. String -> tipo de elemento del arreglo.
NOTA: En Java, los arreglos (matrices o arrays) son objetos. Todos los métodos se pueden ser invocados en un arreglo (objeto).
Y un arreglo u objeto es una estructura de datos utilizada para almacenar datos del mismo tipo.
En Java TODA aplicación empieza a ejecutarse desde un método MAIN
Sabemos que al ser Java un lenguaje ADAPTABLE sus Tipos Primitivos son iguales en todas las plataformas (multiplataforma o neutro), pero ¿cuáles son?
- ENTEROS: números enteros (7, 2500, …).
1.1. LONG: (8 bytes). Números muy grandes y usan el sufijo “L”.
Ej: 5.000.000.000L
1.2. INT: (4 bytes)
del -2.147.483.648 al 2.147.483.648
1.3. SHORT: (2 bytes)
del -32.768 al 32.768
1.4. BYTE: (1 byte)
del -128 al 127
- DECIMALES:
2.1. DOUBLE: (8 bytes) Aproximadamente 15 cifras significativas.
Ej: 4,31122639824
2.2. FLOAT: (4 bytes) Aproximadamente 6 a 7 cifras significativas. Sufijo “F”.
Ej: 3.25F
- CHAR: para representar caracteres. Van entre comillas SIMPLES.
Ej: la letra a -> ‘a’ => caracter unicode. - BOOLEAN: True / False
COMODINES: para almacenar variables se suelen usar:
ENTEROS -> int
DECIMALES -> double
¿Qué es una variable en Java y cómo se crea (declaración+iniciación)?
Espacio en la memoria RAM del ordenador donde se almacena un valor que podrá cambiar durante la ejecución de un programa => VARIABLE (siempre se ejecutará la última variable => siempre se ejecutan las instrucciones por orden).
Para DECLARARLAS, hay que especificar el tipo de dato que almacenará en su interior + el nombre de la variable:
int salario;
Para INICIARLA, hay que darle un valor: (en Java, al contrario que otros lenguajes, no permite usar variables que no se hayan iniciado o dado cierto valor)
salario = 1800;
*Aunque se pueden hacer las 2 cosas a la vez:
int salario = 1800; => reserva y almacena a al vez el espacio en la RAM
COMODINES: para almacenar variables se suelen usar:
ENTEROS -> int
DECIMALES -> double
¿Cuáles son las 2 maneras de añadir comentarios en Java?
// comentarios en 1 linea
/* comentarios
en varias
lineas */
¿Cómo se guarda una clase en Java?
Ctrl+S (Save) => lo guarda en la carpeta “bin” con extensión .class (bytecode) y en la carpeta “src” se guarda el archivo compilado (.java).
NOTA: *PROGRAMA.JAVA => el * indica que aún NO se han guardado los cambios.
Sabemos que Java es POO y que todo es considerado un objeto, incluso la consola, pero ¿qué es un objeto?
Es una entidad que representa información sobre una cosa dentro de la CLASE.
Tienen PROPIEDADES (ancho, alto, color, …) y MÉTODOS (lo que puede hacer el objeto: frenar, acelerar, …)
EJEMPLO: System.out.println (edad);
/le estamos pidiendo que el objeto “out” (consola) del SISTEMA imprima (println) la variable “edad”/
System => sistema
println => método
out => OBJETO
¿Qué es una CONSTANTE de Java?
Es un espacio en la memoria RAM que, a diferencia de la VARIABLE, no podrá cambiar durante la ejecución del programa. De hecho, se declara igual que la VARIABLE, pero se añade al principio final.
Es necesario para guardar datos que necesitaremos en un futuro y/o constantemente. Por ejemplo, para hacer un programa que pase de cm a metros => en el que almacenaríamos las unidades como CONSTANTES.
EJEMPLO:
final double pulgadas = 2,54;
final byte edad = 42;
¿Cuáles son los operadores de Java?
- ARITMÉTICOS: +, -, * y /.
- INCREMENTO y DECREMENTO:
++ => INCREMENTO: incrementa en “1” el valor al que lo estés aplicando.
– => DECREMENTO: lo contrario al anterior.
+= n => incrementa o suma “n” al valor al que lo apliques.
-= n => lo contrario al anterior. - CONCATENACIÓN: unen valores (conjuntos de caracteres con números o variables).
+ => une o concatena.
NOTA: hay otros 2 tipos de operadores:
3. Lógicos, Relacionales y Booleanos.
4. Binarios
¿Cuáles son los operadores de Java: Lógicos, Relacionales y Booleanos?
- Lógicos, Relacionales y Booleanos:
> mayor que
< menor que
<> mayor o menor que
== igual que
!= distinto que
&& (“y” lógico) cuando comparamos varias condiciones y dará TRUE si se cumplen todas:
EJ: condicion1&&condicon2&&condicon3 => si se cumplen todas dará TRUE.
||(“o” lógico) cuando comparamos varias condiciones y dará TRUE con que se cumpla 1:
EJ: condicion1||condicon2||condicon3 => con que se cumpla 1 dará TRUE.
! (NOT) devuelve el valor contrario a TRUE.
? (“if” en linea)
NOTA: hay otros 3 tipos de operadores:
1. ARITMÉTICOS.
2. INCREMENTO y DECREMENTO.
4. Binarios
¿Cuáles son los operadores de Java: BINARIOS?
Los operadores BINARIOS cambian “0s” y “1s” y viceversa.
a) | (OR binario) OR INCLUSIVO => siempre que haya un 1 en cualquier lado del par, el resultado será 1.
0101 (decimal 5) |
0011 (decimal 3)
0111 (decimal 7) => RESULTADO
b) ^ (XOR lógico) OR EXCLUSIVO => El resultado será 1 si el par de bits son diferentes y cero son iguales.
0101 (decimal 5) ^
0011 (decimal 3)
0110 (6) => RESULTADO
c) ~ (complemento) operador negación (NOT). Lo contrario.
~ (0111) => 1000 (8 decimal)
d) & operador bits AND: sólo iguales.
0101 AND
0011
0001 (1) => RESULTADO
NOTA: hay otros 3 tipos de operadores:
1. ARITMÉTICOS.
2. INCREMENTO y DECREMENTO.
3. Lógicos, Relacionales y Booleanos.
Explica el funcionamiento de los operadores de Java de DESPLAZAMIENTO?
A < < B : Desplazamiento de A a la izquierda en B posiciones:
Ej: (0011) < < (0001) // Desplaza 0011 una vez dando 110
(0011) < < (0011) // Desplaza 0011 tres veces dando 11000 (son 3 veces porque 0011=3)
A > > B : Desplazamiento de A a la derecha en B posiciones, tiene en cuenta el signo:
(1100) > > (0001) // Desplaza 1100 una vez dando 0110
(1000) > > (0011) // Desplaza 1100 tres veces dando 0001
*Si manipulamos decimales lo que hacemos es dividir el número por 2 tantas veces como indique su desplazamiento:
12 > > 1 // Sería 12 / 2 = 6
12 > > 2 // Sería 12 / 2 = 6; 6/2 = 3
A > > > B : Desplazamiento de A a la derecha en B posiciones, NO tiene en cuenta el signo:
1110 0011 > > > 0011 // Desplaza tres a la izquierda dejando 0001 1100
Sabemos que tanto las clases propias (las que hacemos nosotros), como las predefinidas (descargadas de API Java) están organizadas en paquetes y contienen diversos métodos, ¿qué métodos conoces de la clase MATH?
Esta clase contiene un muestrario de métodos que nos permiten realizar operaciones matemáticas:
Math.sqrt (n) => raiz cuadrada del número “n” (se declara con double).
Math.pow (base, exponente) => potencia de un número (base y exponente son double)
double numero = 2;
double elevado = Math.pow(numero, 10);
System.out.println (“El numero 2 elevado a 10 es “+ elevado);
//El numero 2 elevado a 10 es 1024.0
Math.round (decimal) => redondeo de un número.
double numero = 5.87;
double resultado = Math.round(numero);
System.out.println (resultado);
//6
Math.PI => CONSTANTE de clase con el número PI
Math.random (); => genera por consola números aleatorios entre 0 y 1 (sólo con double)
IMPORTANTE: java.lang.Object => es la SUPERCLASE de Java de la que heredan todas por defecto.
Sabemos que STRING no es un tipo primitivo (int, double, long, …), sino una clase predefinida a descargar de la API Java, pero ¿conoces algunos de sus métodos más utilizados?
La clase STRING se usa para la manipulación de cadenas de caracteres.
String mi_nombre=(Manuel);
length() => devuelve la longitud de una cadena de caracteres:
mi_nombre.length()=6 => porque Manuel tiene 6 caracteres.
charAt(n) => devuelve la posición de un carácter dentro de una cadena (las posiciones empiezan a contar desde “0”):
mi_nombre.charAt(2)=n => porque esta en la 3ª posición de Manuel.
substring(x,y) => devuelve una subcadena dentro de una cadena, siendo”x” el carácter a partir del cual se extrae e “y” el nº de carcateres a extraer.
mi_nombre.substring(0,3)= Man =>los 3 primeros caracteres.
equals(cadena) => devuelve TRUE si 2 cadenas que se comparan son iguales y FALSE si no lo fueran (distingue mayus y minus)
equalsIgnoreCase(cadena) => igual que el anterior pero NO tiene en cuenta las mayúsculas.
IMPORTANTE: java.lang.Object => es la SUPERCLASE de Java de la que heredan todas por defecto.
java.lang: es el paquete.
Object: es la clase.
Sabemos que las clases predefinidas de Java están en la API Java (online) divididas en paquetes, pero ¿en qué 2 partes se dividen dichos paquetes y por qué son necesarios los paquetes?
1.JAVA (java.awt, java.io, java.util, …)
2.JAVAX (javax.activity, javax.annotation, javax.swing, …)
============
a) Para organizar las clases.
b) Para evitar conflictos de nombres: NO puede haber 2 clases java con el mismo nombre y en el mismo paquete (carpeta), aunque si se puede en distintos paquetes.
c) Para controlar la visibilidad (pública, privada o protegida) de las clases / ENCAPSULAMIENTO (modifica la visibilidad ocultando atributos de un objeto).
IMPORTANTE: java.lang.Object => es el PAQUETE o SUPERCLASE de Java de la que heredan todas por defecto.
La VISIBILIDAD y ENCAPSULAMIENTO son conceptos diferentes, entonces ¿por qué se relacionan en Java?
Para definir la “Visibilidad” en Java, se dispone de palabras reservadas:
public: nos indica que es accesible desde cualquier clase [interface]. private: solo es accesible desde a clase actual. protected: accesible desde la clase actual, sus descendientes o el paquete del que forma parte. default: accesible desde cualquier clase del paquete.
El ENCAPSULAMIENTO permite cambiar dicha visibilidad de atributos y métodos, ocultando dichos métodos y atributos de una clase declarándolos PRIVATE, para su exclusivo uso interno.
*No obstante, se puede acceder a dichos elementos ENCAPSULADOS con los métodos: Getters y Setters.
EJEMPLO:
class Punto {
private double puntox, puntoy;
public double getPuntox() {
return puntox;
}
public void setPuntox (double puntox) {
this.puntox = puntox;
}
MNEMOTECNIA: Una lavadora implementa la encapsulación, porque pone a disposición del usuario sólo los botones necesarios para su uso (encender, subir potencia, abrir compuerta, etc), mientras que otras funcionalidades.
Menciona 2 bibliotecas (paquetes) para la creación de interfaces gráficas de usuario:
AWT: (Abstract Window Toolkit) es la parte de Java para construir interfaces gráficas de usuario.
import java.awt.*; => importa todas las clases del paquete.
SWING: abstrae el SO y proporciona su propia colección de gráficos.
import javax.swing *; => trae todos las clases.
import javax.swing.JOptionPane; => sólo trae la clase JOptionPane.
IMPORTANTE: son los 2 paquetes que forman la JFC (Java foundation Classes), que son la parte de la API de Java compuesta por las clases para crear interfaces gráficas.
Comenta 2 clases Java para introducir información dentro de nuestro programa y algunos de sus métodos:
- SACNNER (es una clase reciente, pues apareció en Java 5.0). Métodos:
nextLine() => introduce texto (string).
nextInt() => introduce números enteros.
int edad= entrada.nextInt();
nextDouble() => introduce decimales.
import java.util.Scanner;
*Son métodos NO estáticos.
- JOptionPane (mas antigua) Construye una ventana sencilla. Métodos:
showInputDialog () => con este método se construye dicha ventana.
import javax.swing.JOptionPane;
*Método estático.
NOTA: en método NO estáticos hay que crear un objeto perteneciente a la clase para utilizarlos.
Cuando el método es estático hay que usar la clase delante (ej: Math.sqrt(9)).
Sabemos que el flujo de ejecución de un programa en Java recorre linea a linea (empezando por la 1ª) todo el código, pero ¿qué 2 maneras existen de modificarlo?
- CONDICIONALES: (a saltos)
1.1 if -> else => puede ir el “if” sólo.
1.2. SWITCH (opción a evaluar){=> case1 -> break; -> case1 -> break; => default;}
- BUCLES: (repeticiones)
2.1. BUCLES INDETERMINADOS: no se sabe las veces que se repetirán.
a) WHILE
b) DO WHILE: evalúa la condición después de ejecutar el código de su interior, es decir, este bucle va a ejecutar el código mínimo una vez
2.2. BUCLES DETERMINADOS: se sabe cuantas veces se repite antes de ejecutar.
a) FOR (inicio del bucle; condición; contador del bucle)
for (int i=0; i<10; i++){
System.out.println (“Manuel”);} => imprime 10 veces el nombre Manuel.
b) FOR EACH
Sabemos que [arreglo, matriz o array] es lo mismo, pero ¿qué utilidad tiene?
Estructura de datos para almacenar valores del mismo tipo o relacionados. A diferencia de las variable, pues estas almacenan un sólo valor => una matriz es una agrupación de variables y se pueden recorrer con bucles.
int [ ] mi_matriz = new int [3];
/*int => tipo de variable.
[] => especificamos que se trata de una matriz.
new => operador
int => tipo de dato a almacenar.
[10] => nº de valores a almacenar */
mi_matriz [0]= 35;
mi_matriz [1]= 10;
mi_matriz [2]= 42;
/*nombre_matriz [posición] = valor a almacenar; */
NOTA: también se puede declarar e iniciar a la vez, como las variables:
int [] mi_matriz = [35, 10, 42];
*Las matrices, al igual que las variables, NO pueden tener caracteres extraños ni espacios en sus nombres.
NOTA: hay matrices bidimensionales y multimensionales: int [ ] [ ] bloque = new int [4][5]
Sabemos que una clase abstracta no se puede implementar (no puedes crear objetos: new…), sólo heredar de ella, pues funciona como una superclase, pero, en caso de heredar de ella, ¿cómo podemos asegurar que la implementamos esta correcta?
@override
Es opcional, pues con esta anotación simplemente le indicamos al compilador que compruebe si hemos cometido error alguno al sobreescribir el método de la clase abastracta o padre (ejemplo: error con el nombre del método).
public abstract class Persona{ => Persona es una clase abstracta.
Persona p1=new Persona (); => daría ERROR, porque no se pueden crear objetos (instanciarla).
public abstract class Persona extends Empleado=> Empleado hereda de Persona (clase abstracta), con la finalidad de usar sus métodos.
NOTA: si Persona también fuese una clase abstracta no cabria la posibilidad error, es decir, no habría que usar la anotación @override, porque en las clases abstractas NO se crean objetos (no se instancian), por lo cual no habría que implementar los métodos de la clase padre
¿Se puede heredar un método ESTÁTICO de una interface en Java?
No.
Los métodos estáticos de las interfaces NO se heredan.
Esto es muy importante, ya que los métodos estáticos de las clases sí se heredan, y puede llevar a error. Solo se puede acceder a un método estático de una interfaz mediante una referencia de dicha interfaz.
Lo estático pertenece SÓLO a su clase, no puedo usar métodos estáticos de otras clases aunque sean heredados, es decir, la HERENCIA es para métodos normales, NO estáticos.
public static void ajustarIRPFempleados ()
Una clase abstracta no puede ser instanciada, solo heredada. Cómo Java no permite la herencia múltiple (una clase NO puede heredar de más de una clase padre) habrá ocasiones en las cuales debamos utilizar interfaces.
NOTA: La interface se crea en Java en un paquete a parte del de las clases y así no se mezclen.
NOTA2: los métodos en Java NO se pueden borrar.
Sabemos que en Java no hay HERENCIA múltiple (heredar de varias clases padres), sino la herencia simple, pero SI puede implementar varios interfaces, ¿cuál es la palabra clave para ello?
IMPLEMENTS
public abstract class Persona extends Entidad implements Guardable, Clonable { => la clase Persona hereda de la clase Entidad (padre), de la que implementa 2 interfaces (Guardable y Clonable)
*Al ser clase abstracta hay que codificar (instanciar) las interfaces (Guardable y Clonable) que implementamos, pues en una clase abstracta no se instancian.
NOTA: Una clase abstracta (al tener todos sus métodos abstractos o sin instanciar) es parecido a un interface, con la diferencia de que el *interface NO puede tener atributos y la clase abstracta SI.
¿Qué tiene que ver la palabra clave Enum con una variable?
Enum o Tipos Enumerados => cuando surge la necesidad de almacenar en una variable una serie de valores del mismo tipo y no queremos que se modifiquen ni se incluyan valores de otro tipo en dicha variable.
Por ejemplo, si creamos la variable “talla”, la limitaríamos a que los únicos valores aceptados sean del tipo talla (pequeña, mediana, grande o extragrande) y no permitir introducir en dicha variable un valor del tipo color (azul, rojo, …), x ejemplo.
*Se declara fuera del “main”.
enum talla {(pequeña, mediana, grande, extragrande}
*Se usarían en otra clase.
¿Qué es un CONSTRUCTOR en la programación orientada a objetos (y en Java)?
Su nombre es bastante descriptivo, constructor, que construye, se encarga de construir algo en este caso se encarga de inicializar un objeto, es decir, es un método especial que se utiliza para inicializar un objeto recién creado y asignarle valores iniciales a sus variables de instancia.
Se declara con new y su contrario (destructor) usa la palabra finally y se encarga de enviar el objeto en desuso al GC.
Sabemos que TODA clase de Java (las nuestras y predefinidas) heredan de OBJECT, que se encuentra en el paquete x defecto java.lang (java.lang.object), pero ¿conoces algunos de los métodos que aporta?
La clase Object es conocida como la clase CÓSMICA, pues todos heredan de ella, a no ser que creemos una herencia manualmente:
public class Persona extends Entidad{ => Persona hereda de Entidad y Entidad hereda de Object (ya que no tiene herencia manual):
public class Entidad{
MÉTODOS de la Clase Object:
CLONE: clona objetos, es decir, lo aplicas sobre algo y te crea una copia.
EQUALS: compara si 2 objetos son iguales (boolean).
FINALIZE: es el método al que llama el “Garbage Collector”, aunque tú lo puedes codificar. El GC lo llama cuando determina que no hay más referencias al objeto.
HASHCODE: una función que devuelve de cada objeto un código hash (como un identificador de cada objeto).
Notify, NotifyAll y wait: métodos para manejar / sincronizar hilos.
Simplifica la creación de CLASES y OBJETOS en Java:
public class Coche{ => creación de la clase “Coche” (publica).
Coche SeatLeon = new Coche (); =>creamos el objeto “SeatLeon”, haciendo referencia a la clase (Coche) y con el constructor (new Coche).
/*Ahora crearemos los atributos (propiedades) de la clase */
String color;
String marca;
int km;
/*ahora creamos el método main */
public static void main (String [] args) {
/*y referenciamos los atributos con los objetos */
SeatlLeon.color= “Negro”;
SeatlLeon.marca= “Seat”;
SeatlLeon.km= 0;
/*para sacarlo por consola */
System.out.println (“El color del SeatLeon es: “ + SeatLeon.color);
NOTA: contructor es un elemento de la clase cuyo nombre coincide con la misma, para inicializar objetos (instancia).
¿En qué se diferencian las siguientes sintaxis:
public void método ()
y
public int método ()?
En que public void método () NO retorna nada.
En cambio, public int método () retorna un entero.
*Entre paréntesis irían los argumentos del método.
*Para poder usar un método hay que crear un objeto, pues un método es una acción o comportamiento de los objetos.
EJEMPLO: creamos un método para sumar 2 números:
public void suma{
suma = num1 + num2
}
NOTA: si creásemos el objeto (cuenta) de la clase Operaciones (Operaciones cuenta= new Operaciones), lo podríamos relacionar con el método anterior de la siguiente manera:
cuenta.suma ();
Sabemos que JavaC es el compilador principal de Java que transforma nuestro código (.java) a código máquina o bytecode (.class), pero ¿conoces otros compiladores en Java?
xjc: este compilador genera clases de Java a partir de un XSD.
rmic: este compilador genera archivos de clase stub, skeleton y tie para objetos remotos.
Si con JavaC compilamos nuestro código (.java) a .class (bytecode), ¿cómo podriamos desensamblar dicho fichero.class?
javap
java -c programa.class
Enumera algunas herramientas de Java:
jdb: depurador (revisar el programa linea a linea en búsqueda de errores) x CONSOLA.
jdeps: analizador de dependencias, clases y paquetes.
jmc y jconsole: herramientas de monitorización de la JVM, para poder analizar o detectar, en tiempo de ejecución, si hubiera alguna aplicación fallando.
¿Qué funciones tienen las herramientas de Java jarsinger y keytool?
jarsinger: firmar ficheros “jar”.
keytool: para criptografía.
¿Para qué se usan las miniconsolas JSHELL?
Se llaman REPL (ReadEvaluatePrintLoop) y sólo se suelen usar para hacer pruebas, pues es una sencilla consola Java que nos permite ejecutar un bloque de código de una forma rápida y directa
NOTA: fue introducido en Java 9.
¿Qué función tiene la herramienta de Java javadoc?
Genera documentación HTML (estructura) a partir del código fuente de nuestro programa.
JDK vs JRE:
JDK (Java Development Kit = kit de desarrollo de Java) es para construir programas con Java. Trae herramientas útiles como: compilador (javac), desensamblador de bytecode (javap), depurador (jdb) para identificar y corregir errores, … Una instalación de JDK ya contiene un JRE.
JRE (Java Runtime Environment = entorno de ejecución de Java) contiene la JVM (intérprete) + las librerias (fichero rt.jar), y su ÚNICA función es la de ejecutar nuestro programa en múltiples plataformas, por ello, debe estar instalado en todo equipo donde vaya a correr nuestro programa Java.
EJEMPLO: si vas a desarrollar una aplicación GUI en Java con SWING => en tú equipo instalas la JDK y si un amigo quiere ver esa app tendrá que instalarse el JRE (includo en la JDK).
NOTA: como hemos comentado, la JDK contiene también la JRE, pues algunos IDEs llevan la JDK embebida.
IDEs: Eclipse, JBuilder, JCreator, XCode, NetBeans, …=> el IDE es el escritorio donde programar.
Sabemos que, además de las JVM (intérprete), en la JRE estan las librerías BASE contenidas en el archivo rt.jar, pero ¿cómo se cargan?
BootStrapClassLoader
Es el cargador de clases principales: String, Integer, Date, …
IMPORTANTE: Para usar librerías de terceros (NO están en rt.jar, ni son las tuyas propias), como Hibernate, Spring,… habría que configurar sus rutas en la variable de entorno CLASSPATH y se cargarían con ClassLoader, que es el cargador de clases de CLASSPATH.
*La variable de entorno CLASSPATH se encuentra dentro del fichero MANIFEST.MF (que, a su vez, esta dentro del fichero META-INF), donde existe un “campo” llamado Class-Path:ruta(s), donde configuramos la ruta de la librería de terceros.
*La estructura de Manifest.mf es clave:valor => ClassPath:fichero.jar (como cualquier variable de entorno).
*Para crear un paquete de clases las comprimimos en un fichero *.jar: =>
jar cvf fichero.jar clase1.class clase2.class
NOTA: la JRE esta incluida en el paquete de la JDK.
NOTA2: la extensión de los ficheros paquetes que contienen las librerías es .jar.
Los Thread o Hilos (miniprocesos en que se divide la ejecución del programa), además de crearlos nosotros, existen otros predefinidos como el GC, definelo:
Los objetos se crean con el operador new y se borran con este hilo (Garbage Colector), que funciona descargando los objetos que no se están utilizando de la memoria.
NOTA: la parte de la memoria donde se guardan los objetos de Java se llama: heap.
*Existe la clase Thread en el paquete java.lang para crear tus propios hilos:
public class HiloAdicional extends Thread => para heredar de dicha clase.
Sabemos que una clase es una estructura donde definimos atributos y métodos. Explica la palabra reservada final usada en dichos 3 contextos:
- Si se usa para una CLASE: nada podrá heredar de dicha clase (NO extends => plublic class hija extends padre).
*Aunque ella si podrá heredar de otras clases que no tengan “final”.
- Si se usa para un ATRIBUTO: el valor de dicho atributo no podrá cambiar.
final int num= 3; => valor constante (no cambia)
- Si se usa en un MÉTODO: ese método no se podrá sobrescribir (NO @override).
public final void método () => el código de ese método NO se podrá sobreescribir.
NOTA: la sobreescritura (la cual se la indicamos al compilador con la anotación @overrive para que nos la analice en busca de posibles errores que hayamos cometido en la replica), se da cuando se produce la herencia.
¿Para qué sirve la palabra reservada static?
Para definir atributos y métodos que no tienen nada que ver con los objetos, sino con la clase.
Es decir, un método estático influye a toda su clase a la que pertenece, así que no hace falta instanciarlo (se llama directamente).
*Los métodos instanciados son en los que se pone el objeto a la izquierda => objeto.método ( ).
NOTA: todo lo estático pertenece a la clase y lo NO estático pertenece a los objetos.
Resume los modificadores de visibilidad o acceso:
PUBLIC: CUALQUIERA.
PROTECTED: su clase ,clases del paquete y clases externas que hereden de ella (subclases o hijas)
DEFAULT: su clase y las clases de su paquete.
PRIVATE: SÓLO su clase.
MNEMOTECNIA: van de más a menos (de todo a sólo la clase) => CDTE (letras en que terminan), sabiendo que PUBLIC y PRIVATE están en los extremos, porque son opuestos.
En un programa Java, ¿puedo definir un método codificado en lenguaje C++, x ejemplo?
SI, con la palabra reservada native.
Se usa en declaraciones de métodos para especificar que el método no se implementa en el mismo archivo de Java, sino en otro lenguaje.
¿Qué relación tienen la palabra reservada “volatile” y “synchronized”?
NOTA: los métodos, clases, interfaces, variables y parámetros locales NO pueden declararse VOLÁTILES.
Al marcar un atributo como volatile, la JVM garantiza que el resultado de cada operación (thread) de escritura no se escriba en la memoria local, sino en la memoria principal (RAM, es decir, ese atributo no sería cacheado (introducido en cache), por lo que se usará el valor que hay en la RAM, pudiéndose compartir con el resto de hilos.
Este hecho, de que el hilo vaya a buscar la información a la RAM en lugar de la caché, tiene una penalización en el rendimiento. Pero, cualquier hilo (thread) puede acceder al valor más actualizado, al estar compartido directamente desde la RAM en lugar de la memoria local.
Synchronized también mejora la gestión de hilos. Pues, en lugar de que un cierto método pueda ser ejecutado por varios hilos, al marcarlo como synchronized le produciríamos un bloqueo mutex mientras el hilo actual lo esta ejecutando y se liberaría una vez termine. Así sucesivamente, de manera que sólo pueda ser ejecutado por un hilo cada vez secuencialmente.
NOTA: los campos, clases e interfaces NO pueden declararse como sincronizados.
Sabemos que la serialización es el proceso de convertir un objeto de la RAM en un flujo de bytes para poderlo guardar en el disco duro, enviarlo por red, …, pero ¿qué relación tiene con declarar un atributo TRANSIENT?
Los atributos transient son aquellos que NO quieras serializar (convertir a flujo de bytes), es decir, con ·transient” le decimos al motor de Java (JVM), que NO serialize dicho atributo de tal objeto, por tanto, que no lo guarde.
public class Usuario implements Serializable {
private String nombre;
private transient String password;
}
Esto implicaría que cuando se serialice el valor que haya en la variable password, al ser declarada como transient, no se va a serializar
¿A qué nos referimos con Java GENERICS?
Los tipos genéricos (Generics) permiten establecer restricciones (bounded) a nivel de tipo, haciendo que ciertas clases, interfaces o métodos acepten únicamente los tipos estipulados.
Es decir, cuando se que tipo de cosas va a contener mi clase, puedo especificarlo de antemano <generic> y así no se desvirtuaran en gran medida las clases hijas respecto del padre. Ya que nuestra clase no va a variar respecto del TIPO GENERICO con el que la hemos declarado.</generic>
class nombre_clase <extends Integer{ => indicas que sólo aceptarás clases genéricas que hereden de tipo entero.
Array < Integer a2=new Array<Integer (); => Generico para Almacenar Integer
Su uso esta ligado, mayoritariamente, a las colecciones (listas vinculadas, tablas hash, pilas, colas y árboles, entre otros), donde ayudan a realizar comprobación de tipos en tiempo de compilación.