Está en la página 1de 125

Java Standard Edition

Breve Historia de Java


El lenguaje Java as como la mquina virtual, comenzaron como un proyecto
interno de Sun Microsystems en 1990. Los ingenieros de Sun no estaban
satisfechos con el rendimiento del lenguaje C++, por lo que James Gosling,
Mike Sheridan y Patrick Naughton, junto con otros ms, comenzaron a
desarrollar un nuevo lenguaje, que en principio pensaron dedicar a la
programacin de todo tipo de aparatos, tales como microondas, neveras,
telfonos mviles, etc.. Ellos pensaban que stos generaran muchas e
importantes aplicaciones para la tecnologa del futuro.
El lenguaje tendra que obviar problemas que presenta C++, en campos tales
como la programacin distribuda, las aplicaciones multihilo, el manejo de la
memoria y ser ms sencillo de manejar que C++. Finalmente se deseaba
que los programas fueran portables a todo tipo de aparatos.

Caractersticas del lenguaje Java


Simple
Orientado a Objetos
Tipado estticamente
Distribuido
Compilado
Robusto
Seguro
Arquitectura Neutral
Multihilo
Recolector de basura (Garbage Collector)
Portable
Disponibilidad de un amplio conjunto de bibliotecas.

Estructura del JDK


JDK ("Java Development Kit")
Hoy en da, existen JDK's para diversos ambientes y plataformas, los cuales
ofrecen lo siguiente:
Un compilador Java, capaz de generar Byte-Code.

Un JVM ("Java Virtual Machine"), capaz de ejecutar Byte-Code.

Un conjunto de Clases base utilizadas para generar programas Java.

Otras utileras para administrar cdigo escrito en Java.

Documentacin del API (JavaDoc)


A quienes interesa el cdigo fuente?

Autores del propio cdigo

Otros desarrolladores del proyecto

Clientes de la API del proyecto.


Por que documentarlo?

Mantenimiento

Reutilizacin
Que documentar?

Obligatorio (

Clases y paquetes

Constructores, mtodos y atributos

/** Javadoc */

Introduccin al IDE de desarrollo(NetBeans)


Creacin de Proyecto:

Ventana de Trabajo

Estructura Bsica de Una Clase

Plantilla

Convenciones de Nomenclaturas
Los identificadores que proporciona Java siguen una convencin
segn el elemento:
Clases: primera letra en mayscula de cada palabra
ejemplo: Empleado, LibroDeCuentas, String
Variables: primera letra en minscula y la primera letra de cada
palabra en mayscula
ejemplo: contador, numeroTotalAccesos, string
Constantes: todo en maysculas, separando cada palabra por el
carcter _
ejemplo: PI, ANCHO_IMAGEN
Mtodos: siguen el mismo formato que las variables seguidas de
parntesis ( )
ejemplo: sumar(), obtenerResultado()
Estructuras de control: utilizar llaves englobando a todas las
sentencias de una estructura de control, aunque slo haya una
sentencia

Variables y Constantes
Variables: zona de memoria cuyos valores van a cambiar durante la
ejecucin
<tipo> <identificador> ;
<tipo> <identificador> , <identificador> ... ;
ejemplo: int x, y, z ;
Constantes: zona de memoria cuyos valores no cambian
final <tipo> <identificador> = <valor> ;
ejemplo: final double PI = 3.14159265 ;
Asignacin de Variables: se utiliza el operador asignacin =
<variable> = <expresin> ;
La parte izquierda siempre debe ser una variable.
La parte derecha puede ser un literal, una variable, una expresin, una
funcin o una combinacin de todos.
Se puede asignar un valor a una variable en el momento de declararla.
ejemplo: int i = 0 ;

Tipos de Datos
Los tipos primitivos son ocho agrupados en cuatro
lgico: boolean
texto: char
entero: byte, short, int, long
real: float, double
Tipos Primitivos
Tipo Lgico
Punto Flotante

Caracteres

Nmeros Enteros
boolean

char

byte short int long

float double

Los tipos referencia son punteros a objetos

Tipos Primitivos
Tipo

Tamao y formato
enteros

byte

8 bits - complemento a 2

short

16 bits - complemento a 2

int

32 bits - complemento a 2

long

64 bits - complemento a 2
nmeros reales

float

32 bits - IEEE 754

double

64 bits - IEEE 754


otros

char

16 bits - caracteres UNICODE

boolean

1 bit

Operadores de Incremento y
Decremento
Java ha heredado operadores de incremento y decremento
de C y C++
Es la nica forma de cambiar el valor de una variable sin
asignacin!
Categora
Abreviado
No abreviado
++

unario

++a, a++

a=a+1

--

unario

--a, a--

a=a-1

Operadores de Incremento y
Decremento
Prefijo: el valor cambia antes de ser evaluado
int a = 10;
int b = ++a; // resultado: a = 11, b = 11
Postfijo: el valor cambia despus de ser evaluado
int a = 10;
int b = a++; // resultado: a = 11, b = 10

Operadores Aritmticos
Realizan las operaciones aritmticas bsicas: suma (+),
resta (-), multiplicacin (*), divisin (/) y mdulo (%) para datos
de tipo numrico, tanto enteros como reales. Estas son
operaciones binarias porque admiten dos operandos.

Operadores Aritmticos
Ejemplo:
public class Aritmetica{
public static void main(String[] args){
int i
= 12;
int j
= 10;
int suma = i + j;
int resta = i - j;
int mult = i * j;
int div = i / j;
int modulo = i % j;
System.out.print("Suma :");
System.out.println(suma );
System.out.print("Resta :");
System.out.println(resta);
System.out.print("Multiplicacion :");
System.out.println(mult);
System.out.print("Division :");
System.out.println(div);
System.out.print("Modulo :");
System.out.println(modulo);
}}

Operadores Relacionales
Categora

Operandos

Significado

==

binario

enteros, reales

igual

!=

binario

enteros, reales

distinto

>

binario

enteros, reales

mayor

>=

binario

enteros, reales

mayor o igual

<

binario

enteros, reales

menor

<=

binario

enteros, reales

menor o igual

Operadores Relacionales
El resultado de evaluar una expresin con un operador relacional es
siempre true o false (boolean):
boolean b = 3 < 7;
boolean c = notaAsignatura > 9;
boolean d = 1 == 1;

Operadores Relacionales
Ejemplo:
public class relaciones {
public static void main(String args[]){
int i = -3;
byte b = 5;
double d = 3.14;
boolean b1 = i > i;
boolean b2 = i < b;
boolean b5 = d != 0;
System.out.println("b1: " + i + " > " + i + " = " + b1);
System.out.println("b2: " + i + " < " + b + " = " + b2);
System.out.println("b5: " + d + " != " + 0 + " = " + b5);
}
}

Operadores lgicos
Nombre Operador

Utilizacin

Resultado

AND

&&

A && B

verdadero cuando A y B son


verdaderos.

OR

||

A || B

verdadero cuando A o B son


verdaderos.

NOT

!a

verdadero si A es falso.

AND

&

A&B

verdadero cuando A y B son


verdaderos. Siempre evala
ambos operandos.

OR

A|B

verdadero cuando A o B son


verdaderos. Siempre evala
ambos operandos.

XOR

A^B

verdadero cuando A y B son


diferentes

Operadores lgicos
En lgica, el valor true esta representado por un 1 y el valor
false por un 0.
Las tablas de verdad son la forma ms usual de mostrar los
resultados de operaciones lgicas.
Tabla de verdad de la negacin (NO):
x

!x

b = !(3 > 5);

Operadores lgicos
Tabla de verdad para la conyuncin (Y) lgica:
x
1

y
1

x && y
1

b = ((5 > 3) && (6*2 == 12));


b = (!(5 > 3) && (6*2 == 12));

Operadores lgicos
Tabla de verdad para la disyuncin (O) lgica:
x

x || y

b = (!(5 > 3) || (6*2 == 12));

Operadores lgicos
Java evala conyuncin lgica de izquierda a derecha
b = (5 < 3) && (6*2 == 12);
b = (5 < 3) && (6*2 == 12);
Si el resultado de la expresin a la izquierda es false, Java no
evala la expresin a la derecha.
Lo mismo pasa con la disyuncin lgica cuando la expresin a
la izquierda es true
Ejemplo: evitar divisin por cero
boolean b = (n != 0) && (x < 1.0/n)

Operadores lgicos
Ejemplo:
public class OperAnd {
public static void main(String args[]){
boolean x = true;
boolean y = false;
boolean a1 = x && x;
boolean a2 = x && y;
boolean a3 = y && x;
boolean a4 = y && y;

}
}

System.out.println("Tabla de verdad de la conjuncin");


System.out.println( x + " AND " + x + " = " + a1 );
System.out.println( x + " AND " + y + " = " + a2 );
System.out.println( y + " AND " + x + " = " + a3 );
System.out.println( y + " AND " + y + " = " + a4 );

Estructuras de Control
Existen ciertas sentencias que permiten modificar el curso de
ejecucin. Debido a ciertas condiciones que se dan en el
programa podemos decidir que instrucciones se ejecutarn y
que cantidad de veces. Para lograr esto disponemos de un
conjunto de estructuras de control.

Sentencia if-else
La estructura de seleccin simple en Java se realiza mediante
la sentencia if (si, en ingles). La sintaxis es la siguiente :
if (condicin) sentencia;
La condicin es una expresin booleana. La sentencia se
ejecuta solamente si la expresin booleana es verdadera.
Ejemplo:
public class DivisionSegura {
public static void main(String args[]){
int x = 12;
int y = 0;
int z = 0;
if( y !=0 ) z = x / y;
System.out.println("El resultado es : " + z);
}
}

Sentencia if-else
Qu ocurre si la condicin no se cumple? En este caso nada.
Podemos agregar una serie de instrucciones que se
ejecutarn solo si la condicin no se cumple. Para esto
tendremos que agregar la sentencia else. La estructura de
seleccin quedar as:
if (condicin) sentencia 1;
else sentencia 2;
public class DivisionSegura {
public static void main(String args[]){
int x = 12;
int y = 0;
int z = 0;
if( y !=0 ) z = x / y;
else System.out.println("Atencin! se pretende dividir por 0");
System.out.println("El resultado es : " + z);
}
}

Sentencia if-else
public class DivisionSegura {
public static void main(String args[]){
int x = 12;
int y = 2;
int z = 0;
if( y !=0 ) {
z = x / y;
System.out.println("El resultado es : " + z);
} else {
System.out.println("Atencin! se pretende dividir por 0");
}
}
}

Sentencia if-else
Lamentablemente no siempre nos encontraremos con condiciones
tan sencillas. Muchas veces tendremos que recurrir a proposiciones
compuestas para formar una condicin. Para ello podemos recurrir a
operadores relacionales o lgicos. Recuerden que siempre debe dar
como resultado un valor booleano.
Supongamos que deseamos saber si un ao es bisiesto. Sabemos
que debe ser mltiplo de 4. Para esto tendremos que verificar si el
mdulo es igual a cero.
ao % 4 == 0
Pero no debe ser mltiplo de 100.
( ao % 4 == 0 ) && ( ao % 100 != 0 )
A menos que sea mltiplo de 400.
((( ao % 4 == 0 ) && ( ao % 100 != 0 )) || ( ao % 400 == 0 ))

Sentencia if-else
Formamos una proposicin compuesta con conectores lgicos.
Ahora vamos a incorporarlo en una estructura de seleccin.
if ((( ao % 4 == 0 ) && ( ao % 100 != 0 )) || ( ao % 400 == 0 )) {
System.out.println("Es bisiesto");
} else {
System.out.println("No es bisiesto");
}

Sentencia Switch
La sentencia switch se encarga de estructurar una seleccin
mltiple. Al contrario del enunciado if-else que slo podemos indicar
dos alternativas, maneja un nmero finito de posibilidades. La
estructura general del enunciado switch es la siguiente:
switch( expresin ) {
case constante1:
sentencia1;
...
break;
...
case constanteN:
sentenciaN;
...
break;
default:
sentencia;
...
break }

public class MiniCalculadora{


public static void main(String args[]){
int a = 1;
int b = 1;
char op = '/';
System.out.print("El resultado es : ");
switch ( op ) {
case '+':
System.out.println( a + b );
break;
case '-':
System.out.println( a - b );
break;
case '*':
System.out.println( a * b );
break;
case '/':
System.out.println( a / b );
break;
default:
System.out.println("error" );
break;
}
}}

Operador ternario ?
Entre todas las construcciones sintcticas que Java hered del C,
existe un curioso operador ternario. Se le llama operador if-else. Su
funcin es abreviar la notacin de la clusula de seleccin simple. La
sintaxis es la siguiente.
variable = op1?op2:op3
El operando op1 debe ser de tipo booleano. Los operandos op2 y
op3 pueden ser de cualquier tipo, pero compatibles entre si con la
variable que almacene el resultado. Funciona como una seleccin
simple. De acuerdo al valor lgico del operando op1, si es verdadero
el resultado de la operacin es igual al valor del operando op2. De lo
contrario, si op1 es falso, el resultado es el valor del operando op3.

Operador ternario ?
public class Ternario{
public static void main(String args[]){
int a = 23;
int b = 12;
int j = a > b ? a - b : b - a;
System.out.println("El resultado es: " + j );
}
}

Estructuras de iteracin
Supongamos que nos piden que realicemos un dibujo sencillo que
se despliegue por pantalla. El objetivo es mostrar un cuadrado de 5
filas por 5 columnas trazado con cualquier carcter. Con los
elementos de programacin que ya conocemos, realizamos un
programa que cumpla con este requisito.
public class Cuadrado{
public static void main(String args[]){
System.out.println("*****");
System.out.println("*****");
System.out.println("*****");
System.out.println("*****");
System.out.println("*****");
}
}

Estructuras de iteracin
Codigo Correcto:
N = 1;
Mientras que N <= 5
Imprimir ("*****");
N = N + 1;

Sentencia While
La sentencia while es la ms sencilla de las estructuras de iteracin.
La iteracin continuar hasta que su condicin sea falsa.
while ( condicin ) sentencia ;
int n = 0;
while ( n > 0 ) System.out.println("Esto nunca lo vers");
Dentro del conjunto de sentencia que controla, debe existir alguna
que cambie el valor de la condicin que se est evaluando.
boolean prueba = true;
while ( prueba ) {
System.out.println("Esto lo vers una vez");
prueba = false;
}

Sentencia While
Ejemplo lineas de caracteres:
public class Cuadrado{
public static void main(String args[]){
int contador = 1;
while ( contador <= 5 ) {
System.out.println("*****\n");
contador++;
}
}
}

Sentencia While
public class Cuadrado {
public static void main (String args [])
{
int contador = 1;
while (contador <= 5)
{
int contador2 = 1;
while (contador2 <= 5)
{
System.out.print ("*");
contador2++;
}
System.out.println ();
contador++;
}
}
}

Sentencia do-while
La sentencia de iteracin do-while es de tipo posprueba. Primero
realiza las acciones luego pregunta. La sintaxis es la siguiente:
do sentencia while ( condicin );
Observamos que es como un while pero al revs. Primeramente se
ejecuta la sentencia y luego evala la condicin. Si la expresin de
la condicin es verdadera vuelve a dar un ciclo. De lo contrario,
termina. Esto nos garantiza que la sentencia se ejecute al menos
una vez.

Sentencia do-while
Ejemplo:
public class CuentaDigitos{
public static void main(String args[]){
int nmero = 4557888;
int dgitos = 0;
do {
nmero /=10;
dgitos++;
}
while ( nmero > 0 );
System.out.println(dgitos);
}
}

Sentencia for
Trabajamos con casos de interaccin en donde a priori no
conocamos la cantidad de ciclos que se ejecutaban hasta cumplir
con una condicin. Para esto utilizamos la sentencia while. Pero
ahora estudiaremos con ms detalle aquellos casos en donde se
sabe de antemano cuantos ciclos se deben cumplir para terminar la
ejecucin.
Imprimiremos una tabla de multiplicar hasta el factor noveno. Si no
utilizamos ninguna estructura de interaccin, deberamos imprimir
nueve lneas de cdigo secuencial.
System.out.println("3 x 1 = 3");
System.out.println("3 x 2 = 6");
System.out.println("3 x 3 = 9");
System.out.println("3 x 4 = 12");
System.out.println("3 x 5 = 15");
System.out.println("3 x 6 = 18");
System.out.println("3 x 7 = 21");
System.out.println("3 x 8 = 24");

Sentencia for
Sintaxis:
for({valor inicial};{condicin de termino};{factor de incremento del
valor inicial}){
//aqui va lo que se repetir n veces de acuerdo a la condicin de
termino
}
Ejemplo anterior, tabla de multiplicar:
for ( int factor = 1; factor <= 9; factor ++ ) {
System.out.println("3 x " + factor + " = " + 3*factor );
}

Sentencia Break y Continue


Las palabras reservadas break y continue, se utilizan en Java para
detener completamente un bucle (break) o detener nicamente la
iteracin actual y saltar a la siguiente (continue). Normalmente si
usamos break o continue, lo haremos dentro de una sentencia if,
que indicar cundo debemos detener el bucle al cumplirse o no una
determinada condicin.
La sentencia continue provoca que nicamente la iteracin actual del
bucle ms interno detenga su ejecucin y que comience
inmediatamente la siguiente iteracin si el bucle todava no ha
terminado. Por ejemplo:
for (int i = 0; i < 10; i++) {
System.out.println("Dentro del bucle");
continue;
System.out.println("Nunca lo escribira");
}

Sentencia Break y Continue


Sin embargo, la sentencia break provoca que el programa detenga
la ejecucin del bucle ms interno y contine la ejecucin desde la
primera lnea de cdigo que se encuentre tras el bucle. Por ejemplo:
for (int i = 0; i < 10; i++) {
System.out.println("Dentro del bucle");
break;
System.out.println("Nunca lo escribira");
}
System.out.println("Tras el bucle");

Arreglos
Son estructuras de datos que permiten hacer alusin de forma
aleatoria a uno cualquiera de sus elementos. Los elementos de los
arreglos son variables de algn tipo dado, que al compartir el mismo
nombre pueden ser tratadas como una sola entidad.

Arreglos
Arreglos Unidimensionales:
Son aquellos arreglos de una sola dimensin, es decir, a los
cuales se puede acceder utilizando un solo ndice (para la fila).
Estos son llamados comnmente vectores.
Ej: edad[i] = 18; donde edad es el nombre del arreglo, i es
ndice y 18 es el valor que le estamos asignando.

Arreglos
Arreglos Multidimensionales:
Son aquellos arreglos de dos o mas dimensiones, es decir, a los
cuales solo se puede acceder utilizando un ndice para cada
dimension, por ejemplo, si es bidimensional, uno para la fila y otro
para la columna.
Ej: edad[x][y] = 18; donde edad es el nombre del arreglo, x es
ndice fila y y el ndice columna y 18 es el valor que le estamos
asignando.

Arreglos
Declaracin:
Es la operacin mediante la cual se define su nombre con un
identificador vlido y el tipo de los elementos del mismo. La sintxis
puede adoptar dos formatos:
tipo_dato[] nombre_arreglo;
tipo_dato nombre_arreglo[].

Ejemplo:
double[] mi_lista; // declaracin de un arreglo de tipo real
int temperatura[]; //declaracin de un arreglo de tipo entero

Arreglos
Creacin:
Un arreglo en Java es un objeto, y la declaracin no asigna
espacio en memoria para el arreglo. No se pueden asignar
elementos al arreglo a menos que el mismo ya est creado. Luego
de declarar el arreglo se puede usar el operador new para crear el
arreglo con la sintxis siguiente:
nombre_arreglo = new tipo_dato[cantidad_elementos];

Ejemplo:
mi_lista = new double[10]; // crea el arreglo de 10 elementos
temperatura = new int[5]; //crea el arreglo de 5 elementos

Arreglos
Inicializacin y Utilizacin:
Cuando se crea un arreglo, a los elementos se les asigna por
defecto el valor cero para las variables numricas de tipos de datos
primitivos, nulo para las variables de tipo carcter, false a las
booleanas y null a los objetos.
Los ndices del arreglo estn en el rango de cero a cantidad de
elementos 1.
Ejemplo:
mi_lista[6] = 5; // Asigna el valor 5 al sptimo elemento del arreglo.

Arreglos
Regla:
Un ndice de un arreglo es siempre un nmero entero
que comienza con 0 y termina en tamao del arreglo - 1.
Un arreglo completo se puede iniciar con una sintxis
similar a:
double[] mi_arreglo = {1.5, 2.45, 3.15, 7.25, 8.4};

Arreglos
El tamao de un arreglo se calcula usando la variable
instancia length. Por ejemplo si quisieramos saber la
cantidad de elementos que tiene el arreglo mi_arreglo,
desplegamos mi_arreglo.length.

Ejemplo Unidireccional.
import java.util.Scanner;
public class Arreglo01{
public static void main(String arg[])
{
Scanner in = new Scanner(System.in);
double x[],mayor,menor,promedio,suma=0;
int n,i;
do{
System.out.print("Cantidad de elementos del arreglo : ");
n=in.nextInt();
}while(n<=0 || n>10);
x=new double[n];
for(i=0; i<n;i++)
{
System.out.print("x["+i+"]: ");
x[i]=in.nextDouble();
}

System.out.println("Elementos del arreglo");


for(i=0; i<n;i++){
System.out.println("x["+i+"]: "+x[i]);
}
// Calculo del mayor y menor
mayor=menor=x[0];
for(i=1; i<n; i++){
if (x[i]>mayor) {
mayor=x[i];
}
else {
if(x[i]<menor) menor=x[i];
}
}
// Calculo de la suma de los elementos
for(i=0; i<n; i++){
suma=suma+x[i];
}
promedio=suma/n;
System.out.println("El mayor es " +mayor);
System.out.println("El menor es:"+ menor);
System.out.println("El promedio es : "+ promedio);
}
}

Arreglos
import java.util.*;
public class Bidimensional2 {
public static void main(String[] args) {
final int FILAS = 2, COLUMNAS = 2;
Scanner sc = new Scanner(System.in);
int i, j, mayor, menor;
int filaMayor, filaMenor, colMayor, colMenor;
int[][] A = new int[FILAS][COLUMNAS];
System.out.println("Lectura de elementos de la matriz: ");
for (i = 0; i < FILAS; i++) {
for (j = 0; j < COLUMNAS; j++) {
System.out.print("A[" + i + "][" + j + "]= ");
A[i][j] = sc.nextInt();
}
}
System.out.println("valores introducidos:");
for (i = 0; i < A.length; i++) {
for (j = 0; j < A[i].length; j++) {
System.out.print(A[i][j] + " ");
}
System.out.println();
}

Arreglos
mayor = menor = A[0][0];//se toma el primero como mayor y menor
filaMayor = filaMenor = colMayor = colMenor = 0;
for (i = 0; i < A.length; i++) { //
for (j = 0; j < A[i].length; j++) {
if (A[i][j] > mayor) {
mayor = A[i][j];
filaMayor = i;
colMayor = j;
} else if (A[i][j] < menor) {
menor = A[i][j];
filaMenor = i;
colMenor = j;
}
}
}
System.out.print("Elemento mayor: " + mayor);
System.out.println(" Fila: "+ filaMayor + " Columna: " + colMayor);
System.out.print("Elemento menor: " + menor);
System.out.println(" Fila: "+ filaMenor + " Columna: " + colMenor);
}
}

FOREACH
En las ltimas versiones de Java se introdujo una nueva forma de
uso del for, a la que se denomina for extendido o for each. Esta
forma de uso del for, que ya exista en otros lenguajes, facilita el
recorrido de objetos existentes en una coleccin sin necesidad de
definir el nmero de elementos a recorrer. La sintaxis que se emplea
es:
for( TipoARecorrer nombreVariableTemporal : nombreDeLaColeccin ) {
Instrucciones
}

FOREACH
Ejemplo:

String [] arreglo = {"ASDF", "QWER", "POIU", "ZXCV"};


Recorrerlo:
for(int i = 0; i < arreglo.length; i++) {
System.out.println(arreglo[i]);
}
Foreach:
for(String elemento : arreglo){
System.out.println(elemento);
}

Castings entre tipos de datos


primitivos
El casting es un procedimiento para transformar una variable
primitiva de un tipo a otro. Tambin se utiliza para transformar un
objeto de una clase a otra clase siempre y cuando haya una relacin
de herencia entre ambas. En este caso nos centraremos en el
primer tipo de casting.
Dentro de este casting de variables primitivas se distinguen dos
clases:

Castings entre tipos de datos


primitivos
Casting explcito
En el casting explcito s es necesario escribir cdigo. Ocurre cuando
se realiza una conversin estrecha (narrowing casting), es decir,
cuando se coloca un valor grande en un contenedor pequeo. Son
susceptibles de prdida de datos.
int num1 = 100;
short num2 = (short) num1;
// Aqu hace falta un casting explcito:
short tiene menor rango que int
Como se ve, el formato general para indicar que queremos realizar
la conversin es:
(tipo) valor_a_convertir

Castings entre tipos de datos


primitivos
Casting implcito
En este caso no se necesita escribir cdigo para que la conversin
se lleve a cabo. Ocurre cuando se realiza lo que se llama una
conversin ancha (widening casting), es decir, cuando se coloca un
valor pequeo en un contenedor grande.
Ejemplo de casting explcitos seran:
int num1 = 100;
long num2 = num1;
long num2 = 100;

// Un int cabe en un long


// 100 en un int

Castings entre tipos de datos


primitivos
La siguiente tabla resume las posibilidades de casting existentes:

Donde:
no: indica que no hay posibilidad de conversin.
si: indica que el casting es implcito.
si*: indica que el casting es implcito pero se puede producir prdida
de precisin.

Clases en Java
La programacin orientada a objetos se basa en la programacin de
clases; a diferencia de la programacin estructurada, que est
centrada en las funciones.
Una clase es un molde del que luego se pueden crear mltiples
objetos, con similares caractersticas.
Una clase es una plantilla (molde), que define atributos (variables) y
mtodos (funciones)
La clase define los atributos y mtodos comunes a los objetos de
ese tipo, pero luego, cada objeto tendr sus propios valores y
compartirn las mismas funciones.
Debemos crear una clase antes de poder crear objetos (instancias)
de esa clase. Al crear un objeto de una clase, se dice que se crea
una instancia de la clase o un objeto propiamente dicho.

Atributos
Los atributos son las caractersticas individuales que diferencian un
objeto de otro y determinan su apariencia, estado u otras cualidades.
Los atributos se guardan en variables denominadas de instancia, y
cada objeto particular puede tener valores distintos para estas
variables.
Las variables de instancia tambin denominados miembros dato,
son declaradas en la clase pero sus valores son fijados y cambiados
en el objeto.
Adems de las variables de instancia hay variables de clase, las
cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el
nmero de ruedas de un automvil es el mismo cuatro, para todos
los automviles.

Comportamientos (Mtodos)
El comportamiento de los objetos de una clase se implementa
mediante funciones miembro o mtodos. Un mtodo es un conjunto
de instrucciones que realizan una determinada tarea y son similares
a las funciones de los lenguajes estructurados.
Del mismo modo que hay variables de instancia y de clase, tambin
hay mtodos de instancia y de clase. En el primer caso, un objeto
llama a un mtodo para realizar una determinada tarea, en el
segundo, el mtodo se llama desde la propia clase.

Constructores
Un objeto de una clase se crea llamando a una funcin especial
denominada constructor de la clase. El constructor se llama de
forma automtica cuando se crea un objeto, para situarlo en
memoria e inicializar los miembros dato declarados en la clase. El
constructor tiene el mismo nombre que la clase. Lo especfico del
constructor es que no tiene tipo de retorno.
class Rectangulo{
int x;
int y;
int ancho;
int alto;
Rectangulo(int x1, int y1, int w, int h){
x=x1;
y=y1;
ancho=w;
alto=h;
}
}

Encapsulamiento
Como java es un lenguaje de programacin orientado a objetos,
existen en un programa, diversos atributos y mtodos que servirn
para el funcionamiento de ste. Para la interaccin del usuario con el
objeto es necesario que se apliquen, o se encuentren disponibles,
solo aquellos mtodos que le servirn al usuario para utilizar ese
objeto, manteniendo ocultos aquellos que servirn para el
funcionamiento interno.
Es por ello que el encapsulamiento consiste en permitir la visibilidad
de atributos y/o mtodos, en una clase determinada, teniendo as
tres niveles de: privados (private) que se utilizaran solo en esa clase,
protegidos (protected) que se utilizaran por todos los mtodos,
clases y /o atributos mientras se encuentre en el mismo package, y
los pblicos (public) que pueden ser usados por cualquier clase o
mtodo.

Encapsulamiento
Un ejemplo de encapsulamiento aplicado a objetos es una lavadora,
donde el usuario solo se le ofrece la posibilidad de programar; el
nivel de llenado del tanque, su funcionalidad (lavar, centrifugar,
secar), encendido o apagado, como funciones principales. Pero para
funcionamiento interno, no se requiere saber cul es el mtodo para
cambiar de tanque lleno a vaciado y posterior centrifugado, etc. De
esta manera se hace ms fcil el uso de la lavadora para el usuario..

Ejemplo
import java.util.Scanner;
public class Persona {
private Scanner teclado;
private String nombre;
private int edad;
public void inicializar() {
teclado=new Scanner(System.in);
System.out.print("Ingrese nombre:");
nombre=teclado.next();
System.out.print("Ingrese edad:");
edad=teclado.nextInt();
}
public void imprimir() {
System.out.println("Nombre:"+nombre);
System.out.println("Edad:"+edad);
}
public void esMayorEdad() {
if (edad>=18) {
System.out.print(nombre+" es mayor de edad.");
} else {
System.out.print(nombre+" no es mayor de edad.");
}
}}

Ejemplo
Crear una clase con el mtodo main y consumir el objeto de la clase
Persona.
Persona persona1=new Persona();
persona1.inicializar();
persona1.imprimir();
persona1.esMayorEdad();

Ejemplo
Mtodos retornan valor.
public class Bisiesto {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int ao;
System.out.print("Introduce ao: ");
ao = sc.nextInt();
if(esBisiesto(ao)) //llamada al mtodo
System.out.println("Bisiesto");
else
System.out.println("No es bisiesto");
}
/**
* mtodo que calcula si un ao es o no bisiesto
*/
public static boolean esBisiesto(int a){
if(a%4==0 && a%100!=0 || a%400==0)
return true;
else
return false;
}
}

Ejemplo
Encapsulamiento.
public class EjEncap {
private String nombre;
public void setNombre(String value) {
if (nombre != null) {
System.out.println("El nombre solamente puede ser fijado una vez");
}
if (value==null) {
System.out.println("Nombre no puede ser nulo");
}
if (value.length() < 4 || value.length() > 50) {
System.out.println("Nombre debe medir entre 4 y 50 caracteres");
}
nombre = value;
}
}

La Clase String
Dentro de un objeto de la clases String , Java crea un array de
caracteres de una forma similar a como lo hace el lenguaje C++. A
este array se accede a travs de las funciones miembro de la clase.
Los strings u objetos de la clase String se pueden crear
explcitamente o implcitamente. Para crear un string implcitamente
basta poner una cadena de caracteres entre comillas dobles. Por
ejemplo, cuando se escribe
System.out.println("El primer programa");

La Clase String
Cmo se obtiene informacin acerca del string;
Una vez creado un objeto de la clase String podemos obtener
informacin relevante acerca del objeto a travs de las funciones
miembro.
Para obtener la longitud, nmero de caracteres que guarda un string
se llama a la funcin miembro length.
String str="El primer programa";
int longitud=str.length();
Podemos conocer si un string comienza con un determinado prefijo,
llamando al mtodo startsWith, que devuelve true o false, segn que
el string comience o no por dicho prefijo
String str="El primer programa";
boolean resultado=str.startsWith("El");

La Clase String
En este ejemplo la variable resultado tomar el valor true.
De modo similar, podemos saber si un string finaliza con un conjunto
dado de caracteres, mediante la funcin miembro endsWith.
String str="El primer programa";
boolean resultado=str.endsWith("programa");
Si se quiere obtener la posicin de la primera ocurrencia de la letra
p, se usa la funcin indexOf.
String str="El primer programa";
int pos=str.indexOf('p');
Para obtener las sucesivas posiciones de la letra p, se llama a otra
versin de la misma funcin
pos=str.indexOf('p', pos+1);
El segundo argumento le dice a la funcin indexOf que empiece a
buscar la primera ocurrencia de la letra p a partir de la posicin
pos+1.

La Clase String
El mtodo equals compara un string con un objeto cualquiera que
puede ser otro string, y devuelve true cuando dos strings son
iguales o false si son distintos.
String str="El lenguaje Java";
boolean resultado=str.equals("El lenguaje Java");
La variable resultado tomar el valor true.
En muchas ocasiones es necesario extraer una porcin o substring
de un string dado. Para este propsito hay una funcin miembro de
la clase String denominada substring.
Para estraer un substring desde una posicin determinada hasta el
final del string escribimos
String str="El lenguaje Java";
String subStr=str.substring(12);
Se obtendr el substring "Java".

La Clase String
Una segunda versin de la funcin miembro substring, nos permite
extraer un substring especificando la posicin de comienzo y la el
final.
String str="El lenguaje Java";
String subStr=str.substring(3, 11);
Se obtendr el substring "lenguaje". Recurdese, que las posiciones
se empiezan a contar desde cero.
Convertir un nmero a string
Para convertir un nmero en string se emplea la funcin miembro
esttica valueOf (ms adelante explicaremos este tipo de funciones).
int valor=10;
String str=String.valueOf(valor);
La clase String proporciona versiones de valueOf para convertir los
datos primitivos: int, long, float, double.

La Clase String
Convertir un string en nmero
Cuando introducimos caracteres en un control de edicin a veces es
inevitable que aparezcan espacios ya sea al comienzo o al final.
Para eliminar estos espacios tenemos la funcin miembro trim
String str=" 12 ";
String str1=str.trim();
Para convertir un string en nmero entero, primero quitamos los
espacios en blanco al principio y al final y luego, llamamos a la
funcin miembro esttica parseInt de la clase Integer (clase
envolvente que describe los nmeros enteros)
String str=" 12 ";
int numero=Integer.parseInt(str.trim());

La Clase String
Para convertir un string en nmero decimal (double) se requieren
dos pasos: convertir el string en un objeto de la clase envolvente
Double, mediante la funcin miembro esttica valueOf, y a
continuacin convertir el objeto de la clase Double en un tipo
primitivo double mediante la funcin doubleValue
String str="12.35 ";
double numero=Double.valueOf(str).doubleValue();
Se puede hacer el mismo procedimiento para convertir un string a
nmero entero
String str="12";
int numero=Integer.valueOf(str).intValue();

La Clase StringBuffer
En la seccin dedicada a los operadores hemos visto que es posible
concatenar cadenas de caracteres, es, decir, objetos de la clase
String. Ahora bien, los objetos de la clase String son constantes lo
cual significa que por defecto, solamente se pueden crear y leer pero
no se pueden modificar.
Imaginemos una funcin miembro a la cual se le pasa un array de
cadenas de caracteres.
public class CrearMensaje{
public String getMensaje(String[] palabras){
String mensaje="";
for(int i=0; i<palabras.length; i++){
mensaje+=" "+palabras[i];
}
return mensaje;
}
//...
}

La Clase StringBuffer
Cada vez que se aade una nueva palabra, se reserva una nueva
porcin de memoria y se desecha la vieja porcin de memoria que
es ms pequea (una palabra menos) para que sea liberada por el
recolector de basura (grabage collector). Si el bucle se realiza 1000
veces, habr 1000 porciones de memoria que el recolector de
basura ha de identificar y liberar.
Para evitar este trabajo extra al recolector de basura, se puede
emplear la clase StringBuffer que nos permite crear objetos
dinmicos, que pueden modificarse.
public class CrearMensaje{
public String getMensaje(String[] palabras){
StringBuffer mensaje=new StringBuffer();
for(int i=0; i<palabras.length; i++){
mensaje.append(" ");
mensaje.append(palabras[i]);
}
return mensaje.toString();
}
//...
}

La Clase StringBuffer
La funcin append incrementa la memoria reservada para el objeto
mensaje con una palabra ms sin crear nueva memoria, cada vez
que se ejecuta el bucle. La funcin toString, que veremos ms
adelante, convierte un objeto en una cadena de caracteres.

La Clase Math
La clase Math tiene miembros dato y funciones miembro estticas
La clase Math posee constantes como el PI, que se accede de esta
forma:
System.out.println("Pi es " + Math.PI);
Funciones miembro
La clase Math define muchas funciones y versiones distintas de
cada funcin.
Por ejemplo, para hallar el valor absoluto de un nmero define las
siguientes funciones. Se llama a una u otra dependiendo del tipo de
dato que se le pasa en su nico argumento.

La Clase Math
public final class Math {
public static int abs(int a) {
return (a < 0) ? -a : a;
}
public static long abs(long a) {
return (a < 0) ? -a : a;
}
public static float abs(float a) {
return (a < 0) ? -a : a;
}
public static double abs(double a) {
return (a < 0) ? -a : a;
}
//...
}
Por ejemplo, hallar el valor absoluto de los siguientes nmeros
int i = -9;
double x = 0.3498;
System.out.println("|" + i + "| es " + Math.abs(i));
System.out.println("|" + x + "| es " + Math.abs(x));

La Clase Math
Funcin potencia y raz cuadrada
Para elevar un nmero x a la potencia y, se emplea pow(x, y)
System.out.println("pow(10.0, 3.5) es " + Math.pow(10.0,3.5));
Para hallar la raz cuadrada de un nmero, se emplea la funcin sqrt
System.out.println("La raz cuadrada de " + x + " is " +
Math.sqrt(x));
El mayor y el menor de dos nmeros
Para hallar el mayor y el menor de dos nmeros se emplean las
funciones min y max que comparan nmeros del mismo tipo.

La Clase Math
int i = 7;
int j = -9;
double x = 72.3543;
double y = 0.3498;
// para hallar el menor de dos nmero
System.out.println("min(" + i + "," + j + ") es " + Math.min(i,j));
System.out.println("min(" + x + "," + y + ") es " + Math.min(x,y));
// Para hallar el mayor de dos nmeros
System.out.println("max(" + i + "," + j + ") es " + Math.max(i,j));
System.out.println("max(" + x + "," + y + ") es " + Math.max(x,y));

Herencia
Muchas veces distintos objetos comparten campos y mtodos que
hacen aproximadamente lo mismo (por ejemplo almacenar y
devolver un nombre del mbito humano con el que se designa al
objeto, como el ttulo de un lbum de msica, el ttulo de un libro, el
ttulo de una pelcula, etc.).
Por ejemplo en un proyecto que utilice objetos Taxi y objetos
Autobus podramos encontrarnos algo as:

Herencia
La herencia nos permite definir una clase como extensin de otra: de
esta manera decimos la clase 1.1 tiene todas las caractersticas de
la clase 1 y adems sus caractersticas particulares. Todo lo que es
comn a ambas clases queda comprendido en la clase superior,
mientras lo que es especfico, queda restringido a las clases
inferiores. En nuestro ejemplo definiramos una clase denominada
Vehculo, de forma que la clase Taxi tuviera todas las propiedades
de la clase Vehculo, ms algunas propiedades y mtodos
especficos. Lo mismo ocurrira con la clase Autobs y otras que
pudieran heredar de Vehiculo. Podramos seguir creando clases
con herencia en un nmero indefinido: tantas como queramos. Si
piensas en el API de Java, hay cientos de clases que heredan de
clases jerrquicamente superiores como la clase Object. En un
proyecto propio, podremos tener varias clases que hereden de una
clase comn.

Herencia
extends: Esta palabra reservada, indica a la clase hija cual va a ser
su clase padre, es decir que por ejemplo en la clase Taxi al poner
public class Taxi extends Vehiculo le estamos indicando a la clase
Taxi que su clase padre es la clase Vehiculo

Herencia
public classTaxi extends Vehiculo
{
private int numeroLicencia;
public Taxi() {
super();
}
public void setNumeroLicencia( int numeroLicencia) {
...
}
public int getNumeroLicenciar() {
...
return numeroLicencia;
}
}

Object
Todas las clases son en realidad subclases de una clase mas
amplia: la clase Object. Cuando decimos esto estamos diciendo que
todas las clases que utilicemos hasta las que creamos se extienden
de la clase Object. Esto se puede ver mejor cuando generamos una
clase por ejemplo Persona, vemos que la clase recin creada
Persona tiene muchos mas mtodos los cuales nunca creamos, por
ejemplo:el mtodo .equals(),hashCode(), etc.

Object
Los mtodos pblicos y protegidos de la clase Object son:
public boolean equals(Object obj): compara si dos objetos son iguales, por defecto
un objeto es igual solamente a si mismo.
public int hashCode(): Devuelve un valor de cdigo hash para el objeto. Este mtodo
se apoya en beneficio de tablas hash tales como los proporcionados por
java.util.Hashtable.
protected Object clone() throws CloneNotSuportedException: devuelve una copia
binaria del objeto, al parecer al hacer la copia hace referencia a una nueva posicin
de memoria.
public final Class getClass(): devuelve el objeto del tipo Class que representa dicha
clase durante la ejecucin, es decir devuelve el tipo de clase al que pertenece.
protected void finalize() throws Throwable: se usa para finalizar el objeto, es decir,
se avisa al administrador de la memoria que ya no se usa dicho objeto, y se puede
ejecutar cdigo especial antes de que se libere la memoria.
public String toString():devuelvo una cadena describiendo el objeto.

Asociacin Y Composicin
Los dos conceptos que debes conocer cmo mnimo cuando
intentas descifrar la forma en que tus objetos deben interactuar son
Asociacin y Composicin.
Asociacin
La asociacin se podra definir como el momento en que dos objetos
se unen para trabajar juntos y as, alcanzar una meta.
Un punto a tomar muy en cuenta es que ambos objetos son
independientes entre s, veremos un poco ms adelante qu
implicacin tiene esto. Para validar la asociacin, la frase Usa un,
debe tener sentido:
El ingeniero usa una computadora
El cliente usa tarjeta de crdito.

Asociacin Y Composicin
Composicin
En caso contrario, la composicin es un tipo de relacin dependiente
en dnde un objeto ms complejo es conformado por objetos ms
pequeos. En esta situacin, la frase Tiene un, debe tener sentido:
El auto tiene llantas
La porttil tiene un teclado.

Asociacin Y Composicin
Cmo implementar Asociacin
Representaremos la relacin: El cliente usa tarjeta de crdito.
Cdigo :
public class Customer {
private int id;
private String firstName;
private String lastName;
private CreditCard creditCard;
public Customer() {
//Lo que sea que el construtor haga
}
public void setCreditCard(CreditCard creditCard) {
this.creditCard = creditCard;
}
// Ms cdigo aqu
}

Asociacin Y Composicin
Cmo implementar Composicin

Representaremos la relacin: La porttil tiene un teclado.


Cdigo :
public class Laptop {
private String manufacturer;
private String model;
private String serviceTag;
private KeyBoard keyBoard = new KeyBoard();
public Laptop() {
//Lo que sea que el constructor haga
}
}

Asociacin Y Composicin
De ambos casos podemos deducir que:
En la asociacin:
Customer es independiente de CreditCard, puesto que el cliente puede
existir sin necesidad de tener asignada una tarjeta de crdito. Dmosle
tiempo para que la tramite, Pero no lo dejemos ir!
Se puede asignar o retirar la tarjeta de crdito, sin que la existencia del
Cliente se vea afectada (No debera verse afectada, esto significa que
Customer no debe tronar si no hay un CreditCard presente).
En la composicin:
Los objetos que componen a la clase contenedora, deben existir desde
el principio. (Tambin pueden ser creados en el constructor, no slo al
momento de declarar las variables como se muestra en el ejemplo).
No hay momento (No debera) en que la clase contenedora pueda
existir sin alguno de sus objetos componentes. Por lo que la existencia
de estos objetos no debe ser abiertamente manipulada desde el exterior
de la clase.

Sobrescritura (Overriding)
Cada vez que se tiene una clase que hereda un mtodo de una
superclase, se tiene la oportunidad de sobreescribir el mtodo (a menos
que dicho mtodo est marcado como final). El beneficio clave al
sobreescribir un mtodo heredado es la habilidad de definir un
comportamiento especfico para los objetos de la subclase.Veamos un
ejemplo de la sobreescritura de un mtodo heredado:
public class Animal {
public void comer(){
System.out.println("Animal comiendo...");
}
}
class Caballo extends Animal{
public void comer(){
System.out.println("Caballo comiendo...");
}
}

Sobrecarga (Overloading)
Un mtodo sobrecargado se utiliza para reutilizar el nombre de un mtodo
pero con diferentes argumentos (opcionalmente un tipo diferente de
retorno). Las reglas para sobrecargar un mtodo son las siguientes:
+ Los mtodos sobrecargados debeb de cambiar la lista de argumentos.
+ Pueden cambiar el tipo de retorno.
+ Pueden cambiar el modificador de acceso.
+ Pueden declarar nuevas o ms amplias excepciones.
+ Un mtodo puede ser sobrecargado en la misma clase o en una
subclase.
Veamos un mtodo que se desea sobrecargar:
public void cambiarTamano(int tamano, String nombre, float patron){ }
Los siguientes mtodos
cambiarTamano():

son

sobrecargas

legales

del

public void cambiarTamano(int tamano, String nombre){}


public int cambiarTamano(int tamano, float patron){}
public void cambiarTamano(float patron, String nombre)
IOException{}

mtodo

throws

Sobrecarga (Overloading)
Cmo invocar un mtodo sobrecargado::
Lo que define qu mtodo es el que se va a llamar son los
argumentos que se envan al mismo durante la llamada. Si se invoca
a un mtodo con un String como argumento, se ejecutar el mtodo
que tome un String como argumento, si se manda a llamar al mismo
mtodo pero con un float como argumento, se ejecutar el mtodo
que tome un float como argumento y as sucesivamente. Si se
invoca a un mtodo con un argumento que no es definido en
ninguna de las versiones sobrecargadas entonces el compilador
arrojar un mensaje de error.

Sobrecarga (Overloading)
public class Sobrecarga {
public void Numeros(int x, int y){
System.out.println("Mtodo que recibe enteros.");
}
public void Numeros(double x, double y){
System.out.println("Mtodo que recibe flotantes.");
}
public void Numeros(String cadena){
System.out.println("Mtodo que recibe una cadena: "+ cadena);
}
public static void main (String... args){
Sobrecarga s = new Sobrecarga();
int a = 1;
int b = 2;
s.Numeros(a,b);
s.Numeros(3.2,5.7);
s.Numeros("Monillo007");
}
}

This y Super
La palabra reservada this permite especificar que la variable que
seala (y la seala haciendo this.nombreVariable) es de la misma
clase en la que se usa.
Nos preguntamos .. para que me sirve esto, si ya se
sobreentiende? Yo nunca voy a usar dos variables con el mismo
nombre!
class RGB {
int red, green, blue;
RGB(int red, int green, int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
}
La palabra reservada super sirve para indicar que una variable o un
mtodo es de la superclase (herncia).

This y Super
class SuperClase {
boolean variableBool;
void setVariableBool() {
variableBool = true;
}
}
class SubClase extends SuperClase {
boolean variableBool;
void setVariableBool() {
variableBool = false;
super.setVariableBool();
System.out.println("La variable de aqui es " + variableBool);
System.out.println("La de la superclase es " + super.variableBool);
}
}
class Codigo {
public static void main(String[] args) {
SubClase objetoPrueba = new SubClase();
objetoPrueba.setVariableBool();
}
}

Clases Abstractas
Clases definidas en la jerarqua que simplemente recogen
las caractersticas comunes de otra serie de clases ( sus
descendientes), pero que no se van a (o no se deben) utilizar para
crear objetos.
Sintaxis: public abstract class NombreDeLaClase { }.
Caractersticas de una Clase abstracta:
Modela el comportamiento comn de sus clases derivadas.
Establece mtodos que necesariamente han de ser implementados por sus
subclases (las clases derivadas)--> METODOS ABSTRACTOS.
Mtodos sin cdigo, se declaran pero no se definen
Deben definirse en alguna subclase--> Si una subclase no implementa un mtodo
abstracto heredado debe ser abstracta tambin
Un mtodo abstracto debe pertenecer a una clase abstracta
Implementa mtodos que son comunes a todas sus subclases (No
abstractos).
La clase abstracta puede definir atributos comunes a sus subclases.
En el sistema no se crean ejemplares de la clase abstracta porque no
seran objetos con existencia propia en el mundo real.
new A () --> ERROR si A abstracta
Los objetos que se crearn sern ejemplares de las subclases
(aquellas que no sean tambin abstractas).

Clases Abstractas
A su vez, las clases abstractas suelen contener mtodos abstractos: la situacin es la
misma. Para que un mtodo se considere abstracto ha de incluir en su signatura la
palabra clave abstract. Adems un mtodo abstracto tiene estas peculiaridades:
a) No tiene cuerpo (llaves): slo consta de signatura con parntesis.
b) Su signatura termina con un punto y coma.
c) Slo puede existir dentro de una clase abstracta. De esta forma se evita que haya
mtodos que no se puedan ejecutar dentro de clases concretas. Visto de otra manera, si
una clase incluye un mtodo abstracto, forzosamente la clase ser una clase abstracta.
d) Los mtodos abstractos forzosamente habrn de estar sobreescritos en las subclases.
Si una subclase no implementa un mtodo abstracto de la superclase tiene un mtodo
no ejecutable, lo que la fuerza a ser una subclase abstracta. Para que la subclase sea
concreta habr de implementar mtodos sobreescritos para todos los mtodos
abstractos de sus superclases.
Sintaxis tipo: abstract public/private/protected TipodeRetorno/void ( parmetros
);
Por ejemplo: abstract public void generarNomina (int diasCotizados, boolean
plusAntiguedad);

Clases Abstractas

Clases Abstractas
public class Persona {
private String nombre; private String apellidos; private int edad;
public Persona() {
nombre = ""; apellidos = ""; edad = 0;
}
public Persona (String nombre, String apellidos, int edad) {
this.nombre = nombre;
this.apellidos = apellidos;
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public String getApellidos() {
return apellidos;
}
public int getEdad() {
return edad;
}
public String toString() {
Integer datoEdad = edad;
return "-Nombre: ".concat(nombre).concat(" -Apellidos: ").concat(apellidos).concat("
-Edad: ").concat(datoEdad.toString() );
}
} //Cierre de la clase

Clases Abstractas
public abstract class Profesor extends Persona {
private String IdProfesor;
// Constructores
public Profesor () {
super();
IdProfesor = "Unknown";
}
public Profesor (String nombre, String apellidos, int edad, String id) {
super(nombre, apellidos, edad); IdProfesor = id;
}
// Mtodos
public void setIdProfesor (String IdProfesor) {
this.IdProfesor = IdProfesor;
}
public String getIdProfesor () {
return IdProfesor;
}
public void mostrarDatos() {
System.out.println ("Datos Profesor. Profesor de nombre: " + getNombre() + " " +
getApellidos() + " con Id de profesor: " + getIdProfesor() );
}
public String toString () {
return super.toString().concat(" -IdProfesor: ").concat(IdProfesor);
}
abstract public float importeNomina (); // Mtodo abstracto
} //Cierre de la clase

Clases Abstractas
public class ProfesorTitular extends Profesor {
public ProfesorTitular(String nombre, String apellidos, int edad, String id) {
super(nombre, apellidos, edad, id);
}
public float importeNomina () {
return 30f * 43.20f;
} //Mtodo abstracto sobreescrito en esta clase
} //Cierre de la clase

Clases Abstractas
import java.util.Calendar;
public class ProfesorInterino extends Profesor {
private Calendar fechaComienzoInterinidad;
// Constructores
public ProfesorInterino (Calendar fechaInicioInterinidad) {
super();
fechaComienzoInterinidad = fechaInicioInterinidad;
}
public ProfesorInterino (String nombre, String apellidos, int edad, String id, Calendar
fechaInicioInterinidad) {
super(nombre, apellidos, edad, id);
fechaComienzoInterinidad = fechaInicioInterinidad;
}
public Calendar getFechaComienzoInterinidad () {
return fechaComienzoInterinidad;
} //Mtodo
public String toString () { // Sobreescritura del mtodo
return super.toString().concat (" Fecha comienzo interinidad: ").concat
(fechaComienzoInterinidad.getTime().toString());
}
public float importeNomina () {
return 30f * 35.60f ;
} //Mtodo abstracto sobreescrito en esta clase
} //Cierre de la clase

Clases Abstractas
iimport java.util.Calendar;
public class TestAbstract {
public static void main (String [ ] Args) {
Calendar fecha1 = Calendar.getInstance();
fecha1.set(2019,10,22); //Los meses van de 0 a 11, luego 10 representa noviembre
ProfesorInterino pi1 = new ProfesorInterino("Jos", "Hernndez Lpez", 45, "45221887K", fecha1);
ProfesorInterino pi2 = new ProfesorInterino("Andrs", "Molt Parra", 87, "72332634-L",
fecha1);
ProfesorInterino pi3 = new ProfesorInterino ("Jos", "Ros Mesa", 76, "34998128-M",
fecha1);
ProfesorTitular pt1 = new ProfesorTitular ("Juan", "Prez Prez", 23, "73-K");
ProfesorTitular pt2 = new ProfesorTitular ("Alberto", "Centa Mota", 49, "88-L");
ProfesorTitular pt3 = new ProfesorTitular ("Alberto", "Centa Mota", 49, "81-F");
} } //Cierre del main y cierre de la clase

Palabra Reservada Final


Clases finales
Se puede declarar una clase como final, cuando no nos interesa crear clases derivadas
de dicha clase. La clase Cuadrado se puede declarar como final, ya que no se espera
que ningn programador necesite crear clases derivadas de Cuadrado.
final class Cuadrado extends Rectangulo{
public Cuadrado(int x, int y, double dimension){
super(x, y, dimension, dimension);
}
}
Uno de los mecanismos que tienen los hackers para daar o para obtener informacin
privada en los sistemas es la de crear una clase derivada y sustituir dicha clase por la
original. La clase derivada acta exactamente igual que la original pero tambin puede
hacer otras cosas, normalmente dainas. Para prevenir los posibles daos, se declara la
clase como final, impidiendo a cualquier programador la creacin de clases derivadas de
sta. Por ejemplo, la clase String que es una de las ms importantes en la programacin
en lenguaje Java, est declarada como final. El lenguaje Java garatiza que siempre que
se utilice un string, es un objeto de la clase String que se encuentra en el paquete
java.lang.String, y no cualquier otro string.

Palabra Reservada Final


Mtodos finales
Como se ha comentado al introducir la herencia, una de las formas de aprovechar el cdigo
existente, es la de crear una clase derivada y redefinir algunos de los mtodos de la clase base.
class Base{
//...
final public void funcionFinal(){
//...
}
public void dibujar(Graphics g){
}
}
class Derivada extends Base{
//...
public void dibujar(Graphics g){
//dibujar algunas figuras
}
}
La clase Base define una funcin miembro pblica dibujar, que no dibuja nada en el contexto grfico
g. La clase Derivada redefine la funcin miembro dibujar, para dibujar algunas figuras en el contexto
grafico g. La funcin que se redefine tiene que tener la misma declaracin en la clase Base y en la
clase Derivada.
Para evitar que las clase derivadas redefinan una funcin miembro de una clase base, se le
antepone la plabara clave final. La funcin miembro funcionFinal de la clase Base no se puede
redefinir en la clase Derivada, pero si se puede redefinir la funcin miembro dibujar.

Polimorfismo
Se define como la capacidad que tienen los objetos de comportarse de mltiples

formas, programando de manera general en vez de hacerlo de forma especifica


Alguna vez consultando, definan este concepto como la forma en la que podemos
tratar una subClase como si fuera una Clase del tipo de su superClase, usando solo
los mtodos o atributos disponibles para la Clase declarada..... es decir, si tenemos
una clase "X" podemos decir que "X" es de tipo "Y" esto se cumple solo si existe una
relacin de herencia entre ellas, ya sea si "X" hereda de "Y" (extends) o si "X"
implementa a "Y" (implements)

Polimorfismo
El ejemplo de la entrada sobre conceptos bsicos en el punto sobre polimorfismo,
se explica mejor lo anterior usando "X" como cualquier clase Cuadrado, Triangulo o
Circulo y "Y" como la clase FiguraGeometrica, por lo tanto decimos que por ejemplo
la clase Triangulo es de tipo FiguraGeometrica, en Java esto lo representamos asi:
class FiguraGeometrica{
}
class Triangulo extends FiguraGeometrica {
}
public class Principal{
public void metodo(){
/**Puedo crear objetos polimorficos*/
/**Objeto Triangulo de tipo FiguraGeometrica*/
FiguraGeometrica triangulo=new Triangulo();
}
}

Polimorfismo
Vemos que FiguraGeometrica es la superClase y Triangulo es la clase hija o
subClase, y por medio del polimorfismo podemos crear una instancia de Triangulo
de tipo FiguraGeometrica.
Algunas Consideraciones
Como en todo, tenemos unas reglas que se deben cumplir y tener en cuenta cuando
vamos a trabajar con objetos polimorficos, estas son :
Una variable de referencia puede ser de un solo tipo, y una vez que fue declarada,
ese tipo jams puede modificarse..... por ejemplo, si declaramos triangulo de tipo
FiguraGeometrica, no podemos decir mas adelante que el mismo objeto triangulo es
de tipo FiguraPuntiaguda...
Una referencia es una variable, de manera que puede ser reasignada a otros
objetos (a menos que se declare como final). por ejemplo podemos hacer lo
siguiente:
FiguraGeometrica miFiguraGeometrica = new FiguraGeometrica();
Cuadrado miCuadro=new Cuadrado();
/**Puedo crear objetos polimorficos, asignando su referencia*/
miFiguraGeometrica=miCuadro;

Interfaces
Interface es una Clase completamente Abstracta, como regla, sabemos que las
clases abstractas poseen como mnimo un mtodo abstracto, pero hablando de una
interface, todos sus mtodos tienen que serlo.
las interfaces muchas veces son definidas como un tipo de contrato entre las clases
concretas que la implementen, ya que la clase que lo haga se encuentra obligada a
definir los mtodos abstractos que la componen.
Lo anterior quiere decir que cuando creamos un Interface, lo que hacemos es definir
lo que la clase que la implemente podr hacer, pero no indicamos la forma en que lo
har.
Herencia Multiple?
Podemos decir que las interfaces simulan la herencia mltiple ya que una clase
puede implementar cualquier numero de interfaces, adems las interfaces pueden
heredar uno o mas nmeros de interfaces mediante la palabra extends, pero jamas
podrn heredar clases concretas...
En java se usa la palabra reservada implements para indicar que implementamos
una interface, la estructura general de una clase que implementa una interface es la
siguiente.

Interfaces
interface InterfacePrincipal {
public void metodoAbstracto();
public String otroMetodoAbstracto();
}
public class Principal implements InterfacePrincipal,otraInterface,otraMas{
public void metodoAbstracto() {
/**Implementacin definida por la clase concreta*/
}
public String otroMetodoAbstracto() {
/**Implementacin definida por la clase concreta*/
return "retorno";
}
public void metodoAbstractoDeOtraInterface() {
/**Implementacin definida por la clase concreta*/
}
public void metodoAbstractoDeOtraMas() {
/**Implementacin definida por la clase concreta*/
}
}

Interfaces
Caractersticas de las Interfaces.
Todos los mtodos de una interfaz son implcitamente public abstract, no es
necesario especificarlo en la declaracin del mismo.
Todas las variables y atributos de una interfaz son implcitamente constantes (public
static final), no es necesario especificarlo en la declaracin del misma
Los mtodos de una interfaz no pueden ser: static, final.
Una interfaz puede heredar (extends) de una o ms interfaces.
Una interfaz no puede heredar de otro elemento que no sea una interfaz.
Una interfaz no puede implementar (implements) otra interfaz.
Una interfaz debe ser declarada con la palabra clave interface.
Los tipos de las interfaces pueden ser utilizados polimrficamente.
Una interfaz puede ser public o package (valor por defecto).
Los mtodos toman como mbito el que contiene la interfaz.

Interfaces
Algunas de las anteriores caractersticas se veran as.
/**Las interfaces Heredan de cualquier cantidad de interfaces usando extends*/
public interface PrimerInterface extends SegundaInterface, TercerInterface
{
/**Las siguientes son declaraciones validas para los atributos*/
int ATRIBUTO1= 5;
public int ATRIBUTO2= 5;
public static int ATRIBUTO3= 5;
public final int ATRIBUTO4= 5;
static int ATRIBUTO5= 5;
final int ATRIBUTO6= 5;
static final int ATRIBUTO7= 5;
public static final int ATRIBUTO8= 5;
/**Las siguientes son declaraciones validas para los mtodos*/
void metodoPrimerInterface1();
public void metodoPrimerInterface2();
abstract void metodoPrimerInterface3();
public abstract void metodoPrimerInterface4();
}

Interfaces
Cuando Utilizarlas?
Su uso esta muy ligado al concepto de herencia y cumple el mismo principio que
aplicamos al usar clases abstractas, lo que buscamos es establecer un mecanismo
donde podamos compartir caractersticas comunes entre clases diferentes, adems
al igual que con clases abstractas nos aseguramos que los mtodos y atributos solo
estn disponibles para las clases que las implementen...

Interfaces
En el diagrama de clases vemos 6 clases concretas y 2 interfaces, las clases
Humano y Animal son clases padre de "Hombre y Mujer" y "Perro y Gato"
respectivamente, ahora bien, Humano y Animal son clases diferentes con un rbol
de herencia marcado, pero ambas poseen caractersticas comunes que podemos
usar por medio de la interface AccionesGeneral.
Podemos decir que tanto un Hombre como un Gato pueden caminar, usando para
esto el mtodo desplazarse(), donde cada clase dar el mecanismo de
desplazamiento, por ejemplo el hombre lo hace en 2 piernas mientras que el gato en
4 patas (o dependiendo de la forma como lo realicen), y este mismo concepto puede
aplicarse a los otros mtodos enmarcados en la Interface AccionGeneral que tanto
Humanos como Animales comparten.
Tambin tenemos la interface AccionesHumano para esos mtodos o
caractersticas que solo son aplicables a los humanos y que tanto Hombre como
Mujer pueden adoptar, as la clase Humano podr simular la herencia mltiple al
implementar las 2 interfaces mencionadas.