Tutorial Java ST
Tutorial Java ST
Tutorial Java ST
Contents
Leccin: Lenguaje bsico .......................................................................................................... 8
Variables .................................................................................................................................. 8
Operadores.............................................................................................................................. 8
Expresiones, declaraciones y bloques ................................................................................ 8
Instrucciones de flujo de control........................................................................................... 8
Variables ...................................................................................................................................... 8
Nomenclatura ........................................................................................................................ 10
Tipos de datos primitivos......................................................................................................... 10
Valores por defecto .............................................................................................................. 12
Literales .............................................................................................................................. 13
Usando caracteres de subrayado en literales de valores numricos........................... 15
Arreglos ...................................................................................................................................... 16
Declarar una Variable para hacer referencia a un Arreglo ............................................ 18
Crear, inicializar y acceder a una arreglo ......................................................................... 19
Copia de Arrays .................................................................................................................... 20
Manipulacin de arreglos .................................................................................................... 21
Resumen de Variables ............................................................................................................ 22
Preguntas: Variables ................................................................................................................ 22
Operadores................................................................................................................................ 22
Asignacin, aritmtica y operadores unarios ....................................................................... 24
El operador de asignacin Simple ..................................................................................... 24
Los operadores aritmticos................................................................................................. 24
Los operadores unarios ....................................................................................................... 25
Operadores de igualdad y relacionales ............................................................................ 27
Los operadores condicionales ............................................................................................ 28
El operador de comparacin de tipo instanceof .............................................................. 29
Operadores Bitwise y Bit Shift ................................................................................................ 30
Resumen de operadores ......................................................................................................... 30
Operador de asignacin simple.......................................................................................... 30
Operadores aritmticos ....................................................................................................... 30
Operadores unarios ............................................................................................................. 31
Igualdad y operadores relacionales ................................................................................... 31
Operadores condicionales .................................................................................................. 31
Operador de comparacin de tipo ..................................................................................... 31
Operadores Bitwise bit a bit y Bit Shift (mover bits) ........................................................ 31
Tipos ....................................................................................................................................... 56
Nombres de variables .......................................................................................................... 56
Definir Mtodos ......................................................................................................................... 57
Nombrando un mtodo ........................................................................................................ 57
Sobrecarga de mtodos ...................................................................................................... 58
Proporcionar constructores para tus clases ......................................................................... 58
Pasar informacin a un mtodo o a un Constructor ........................................................... 59
Tipos de parmetros ............................................................................................................ 60
Nmero arbitrario de argumentos ...................................................................................... 60
Nombres de parmetros ...................................................................................................... 61
Pasando argumentos de tipo de datos primitivo ............................................................. 62
Pasando argumentos de tipo de datos de referencia ..................................................... 62
Objetos ....................................................................................................................................... 63
Creacin de objetos ................................................................................................................. 64
Declarar una Variable para hacer referencia a un objeto .............................................. 64
Crear instancias de una clase ............................................................................................ 65
Inicializar un objeto............................................................................................................... 65
Uso de objetos .......................................................................................................................... 67
Referenciando a los campos de un objeto ....................................................................... 67
Llamar los mtodos de un objeto ....................................................................................... 68
El recolector de basura ........................................................................................................ 69
Ms sobre clases ...................................................................................................................... 70
Devuelve un valor desde un mtodo ..................................................................................... 70
Devolviendo una clase o una interfaz ............................................................................... 71
Usando la palabra clave this................................................................................................... 72
Usando this con un campo .............................................................................................. 72
Usando this con un Constructor ..................................................................................... 72
Controlar el acceso a los miembros de una clase............................................................... 73
Entendiendo a los miembros de la clase .............................................................................. 74
Variables de clase ................................................................................................................ 75
Mtodos de la clase ............................................................................................................. 76
Constantes............................................................................................................................. 76
La clase de Bicycle .......................................................................................................... 77
Inicializar campos ..................................................................................................................... 78
Bloques de inicializacin esttica ...................................................................................... 78
Inicializar miembros de instancia ....................................................................................... 79
Operadores
Esta seccin describe los operadores del lenguaje de programacin Java. Primero presenta los
operadores ms comnmente utilizados, y por ltimo los operadores menos utilizados. Cada
discusin incluye ejemplos de cdigo que se pueden compilar y ejecutar.
Variables
Como has aprendido en la leccin anterior, un objeto almacena su estado en campos.
int cadence = 0;
int speed = 0;
int gear = 1;
Ya hemos presentado a los campos, pero probablemente tiene todava un par de preguntas, tales
como:
Exploraremos las respuestas a estas preguntas en esta leccin, pero antes de hacerlo, hay algunas
distinciones tcnicas de las que primero debes ser consciente.
En el lenguaje de programacin Java, se usan ambos trminos "campo" y "variable";
Esto es una fuente comn de confusin entre los nuevos desarrolladores, ya que ambas parecen a
menudo referirse a lo mismo.
Variables Locales
Similar a cmo un objeto almacena su estado en los campos, un mtodo almacenar
temporalmente el estado en las variables locales.
La sintaxis para declarar una variable local es similar a declarar un campo (por ejemplo,
int count = 0;).
No hay ninguna clave especial designando una variable como local; la determinacin
proviene totalmente de la situacin en la que se declara la variable est entre la apertura
y cierre de llaves de un mtodo.
Por lo tanto, las variables locales slo son visibles para los mtodos en los que se
declaran; No son accesibles desde el resto de la clase.
Parmetros
Ya has visto ejemplos de parmetros tanto en el mtodo main de la aplicacin "Hello
World!" y en la clase Bicycle.
Recordemos que la firma para el mtodo main es public static void
main(String[] args).
Aqu, la variable args es el parmetro de este mtodo. Lo importante a recordar es que
los parmetros siempre son clasificados como "variables" no como "campos".
Esto se aplica a otras construcciones de parmetros aceptados tambin (como
constructores y los controladores de excepciones) que aprender ms adelante en el
tutorial.
Una vez dicho esto, el resto de este tutorial utiliza las siguientes directrices generales cuando se
habla de campos y variables:
Si estamos hablando de "campos en general" (excluyendo las variables locales y los parmetros),
podemos decir simplemente "campos".
Si la discusin se aplica a "todas las anteriores", podemos decir simplemente "variables".
Si el contexto pide una distincin, usaremos trminos especficos (campo esttico, variables locales,
etc.) segn corresponda. Ocasionalmente tambin puede ver el trmino "miembro" usado tambin.
Los tipos de campos, mtodos y tipos anidados se denominan colectivamente miembros.
Nomenclatura
Cada lenguaje de programacin tiene su propio conjunto de reglas y convenciones para las clases
de nombres que puedes usar, y el lenguaje de programacin Java no es diferente.
Las reglas y convenciones para nombrar sus variables pueden resumirse como sigue:
Los caracteres posteriores pueden ser Letras, nmeros, signos de dlar, o caracteres
resaltados. La convencin (y el sentido comn) se aplican a esta regla tambin. Al elegir
un nombre para sus variables, utilice palabras completas en lugar de abreviaturas
crpticas. Hacerlo asi har su cdigo fcil de leer y comprender. En muchos casos tambin
har su cdigo auto-documentado; los campos denominados cadence, speed y gear,
por ejemplo, son mucho ms intuitivos que versiones abreviadas, como s, c y g. Tambin
tenga en cuenta que el nombre que usted elige no debe ser una palabra clave o palabra
reservada.
Si el nombre que usted elige consta de una nica palabra, escriba esa palabra en
letras minsculas. Si consta de ms de una palabra, la primera letra de cada palabra
subsiguiente ser mayscula. Los nombres gearRatio y currentGear son los
principales ejemplos de esta Convencin. Si la variable almacena un valor constante,
tales como static final int NUM_GEARS = 6, la Convencin cambia
ligeramente, cada letra ser mayscula y se separa las palabras posteriores con el
carcter de subrayado. Por Convencin, el carcter de subrayado nunca se utiliza en otros
lugares.
todas las variables primero deben ser declaradas antes de que puedan ser utilizadas.
int gear = 1;
As dice el programa que un campo llamado "gear" existe, contiene datos numricos y tiene un valor
inicial de "1". El tipo de dato de una variable determina los valores que puede contener, adems de
las operaciones que pueden realizarse con l. Adems de int, el lenguaje de programacin Java
soporta otros siete tipos de datos primitivos.
Un tipo primitivo est predefinido por el lenguaje y es nombrado por una palabra
clave reservada.
Los valores primitivos no comparten el estado con otros valores primitivos. Los ocho tipos de datos
primitivos soportados por el lenguaje Java de programacin son:
byte: el tipo de dato byte de 8-bit es un entero con signo en complemento a dos (0 para
positivo y 1 para negativo).
o
o
Pueden tambin ser utilizados en lugar de int donde sus lmites ayudan a clarificar el
cdigo; el hecho de que el rango de una variable es limitado puede servir como una forma
de documentacin.
short: el tipo de dato short es de 16-bit es un entero con signo en complemento a dos.
o
o
int: por defecto, el tipo de datos int es de 32-bit es un entero con signo en complemento a
dos,
o
En Java SE 8 y versiones posteriores, puede utilizar el tipo de datos int para representar
un entero sin signo de 32 bits, que tiene un valor mnimo de 0 y un valor mximo de 232-1.
Consulte la seccin el nmero de clases para obtener ms informacin. Mtodos estticos
como compareUnsigned, divideUnsigned etc. se han aadido a la clase Integer
para apoyar las operaciones aritmticas de nmeros enteros sin signo.
long: el tipo de datos long es de 64-bit complemento a dos con cualquier otro.
o
o
En Java SE 8 y versiones posteriores, puede utilizar el tipo de datos long para representar
64 bits sin signo, que tiene un valor mnimo de 0 y un valor mximo de 264-1.
La clase Long tambin contiene mtodos como compareUnsigned, divideUnsigned
etc. para apoyar operaciones aritmticas de long sin signo.
float: el tipo de datos float es un punto flotante de precisin simple de 32 bits del
estandar IEEE 754 (Instituto de Ingeniera Elctrica y Electrnica para aritmtica en coma
flotante). Su rango de valores est fuera del alcance de esta discusin, pero se especifica
en la seccin tipos de coma flotante, formatos y valores de la Java Language Specification.
Como con las recomendaciones de byte y short,
o
o
o
doble: el tipo de datos double es un punto flotante de precisin doble de 64 bits IEEE 754.
Su rango de valores est fuera del alcance de esta discusin, pero se especifica en la
seccin tipos de coma flotante, formatos y valores de la especificacin del lenguaje Java.
o
o
booleano: el tipo de datos boolean tiene slo dos valores posibles: true y false.
o
o
Utilice este tipo de datos para indicadores simples que siguen condiciones
del tipo verdadero o falso.
Este tipo de datos representa un bit de informacin, pero su "tamao" no es
algo que se define con precisin.
Los campos que son declarados pero no inicializados establecern una moratoria razonable por el
compilador.
En trminos generales, por defecto ser cero o null, dependiendo del tipo de datos.
Confiar en estos valores por defecto, sin embargo, se considera generalmente mal estilo de
programacin.
La siguiente tabla resume los valores por defecto para los tipos de datos anteriores.
Tipo de datos
Byte
short
int
long
0L
float
0.0F
double
0.0d
Char
'\u0000'
false
El acceso a una variable local sin inicializar producir un error en tiempo de compilacin.
Literales
Usted puede haber notado que no se utiliza la palabra clave new al inicializar una variable de un tipo
primitivo.
Como se muestra a continuacin, es posible asignar un literal a una variable de un tipo primitivo:
Literales enteros
Un literal entero es de tipo long si termina con la letra L o l; de lo contrario es de tipo int.
Se recomienda utilizar la letra mayscula L porque la minscula letra l es difcil distinguir el dgito 1.
Los valores de los tipos integrales byte, short, int y long pueden crearse desde
literales int.
Los valores de tipo long que exceden el rango de int pueden crearse de literales de
long.
Los literales enteros pueden ser expresados por estos sistemas de numeracin:
Decimales: Base 10, cuyas cifras consta de los nmeros 0 a 9; Este es el sistema de
numeracin que utiliza todos los das.
Hexadecimal: Base 16, cuyos dgitos consisten en los nmeros 0 a 9 y las letras A F
Binario: Base 2, cuyas cifras se compone de los nmeros 0 y 1 (puede crear literales
binarios en Java SE 7 y versiones posteriores)
Para la programacin de propsito general, es probable que el sistema de numeracin nico que
nunca usar es el sistema decimal. Sin embargo,
Si usted necesita usar otro sistema de numeracin, el ejemplo siguiente muestra la sintaxis correcta.
El prefijo 0x indica hexadecimal y 0b binario:
Los tipos de punto flotante (float y double) tambin puede expresarse utilizando E o e (para la
notacin cientfica), F o f (literal float de 32 bits) y D o d (64 bits double literal; esta es la opcin
predeterminada y por Convencin se omite).
double d1 = 123.4;
// mismo valor que d1, pero en notacin cientfica
double d2 = 1.234e2;
float f1 = 123.4f;
Los literales de tipo char y String pueden contener cualquier carcter Unicode (UTF-16).
Utilice siempre 'comillas simples' para literales char y "comillas dobles" para literales de
String.
Las secuencias de escape Unicode pueden utilizarse en cualquier parte en el programa (como en
los nombres de campo, por ejemplo), no slo en literales char o String.
El lenguaje de programacin Java tambin soporta algunas secuencias de escape especial para
literales char y String:
\b (retroceso)
\t (tab),
\n (avance de lnea),
\f (forma de alimentacin),
\r (retorno de carro),
\" (comilla doble),
\' (comilla simple) y
\\ (barra invertida).
Tambin hay una literal especial null que puede utilizarse como un valor para cualquier tipo de
referencia.
null puede asignarse a cualquier variable, excepto las variables de tipos primitivos.
Es poco lo que puede hacer con un valor null ms all de pruebas de su presencia. Por lo tanto,
null es a menudo utilizado en programas como marcador para indicar que un objeto no
est disponible.
Por ejemplo, String.class. Esto se refiere al objeto (de tipo Class) que representa el tipo de s
mismo.
Esta caracteristica le permite separar grupos de dgitos en literales numricos, que pueden
mejorar la legibilidad del cdigo.
Por ejemplo, si su cdigo contiene nmeros con muchos dgitos, usars un carcter de subrayado
para separar dgitos en grupos de tres, similar a cmo usaras un signo de puntuacin como una
coma o un espacio, como un separador.
El siguiente ejemplo muestra otras maneras en que puede utilizar el carcter de subrayado en
literales de valores numricos:
Los siguientes ejemplos demuestran las colocaciones de subrayado vlido y no vlido (que
destacan) en literales de valores numricos:
// antes de un sufijo L
long socialSecurityNumber1 = 999_99_9999_L;
// OK (literal decimal)
int x1 = 5_2;
// Invalido: no se puede poner subrayado
// Al final de una literal
int x2 = 52_;
// OK (decimal literal)
int x3 = 5_______2;
// Invalido: no se puede poner subrayado
// en el prefijo 0x
int x4 = 0_x52;
// Invalido: no se puede poner subrayado
// en el comienzo de un nmero
int x5 = 0x_52;
// OK (literal hexadecimal)
int x6 = 0x5_2;
// Invalido: no se puede poner subrayado
// al final del numero
int x7 = 0x52_;
Arreglos
Un arreglo es un objeto contenedor que contiene un nmero fijo de valores de un solo tipo.
La longitud de un arreglo se establece cuando se crea el arreglo.
Despus de la creacin, su longitud es fija.
Usted ya ha visto un ejemplo de arreglo, en el mtodo main de la aplicacin "Hello World!". Esta
seccin analiza detalladamente los arreglos.
Cada item de un arreglo se llama un elemento, y cada a elemento se accede por su ndice
numrico.
Como se muestra en la ilustracin anterior, la numeracin comienza con 0. El noveno elemento, por
ejemplo, sera por lo tanto para acceder al ndice 8.
El siguiente programa, ArrayDemo, crea un arreglo de enteros, pone algunos valores del
arreglo e imprime cada valor en salida estndar.
class ArrayDemo {
public static void main(String[] args) {
// declara una arreglo de enteros
int[] anArray;
// asigna memoria para 10 nmeros enteros
anArray = new int[10];
// inicializa primer elemento
anArray[0] = 100;
// inicializa segundo elemento
anArray[1] = 200;
// y as sucesivamente
anArray[2] = 300;
anArray[3] = 400;
anArray[4] = 500;
anArray[5] = 600;
anArray[6] = 700;
anArray[7] = 800;
anArray[8] = 900;
anArray[9] = 1000;
System.out.println("Element at index
+ anArray[0]);
System.out.println("Element at index
+ anArray[1]);
System.out.println("Element at index
+ anArray[2]);
System.out.println("Element at index
+ anArray[3]);
System.out.println("Element at index
+ anArray[4]);
System.out.println("Element at index
+ anArray[5]);
System.out.println("Element at index
+ anArray[6]);
System.out.println("Element at index
+ anArray[7]);
System.out.println("Element at index
+ anArray[8]);
System.out.println("Element at index
+ anArray[9]);
}
}
La salida de este programa es:
Element
Element
Element
Element
Element
Element
Element
Element
Element
Element
at
at
at
at
at
at
at
at
at
at
index
index
index
index
index
index
index
index
index
index
0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
100
200
300
400
500
600
700
800
900
1000
0: "
1: "
2: "
3: "
4: "
5: "
6: "
7: "
8: "
9: "
En una situacin de programacin del mundo real, es probable que utilice una de las construcciones
de bucle soportados para iterar a travs de cada elemento de la matriz, en lugar de escribir cada
lnea individual como en el ejemplo anterior.
Sin embargo, el ejemplo ilustra claramente la sintaxis de la matriz. Usted aprender acerca de las
diferentes construcciones de bucles (for, while, y do-while) en la seccin de Control de flujo .
una declaracin de arreglo tiene dos componentes: tipo de arreglo y el nombre del
arreglo.
Tipo de arreglo se escribe como type[], donde type es el tipo de datos de los elementos
contenidos;
los corchetes son smbolos especiales que indica que esta variable contiene un
arreglo.
El tamao del arreglo no es parte de este tipo (razn por la cual los corchetes estn vacos). El
nombre de un arreglo puede ser cualquier cosa que quieras, siempre que sigas las reglas y
convenciones como se discute en la seccin de nomenclatura . Al igual que con las variables de
otros tipos,
byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;
Tambin puede colocar los parntesis despus del nombre de la matriz:
Los corchetes identifican el tipo de arreglo y deben aparecer con la designacin del
tipo.
La siguiente instruccin en el programa ArrayDemo asigna un array con suficiente memoria para
10 elementos de tipo entero y asigna el arreglo a la variable anArray.
int[] anArray
100, 200,
400, 500,
700, 800,
};
= {
300,
600,
900, 1000
Aqu la longitud del arreglo se determina por el nmero de valores proporcionados entre
corchetes y separados por comas.
// arreglo multidimensional
String[][] names
Cada elemento, por lo tanto, debe accederse por el nmero correspondiente de los valores
del ndice.
En el lenguaje de programacin Java, un arreglo multidimensional es un arreglo cuyos
componentes son ellos mismos, los arreglos.
Esto es a diferencia de los arreglos en C o Fortran. Una consecuencia de esto es que las filas
pueden variar en longitud, como se muestra en el siguiente programa MultiDimArrayDemo :
class MultiDimArrayDemo {
public static void main(String[] args) {
String[][] names = {
{"Mr. ", "Mrs. ", "Ms. "},
{"Smith", "Jones"}
};
// Mr. Smith
System.out.println(names[0][0] + names[1][0]);
// Ms. Jones
System.out.println(names[0][2] + names[1][1]);
}
}
La salida de este programa es:
Mr. Smith
Ms. Jones
Finalmente, usted puede utilizar la propiedad incorporada length para determinar el tamao de
cualquier arreglo. El cdigo siguiente imprime el tamao de la matriz a la salida estndar:
Copia de Arrays
La clase System tiene un mtodo arraycopy que puede utilizar para eficientar
class ArrayCopyDemo {
public static void main(String[] args) {
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e',
'i', 'n', 'a', 't', 'e', 'd' };
char[] copyTo = new char[7];
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(new String(copyTo));
}
}
La salida de este programa es:
caffein
Manipulacin de arreglos
class ArrayCopyOfDemo {
public static void main(String[] args) {
char[] copyFrom = {'d', 'e', 'c', 'a', 'f', 'f', 'e',
'i', 'n', 'a', 't', 'e', 'd'};
char[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 9);
System.out.println(new String(copyTo));
}
}
Como puede ver, la salida de este programa es el mismo (caffein), aunque requiere menos
lneas de cdigo.
Tenga en cuenta que el segundo parmetro del mtodo copyOfRange es el ndice inicial del rango
a ser copiado, inclusivo, mientras que el tercer parmetro es el ndice final del rango que se
copiar, exclusivamente. En este ejemplo, el rango a copiar no incluye el elemento del arreglo en el
ndice 9 (que contiene el carcter a).
Algunas otras operaciones tiles proporcionados por mtodos de la clase java.util.Arrays,
son:
Buscar en una matriz un valor especfico para obtener el ndice en el cual se coloca (el
mtodo binarySearch).
Comparar dos arreglos para determinar si son iguales o no (el mtodo equals).
Llenar una matriz para colocar un valor especfico en cada ndice (el mtodo fill).
Clasificar un arreglo en orden ascendente. Esto puede hacerse ya sea secuencialmente,
utilizando el mtodo de sort, o al mismo tiempo, usando el parallelSort mtodo
introducido en Java SE 8. La clasificacin paralela de grandes arreglos en sistemas
multiprocesador es ms rpido que la matriz secuencial de clasificacin.
Resumen de Variables
Preguntas: Variables
1.
2.
3.
4.
5.
6.
7.
Operadores
Ahora que ha aprendido a declarar e inicializar variables, probablemente quieras saber cmo hacer
algo con ellas. Aprender los operadores del lenguaje de programacin Java es un buen lugar para
empezar.
Los operadores son smbolos especiales que realizan operaciones concretas en uno,
dos o tres operandos y luego devuelven un resultado.
Mientras exploramos los operadores del lenguaje de programacin Java, puede ser til para usted
saber con anticipacin qu operadores tienen la mas alta precedencia. Los operadores en la tabla
siguiente se enumeran segn el orden de precedencia.
Los operadores con mayor prioridad se evalan antes que los operadores con precedencia
relativamente menor.
Cuando los operadores de igual prioridad aparecen en la misma expresin, debe regir una regla de
cul se evala primero.
Precedencia
Postfix
expr++ expr--
Unario
Multiplicativo
* / %
Aditivo
+ -
Shift (desplazar)
Relacionales
Igualdad
== !=
bitwise AND
&
bitwise exclusive OR
bitwise inclusive OR
AND lgico
&&
OR lgica
||
ternario
? :
asignacin
int cadence = 0;
int speed = 0;
int gear = 1;
Este operador puede usarse en objetos para asignar referencias a objetos, como se discute en
Crear objetos.
Descripcin
Operador de resta
Operador de multiplicacin
Operador divisin
class ArithmeticDemo {
public static void main (String[] args) {
int result = 1 + 2;
// el resultado es ahora 3
System.out.println("1 + 2 = " + result);
int original_result = result;
result = result - 1;
// el resultado es ahora 2
System.out.println(original_result + " - 1 = " + result);
original_result = result;
result = result * 2;
// el resultado es ahora 4
System.out.println(original_result + " * 2 = " + result);
original_result = result;
result = result / 2;
// el resultado es ahora 2
System.out.println(original_result + " / 2 = " + result);
original_result = result;
result = result + 8;
// el resultado es ahora 10
System.out.println(original_result + " + 8 = " + result);
original_result = result;
result = result % 7;
// el resultado es ahora 3
System.out.println(original_result + " % 7 = " + result);
}
}
1 + 2 = 3
3 - 1 = 2
2 * 2 = 4
4 / 2 = 2
2 + 8 = 10
10 % 7 = 3
Tambin puedes combinar los operadores aritmticos con el operador de asignacin simple
para crear asignaciones compuestas. Por ejemplo, x+=1; y x=x+1; ambos incrementan el valor
de x por 1.
El + operador puede utilizarse tambin para concatenar (unir) dos cadenas juntas, como se
muestra en el siguiente programa ConcatDemo :
class ConcatDemo {
public static void main(String[] args){
String firstString = "This is";
String secondString = " a concatenated string.";
String thirdString = firstString+secondString;
System.out.println(thirdString);
}
}
Al final de este programa, la variable thirdString contiene " This is a concatenated
string.", que queda impreso a la salida estndar.
Descripcin
operador aditivo unario ; indica el valor positivo (sin embargo, los nmeros son positivos
sin esto)
++
--
class UnaryDemo {
public static void main(String[] args) {
int result = +1;
// el resultado es ahora 1
System.out.println(result);
result--;
// el resultado es ahora 0
System.out.println(result);
result++;
// el resultado es ahora 1
System.out.println(result);
result = -result;
// el resultado es ahora -1
System.out.println(result);
boolean success = false;
// false
System.out.println(success);
// true
System.out.println(!success);
}
}
Los operadores de incremento/decremento pueden aplicarse antes del (prefijo) o despus del
(posfijo) operador. En el cdigo result++; y ++result; ambos terminarn en que result se
incrementa en uno. La nica diferencia es que la versin prefija
class PrePostDemo {
public static void main(String[] args){
int i = 3;
i++;
// imprime 4
System.out.println(i);
++i;
// imprime 5
System.out.println(i);
// imprime 6
System.out.println(++i);
// imprime 6
System.out.println(i++);
// imprime 7
System.out.println(i);
}
}
La mayora de estos operadores probablemente se ver familiar tambin. Tenga en mente que
debe utilizar "==", no "=", cuando se prueba si dos valores primitivos son iguales.
==
!=
>
>=
<
<=
igual
no es
mayor
mayor
menor
menor
a
igual a
que
o igual que
que
o igual que
class ComparisonDemo {
public static void main(String[] args){
int value1 = 1;
int value2 = 2;
if(value1 == value2)
System.out.println("value1 == value2");
if(value1 != value2)
System.out.println("value1 != value2");
if(value1 > value2)
System.out.println("value1 > value2");
if(value1 < value2)
System.out.println("value1 < value2");
if(value1 <= value2)
System.out.println("value1 <= value2");
}
}
Salida:
value1 != value2
value1 < value2
value1 <= value2
&& Condicional-AND
|| Condicional-OR
El siguiente programa, ConditionalDemo1, prueba estos operadores:
class ConditionalDemo1 {
public static void main(String[] args){
int value1 = 1;
int value2 = 2;
if((value1 == 1) && (value2 == 2))
System.out.println("value1 is 1 AND value2 is 2");
if((value1 == 1) || (value2 == 1))
System.out.println("value1 is 1 OR value2 is 1");
}
}
Otro operador condicional es ?:, que puede ser considerado como abreviatura para una instruccin
if-then-else.
Este operador es tambin conocido como el operador ternario porque utiliza tres operandos.
En el siguiente ejemplo, este operador debe leerse como:
"Si someCondition es true, asigne el valor de value1 a result. De lo contrario, asigne el
valor de value2 a result."
El siguiente programa prueba el operador ?: en la ConditionalDemo2.
class ConditionalDemo2 {
public static void main(String[] args){
int value1 = 1;
int value2 = 2;
int result;
boolean someCondition = true;
result = someCondition ? value1 : value2;
System.out.println(result);
}
}
Porque someCondition es true, este programa imprime "1" en la pantalla.
Por ejemplo, cuando las expresiones son compactas y sin efectos secundarios (tales como las
asignaciones).
El siguiente programa, InstanceofDemo, define una clase padre (llamado Parent), una interfaz
sencilla (llamado MyInterface) y una clase de hija (llamado Child) que hereda de los padres e
implementa la interfaz.
class InstanceofDemo {
public static void main(String[] args) {
Parent obj1 = new Parent();
Parent obj2 = new Child();
System.out.println("obj1 instanceof Parent: "
+ (obj1 instanceof Parent));
System.out.println("obj1 instanceof Child: "
+ (obj1 instanceof Child));
System.out.println("obj1 instanceof MyInterface: "
+ (obj1 instanceof MyInterface));
System.out.println("obj2 instanceof Parent: "
+ (obj2 instanceof Parent));
System.out.println("obj2 instanceof Child: "
+ (obj2 instanceof Child));
System.out.println("obj2 instanceof MyInterface: "
+ (obj2 instanceof MyInterface));
}
}
class Parent {}
class Child extends Parent implements MyInterface {}
interface MyInterface {}
Salida:
obj1
obj1
obj1
obj2
obj2
obj2
instanceof
instanceof
instanceof
instanceof
instanceof
instanceof
Parent: true
Child: false
MyInterface: false
Parent: true
Child: true
MyInterface: true
Cuando usa el operador instanceof , tenga en cuenta que null no es una instancia de nada.
class BitDemo {
public static void main(String[] args) {
int bitmask = 0x000F;
int val = 0x2222;
// prints "2"
System.out.println(val & bitmask);
}
}
Resumen de operadores
La siguiente referencia rpida resume los operadores soportados por el lenguaje de programacin
Java.
Operadores aritmticos
+
Operador aditivo (tambien usado para la concatenacin de
String)
operador de resta
*
operador de multiplicacin
/
%
operador de Division
operador de resto
Operadores unarios
+
++
-!
Equal to
Not equal to
Greater than
Greater than or equal to
Less than
Less than or equal to
Operadores condicionales
&&
||
?:
Conditional-AND
Conditional-OR
Ternary (forma abreviada de
de la sentencia if-then-else)
int i = 10;
int n = i++%5;
a.
b.
3.
4.
5.
Ejercicios
1.
class ArithmeticDemo {
public static void main (String[] args){
int result = 1 + 2; // result is now 3
System.out.println(result);
result = result - 1; // result is now 2
System.out.println(result);
result = result * 2; // result is now 4
System.out.println(result);
result = result / 2; // result is now 2
System.out.println(result);
result = result + 8; // result is now 10
result = result % 7; // result is now 3
System.out.println(result);
}
}
En el siguiente programa, explique por qu el valor "6" se imprime dos veces seguidas:
class PrePostDemo {
public static void main(String[]
int i = 3;
i++;
System.out.println(i);
//
++i;
System.out.println(i);
//
System.out.println(++i); //
System.out.println(i++); //
System.out.println(i);
//
}
}
args){
"4"
"5"
"6"
"6"
"7"
Expresiones
Una expresin es una construccin compuesta por variables, operadores y las invocaciones
de mtodo, que fueron construidas segn la sintaxis del lenguaje, se evala como un valor nico.
Ya hemos visto ejemplos de expresiones, ilustrados en negrita abajo:
int cadence = 0;
anArray[0] = 100;
System.out.println("Element 1 at index 0: " + anArray[0]);
int result = 1 + 2; // result is now 3
if (value1 == value2)
System.out.println("value1 == value2");
El tipo de datos del valor devuelto por una expresin depende de los elementos utilizados en
la expresin.
La expresin cadence = 0 devuelve un int porque el operador de asignacin devuelve un valor
del mismo tipo de datos que el de su operador de la izquierda; en este caso, cadence es un int.
Como se puede ver en las otras expresiones, una expresin puede devolver otros tipos de valores,
tales como boolean o String.
El lenguaje de programacin Java permite construir expresiones compuestas de varias expresiones
ms pequeas, siempre y cuando el tipo de datos requerido por una parte de la expresin coincide
con el tipo de datos del otro. Aqu hay un ejemplo de una expresin compuesta:
1 * 2 * 3
En este caso particular, el orden en el cual se evala la expresin es importante porque el resultado
de la multiplicacin es independiente del orden; el resultado es siempre el mismo, no importa en qu
orden se aplican las multiplicaciones. Sin embargo, esto no es cierto de todas las expresiones. Por
ejemplo, la siguiente expresin da resultados diferentes, dependiendo de si se realiza la adicin o la
operacin de divisin primero:
x + y / 100
// ambiguo
Puede especificar exactamente cmo una expresin sern evaluadas utilizando parntesis: (y). Por
ejemplo, para hacer la anterior expresin inequvoca, puede escribir lo siguiente:
(x + y) / 100
// no ambiguo, recomendado
Si usted no indica explcitamente el orden para las operaciones a realizar, el orden es determinado
por la precedencia asignada a los operadores en el uso dentro de la expresin. Los operadores que
tienen una mayor prioridad consiguen ser evaluados primero. Por ejemplo, el operador divisin tiene
una mayor prioridad que el operador de suma. Por lo tanto, los siguientes dos comandos son
equivalentes:
x + y / 100
x + (y / 100) // no ambiguo, recomendado
Al escribir expresiones compuestas, debe ser explcito e indicar entre parntesis que los operadores
deben ser evaluados primero. Esta prctica hace ms fcil leer y mantener el cdigo.
Instrucciones o sentencias
Las instrucciones son ms o menos equivalentes a las oraciones en lenguas naturales.
Los siguientes tipos de expresiones se pueden realizar en una instruccin por la expresin de un
punto y coma (terminacin;).
Expresiones de asignacin
Cualquier uso de ++ o -Invocaciones de mtodo
Expresiones de creacin de objeto
Tales instrucciones son llamadas instrucciones o sentencias de expresin. Estos son algunos
ejemplos de instrucciones de expresin.
// instruccin de asignacin
aValue = 8933.234;
// instruccin de incremento
aValue++;
// instruccin de invocacin de mtodo
System.out.println("Hello World!");
// instruccin de creacin de objeto
Bicycle myBike = new Bicycle();
Adems de las instrucciones de expresin, existen otros dos tipos de instrucciones:
1.
2.
declaracin de instrucciones e
instrucciones de control de flujo.
Una declaracin declara una variable. Ya has visto muchos ejemplos de instrucciones de
declaracin:
// instruccin de declaracin
double aValue = 8933.234;
Finalmente, las instrucciones o sentencias de control de flujo regulan el orden en que se
ejecutan las instrucciones.
Bloques
class BlockDemo {
public static void main(String[] args) {
Los operadores pueden utilizarse en la construccin de ___, que computan los valores.
Las expresiones son los componentes bsicos de ___.
Las instrucciones pueden agruparse en ___.
El siguiente fragmento de cdigo es un ejemplo de una expresin ___.
5. 1 * 2 * 3
6. Las instrucciones son ms o menos equivalentes a las oraciones en lenguas naturales, pero
en lugar de acabar con un punto, una instruccin termina con un ___.
7. Un bloque es un grupo de cero o ms instrucciones entre ___ y puede ser utilizado en
cualquier lugar que se permite una sola sentencia.
Ejercicios
Identifique los siguientes tipos de instrucciones de expresin:
aValue = 8933.234;
aValue++;
System.out.println("Hello World!");
Bicycle myBike = new Bicycle();
if-then
if-then-else
switch
Instrucciones de bucle:
for
while
do-while
Instrucciones de ramificacin:
break
continue
return
Le dice a su programa que ejecute una determinada seccin de cdigo slo si una
determinada prueba se evala como true.
Por ejemplo, la clase Bicycle podra permitir a los frenos disminuir la velocidad de la bicicleta
solamente si la bicicleta ya est en marcha. Una posible implementacin del mtodo applyBrakes
podra ser como sigue:
void applyBrakes() {
// la clusula "if": la bicicleta debe estar en movimiento
if (isMoving){
// la clusula "then": disminuir la velocidad actual
currentSpeed--;
}
}
Si esta prueba se evala como false (es decir, que la bicicleta no est en movimiento), el control
salta hasta el final de la instruccin if-then.
Adems, la apertura y cierre de llaves son opcionales, siempre que la clusula "then"
contenga solamente una instruccin:
void applyBrakes() {
// lo mismo que el anterior, pero sin llaves
if (isMoving)
currentSpeed--;
}
Decidir cundo omitir las llaves es una cuestin de gusto personal. Omitirlos puede hacer el cdigo
ms frgil. Si una segunda instruccin ms tarde se aade a la clusula "then", un error comn sera
olvidar aadir las llaves recin requeridas. El compilador no puede detectar este tipo de error;
slo obtendr resultados equivocados.
La instruccin if-then-else
Puedes usar una instruccin if-then-else en el mtodo applyBrakes para tomar medidas si
se aplican los frenos cuando la bicicleta no est en movimiento. En este caso, la accin es
simplemente imprimir un mensaje de error indicando que ya se ha detenido la bicicleta.
void applyBrakes() {
if (isMoving) {
currentSpeed--;
} else {
System.err.println("The bicycle has already stopped!");
}
}
El siguiente programa, IfElseDemo, asigna una calificacin basada en el valor de una prueba: una
A para una calificacin de 90% o superior, una B por una puntuacin de 80% o superior y as
sucesivamente.
class IfElseDemo {
public static void main(String[] args) {
int testscore = 76;
char grade;
if (testscore >= 90) {
grade = 'A';
} else if (testscore >= 80)
grade = 'B';
} else if (testscore >= 70)
grade = 'C';
} else if (testscore >= 60)
grade = 'D';
} else {
grade = 'F';
}
System.out.println("Grade =
{
{
{
" + grade);
}
}
La salida del programa es:
Grade = C
Usted puede haber notado que el valor de testscore puede satisfacer ms de una expresin en
la declaracin compuesta: 76 >= 70 y 76 >= 60. Sin embargo, una vez que se satisface una
condicin, se ejecutan las instrucciones apropiadas (grade = 'C';) y no se evalan las
condiciones restantes.
La instruccin switch
A diferencia de las instrucciones if-then e if-then-else,
Tambin funciona con tipos enumerados (discutido en Tipos Enum), la clase String y algunas
clases especiales que contienen ciertos tipos primitivos: Character, Byte, Short e Integer
(discutido en nmeros y cadenas).
La sentencia break lo lleva a la siguiente sentencia ejecutable fuera del bloque en el que se ubica.
El ejemplo de cdigo siguiente, SwitchDemo, declara un int llamado month cuyo valor
representa un mes. El cdigo muestra el nombre del mes, basndose en el valor del month,
mediante la instruccin switch.
= "January";
= "February";
= "March";
= "April";
= "May";
= "June";
= "July";
= "August";
= "September";
= "October";
Una instruccin en el bloque del switch puede etiquetarse con una o ms etiquetas de case o
default.
La instruccin switch evala la expresin, luego ejecuta todas las instrucciones que le
siguen a la correspondiente etiqueta case.
int month = 8;
if (month == 1) {
System.out.println("January");
} else if (month == 2) {
System.out.println("February");
}
... // y asi
Decidir si utilizar la instruccin if-then-else o una instruccin switch se basa en la legibilidad
y la expresin que est probando la instruccin.
El Flujo de control contina con la primera instruccin que sigue en el bloque switch. Las
instrucciones de break son necesarias porque sin ellas, las instrucciones dentro del bloque
switch fracasan: todas las instrucciones despus de la correspondiente etiqueta del case son
ejecutadas en secuencia, independientemente de la expresin de etiquetas posteriores case, hasta
que se encuentre una instruccin break.
El programa SwitchDemoFallThrough muestra las instrucciones en un bloque switch que
fracasan. El programa muestra el mes correspondiente al nmero entero month y los meses que
siguen en el ao:
java.util.ArrayList<String> futureMonths =
new java.util.ArrayList<String>();
int month = 8;
switch (month) {
case 1: futureMonths.add("January");
case 2: futureMonths.add("February");
case 3: futureMonths.add("March");
case 4: futureMonths.add("April");
case 5: futureMonths.add("May");
case 6: futureMonths.add("June");
case 7: futureMonths.add("July");
case 8: futureMonths.add("August");
case 9: futureMonths.add("September");
case 10: futureMonths.add("October");
case 11: futureMonths.add("November");
case 12: futureMonths.add("December");
break;
default: break;
}
if (futureMonths.isEmpty()) {
System.out.println("Invalid month number");
} else {
for (String monthName : futureMonths) {
System.out.println(monthName);
}
}
}
}
Esta es la salida del cdigo:
August
September
October
November
December
Tcnicamente, el break final no es necesario porque el flujo cae fuera de la declaracin switch.
Es recomendable utilizar un break para que modificar el cdigo sea ms fcil y menos propenso a
errores.
SwitchDemo2, el siguiente ejemplo de cdigo muestra cmo una declaracin puede tener
varias etiquetas de case.
El ejemplo de cdigo calcula el nmero de das en un mes determinado:
class SwitchDemo2 {
public static void main(String[] args) {
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12:
numDays = 31;
break;
case 4: case 6:
case 9: case 11:
numDays = 30;
break;
case 2:
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
System.out.println("Number of Days = "
+ numDays);
}
}
Esta es la salida del cdigo:
Number of Days = 29
break;
case "february":
monthNumber =
break;
case "march":
monthNumber =
break;
case "april":
monthNumber =
break;
case "may":
monthNumber =
break;
case "june":
monthNumber =
break;
case "july":
monthNumber =
break;
case "august":
monthNumber =
break;
case "september":
monthNumber =
break;
case "october":
monthNumber =
break;
case "november":
monthNumber =
break;
case "december":
monthNumber =
break;
default:
monthNumber =
break;
2;
3;
4;
5;
6;
7;
8;
9;
10;
11;
12;
0;
}
return monthNumber;
}
public static void main(String[] args) {
String month = "August";
int returnedMonthNumber =
StringSwitchDemo.getMonthNumber(month);
if (returnedMonthNumber == 0) {
System.out.println("Invalid month");
} else {
System.out.println(returnedMonthNumber);
}
}
}
La salida de este cdigo es 8.
La String en la expresin switch se compara con las expresiones asociadas con la etiqueta de
cada case como si se utilizara el mtodo String.equals. A fin de que el ejemplo
while (expresin) {
instruccin(es)
}
Se logra mediante la instruccin while imprimir los valores del 1 al 10 como en el siguiente
programa WhileDemo:
class WhileDemo {
public static void main(String[] args){
int count = 1;
while (count < 11) {
System.out.println("Count is: " + count);
count++;
}
}
}
Puede implementar un bucle infinito mediante la instruccin while como sigue:
while (true){
// aqui va tu codigo
}
El lenguaje de programacin Java tambin proporciona una instruccin do-while, que puede
expresarse de la siguiente manera:
do {
instruccin(es) // las instrucciones se ejecutan al menos una vez
} while (expresin);
class DoWhileDemo {
public static void main(String[] args){
int count = 1;
do {
System.out.println("Count is: " + count);
count++;
} while (count < 11);
}
}
La instruccin for
La instruccin cclica for proporciona una forma compacta para iterar sobre un
rango de valores.
Los programadores a menudo se refieren a l como el "for loop" debido a la forma en la cual el
bucle se repite hasta que se satisface una condicin particular.
La forma general de la instruccin for puede expresarse de la siguiente manera:
El siguiente programa, ForDemo, utiliza la forma general de la instruccin for para imprimir los
nmeros del 1 al 10 a la salida estndar:
class ForDemo {
public static void main(String[] args){
for(int i = 1; i < 11; i++){
System.out.println("Count is: " + i);
}
}
}
La salida de este programa es:
Count is: 1
Count
Count
Count
Count
Count
Count
Count
Count
Count
is:
is:
is:
is:
is:
is:
is:
is:
is:
2
3
4
5
6
7
8
9
10
Los nombres i, j y k se utilizan para el control de los bucles for; declarndolos dentro de
la expresin de inicializacin limita su vida til y reduce errores.
Las tres expresiones del bucle for son opcionales; se puede crear un bucle infinito de la
siguiente manera:
// loop infinito
for ( ; ; ) {
// your code goes here
}
La instruccin for tambin tiene otra forma diseada por iteracin a travs de colecciones y
arreglos de esta forma se refiere a veces como
Instruccin for mejorado y puede ser utilizada para hacer los bucles ms compactos y
fciles de leer.
class EnhancedForDemo {
public static void main(String[] args){
int[] numbers =
{1,2,3,4,5,6,7,8,9,10};
for (int item : numbers) {
System.out.println("Count is: " + item);
}
}
}
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
is:
is:
is:
is:
is:
is:
is:
is:
is:
is:
1
2
3
4
5
6
7
8
9
10
Se recomienda utilizar este forma de instruccin for en vez de la forma general siempre
que sea posible.
Instrucciones de ramificacin
La instruccin break
Viste la forma sin etiqueta en la discusin anterior de la instruccin switch. Tambin puede utilizar
una etiqueta break para terminar un bucle for, while, o do-while, como se muestra en el
siguiente programa BreakDemo:
class BreakDemo {
public static void main(String[] args) {
int[] arrayOfInts =
{ 32, 87, 3, 589,
12, 1076, 2000,
8, 622, 127 };
int searchfor = 12;
int i;
boolean foundIt = false;
for (i = 0; i < arrayOfInts.length; i++) {
if (arrayOfInts[i] == searchfor) {
foundIt = true;
break;
}
}
if (foundIt) {
System.out.println("Found " + searchfor + " at index " +
i);
} else {
System.out.println(searchfor + " not in the array");
}
}
}
Found 12 at index 4
Una instruccin break sin etiqueta termina las instrucciones switch, for, while, o dowhile mas internas.
Un break con etiqueta termina una instruccin externa.
Cuando el valor se encuentra, un break con etiqueta finaliza el bucle for externo
(etiquetado como " search "):
class BreakWithLabelDemo {
public static void main(String[] args) {
int[][] arrayOfInts = {
{ 32, 87, 3, 589 },
{ 12, 1076, 2000, 8 },
{ 622, 127, 77, 955 }
};
int searchfor = 12;
int i;
int j = 0;
boolean foundIt = false;
search:
for (i = 0; i < arrayOfInts.length; i++) {
for (j = 0; j < arrayOfInts[i].length;
j++) {
if (arrayOfInts[i][j] == searchfor) {
foundIt = true;
break search;
}
}
}
if (foundIt) {
System.out.println("Found " + searchfor + " at " + i + ",
" + j);
} else {
System.out.println(searchfor + " not in the array");
}
}
}
sta es la salida del programa.
Found 12 at 1, 0
La instruccin continue
La forma sin etiqueta salta al final del cuerpo del bucle ms interno y evala la expresin boolean
que controla el bucle.
El siguiente programa, ContinueDemo, pasa a travs de una String, contando las ocurrencias
de la letra "p". Si el carcter actual no es una p, la declaracin continue omite el resto del bucle y
procede al siguiente carcter. Si es una "p", el programa incrementa el contador de letra.
class ContinueDemo {
public static void main(String[] args) {
String searchMe = "peter piper picked a " + "peck of pickled
peppers";
int max = searchMe.length();
int numPs = 0;
for (int i = 0; i < max; i++) {
// interesado solo en p's
if (searchMe.charAt(i) != 'p')
continue;
// procesa p's
numPs++;
}
System.out.println("Found " + numPs + " p's in the string.");
}
}
Aqu est la salida de este programa:
class ContinueWithLabelDemo {
public static void main(String[] args) {
String searchMe = "Look for a substring in me";
String substring = "sub";
boolean foundIt = false;
int max = searchMe.length() substring.length();
test:
for (int i = 0; i <= max; i++) {
int n = substring.length();
int j = i;
int k = 0;
while (n-- != 0) {
if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue test;
}
}
foundIt = true;
break test;
}
System.out.println(foundIt ? "Found it" : "Didn't find it");
}
}
Aqu est la salida de este programa.
Found it
La instruccin return
La ltima de las instrucciones de ramificacin es la instruccin return.
La instruccin return sale por el mtodo actual, y el flujo de control regresa a donde se
invoc el mtodo.
La instruccin return tiene dos formas:
Para devolver un valor, simplemente ponga el valor (o una expresin que calcula el valor)
despus de la palabra clave return.
return ++count;
El tipo de datos del valor devuelto debe coincidir con el tipo devuelto por el mtodo declarado.
Cuando un mtodo es declarado void, este utiliza la forma de return que no devuelve un valor.
return;
La leccin de clases y objetos cubrir todo lo que necesitas saber sobre mtodos de escritura.
Ejercicios
1.
if (aNumber >= 0)
if (aNumber == 0)
System.out.println("first string");
else System.out.println("second string");
System.out.println("third string");
a.
b.
c.
d.
Practicas.
Clases
Esta seccin le muestra la anatoma de una clase y cmo declarar campos, mtodos y
constructores.
Objetos
Esta seccin cubre la creacin y uso de objetos. Usted aprender a crear una instancia de un
objeto y, una vez instanciado, cmo se utiliza el operador dot para acceder a las variables de
instancia y mtodos del objeto.
Ms tipos
Esta seccin cubre ms aspectos de las clases que dependen del uso de referencias a objetos y
sobre el operador dot que has aprendido en la seccin anterior: devolver valores desde los
mtodos, la palabra clave this, clase vs. miembros de instancia y control de acceso.
Clases anidadas
Clases anidadas estticas annimas internas, clases, clases locales estn cubiertas. Tambin hay
una discusin sobre cundo utilizar este enfoque.
Tipos de enumeracin
Esta seccin cubre las enumeraciones, clases especializadas que le permiten definir y utilizar
conjuntos de constantes.
Clases
La introduccin a los conceptos de orientacin a objetos en la leccin titulada Conceptos de
programacin orientada a objetos utiliza una clase de bicicleta como ejemplo, con bicicletas de
carreras, bicicletas de montaa y bicicletas tndem como subclases.
Aqu est el cdigo del ejemplo para una posible implementacin de una clase de Bicycle,
para darle una visin general de una declaracin de clase.
Las secciones posteriores de esta leccin retroceden y explican las declaraciones de clase paso a
paso. Por el momento, no se preocupe por los detalles.
Declarar Clases
Has visto clases definidas de la siguiente manera:
class MyClass {
// declaraciones de mtodos,
// campos y constructores
}
Esto es una declaracin de clase.
El cuerpo de la clase (el rea entre las llaves) contiene todo el cdigo que se proporciona para
el ciclo de vida de los objetos creados de la clase:
La declaracin de clase anterior es mnima. Contiene slo aquellos componentes de una declaracin
de clase que se requieren.
Puede proporcionar ms informacin acerca de la clase, como el
nombre de su superclase,
si implementa cualquier interface
3.
4.
5.
La clase Bicycle utiliza las siguientes lneas de cdigo para definir sus campos:
Los campos de Bicycle se denominan cadence, gear y speed y son todos datos de tipo
integer (int).
La palabra clave public identifica estos campos como miembros pblicos, accesibles por
cualquier objeto que pueda acceder a la clase.
Modificadores de acceso
El primer modificador (extremo izquierdo) utilizado le permite controlar qu otras clases tienen
acceso a un campo miembro.
Por el momento, considere slo public y private. Otros modificadores de acceso se discutirn
ms adelante.
En el espritu de encapsulacin, es comn hacer los campos privados. Esto significa que slo se
puede acceder directamente desde la clase Bicycle. Sin embargo, s todava necesitamos
acceso a estos valores:
Tipos
Todas las variables deben tener un tipo.
Puede utilizar los tipos primitivos como int, float, boolean, etc.
puede utilizar los tipos de referencia, tales como cadenas, arreglos u objetos.
Nombres de variables
Todas las variables, ya sean campos, variables locales o parmetros, siguen las mismas reglas de
nomenclatura y convenciones que se cubrieron en la leccin de lenguaje bsico, Variables
Nomenclatura.
En esta leccin, tenga en cuenta de que las mismas reglas de nomenclatura y convenciones se
utilizan en los nombres de mtodos y clases, excepto que
Definir Mtodos
Aqu est un ejemplo tpico de una declaracin de mtodo:
5.
6.
Los modificadores, tipos de retorno y los parmetros sern discutidos ms adelante en esta leccin.
Las excepciones son discutidas en una leccin posterior.
Definicin: Dos de los componentes de una declaracin de mtodo comprenden la firma del
mtodo el nombre del mtodo y los tipos de parmetro.
Nombrando un mtodo
Aunque un nombre de mtodo puede ser cualquier identificador legal, las convenciones de cdigo
restringen los nombres de mtodos. Por Convencin, los nombres de mtodos deben ser un
verbo en minscula o un nombre de varias palabras que comiencen con un verbo en
minsculas, seguido de adjetivos, sustantivos, etc. En los nombres de varias palabras, la
primera letra de cada segunda y siguientes palabras debe escribirse con mayscula. Estos
son algunos ejemplos:
run
runFast
getBackground
getFinalData
compareTo
setX
isEmpty
Tpicamente, un mtodo tiene un nombre nico en su clase. Sin embargo, un mtodo podra
tener el mismo nombre que otros mtodos debido a la sobrecarga de mtodo.
Sobrecarga de mtodos
El lenguaje de programacin Java soporta Mtodos de Sobrecarga y Java puede distinguir entre
los mtodos con diferentes firmas de mtodos. Esto significa que los mtodos dentro de una
clase pueden tener el mismo nombre si tienen listas de parmetros diferentes (hay algunos
requisitos a esto que sern discutidos en la leccin titulada "Interfaces y herencia").
Supongamos que tiene una clase que puede utilizar la caligrafa para dibujar distintos tipos de datos
(cadenas, enteros y as sucesivamente) y que contiene un mtodo para la elaboracin de cada tipo
de datos. Es incmodo usar un nombre nuevo para cada mtodo por ejemplo, drawString,
drawInteger, drawFloaty as sucesivamente. En el lenguaje de programacin Java, usted
puede utilizar el mismo nombre para todos los mtodos de dibujo pero pase una lista de argumentos
diferentes para cada mtodo. Por lo tanto, la clase de dibujo de datos podra declarar cuatro
mtodos denominados draw, cada uno de ellos tiene una lista de parmetros diferentes.
s) {
{
f) {
double f) {
Los mtodos sobrecargados se diferencian por la cantidad y el tipo de los argumentos que se
pasan al mtodo. En el cdigo de muestra, draw(String s) y draw(int i) son mtodos
distintos y nicos porque requieren diferentes tipos de argumentos.
No se puede declarar ms de un mtodo con el mismo nombre y el mismo nmero y tipo de
argumentos, ya que el compilador no puede distinguirlos.
El compilador no considera el tipo de retorno al diferenciar los mtodos, por lo que no puede
declarar dos mtodos con la misma firma, incluso si tienen un tipo de retorno diferente.
Nota: Los Mtodos sobrecargados deben ser usados con moderacin, ya que pueden hacer el
cdigo mucho menos legible.
Una clase contiene constructores que se invocan para crear objetos desde la clase modelo o
plantilla. Las declaraciones de los constructores parecen declaraciones de mtodos excepto
que utilizan el nombre de la clase y no tienen tipo de retorno. Por ejemplo, Bicycle tiene un
constructor:
public Bicycle() {
gear = 1;
cadence = 10;
speed = 0;
}
Bicycle yourBike = new Bicycle(); invoca el constructor sin-argumentos para crear
un nuevo objeto Bicycle llamado yourBike.
Ambos constructores se pueden haber declarado en Bicycle porque tienen listas de argumentos
diferentes. Como con los mtodos, la plataforma Java distingue los constructores sobre la base
de la cantidad de argumentos en la lista y sus tipos. No puedes escribir dos constructores que
tienen el mismo nmero y tipo de argumentos para la misma clase, porque la plataforma no sera
capaz de distinguirlos. Si lo hace, provoca un error en tiempo de compilacin.
No tiene que proporcionar ningun constructor para la clase, pero debe tener cuidado al
hacerlo. El compilador proporciona automticamente un constructor por default sinargumentos, para cualquier clase sin constructores. Este constructor predeterminado llamar
al constructor sin-argumentos de la superclase. En esta situacin, el compilador se quejar si la
superclase no tiene un constructor sin-argumentos por lo que debe comprobar que lo tiene. Si tu
clase no tiene una superclase explcita, entonces tiene una superclase implcita del Object, que
tiene un constructor sin-argumentos
Usted puede utilizar un constructor de la superclase. La clase MountainBike al principio de
esta leccin as lo hizo. Esto se discutir ms adelante, en la leccin de las interfaces y la herencia.
Usted puede utilizar modificadores de acceso en la declaracin de un constructor para
controlar qu otras clases pueden llamar al constructor.
Nota: Si otra clase no puede llamar al constructor de MyClass, no puede crear directamente
objetos MyClass.
Nota: Los parmetros se refieren a la lista de variables en una declaracin de mtodo. Los
argumentos son los valores reales que se pasan cuando se invoca el mtodo. Cuando se
invoca un mtodo, los argumentos utilizados deben coincidir con los parmetros de la
declaracin de tipo y orden.
Tipos de parmetros
Puede utilizar cualquier tipo de dato para un parmetro de un mtodo o un constructor. Esto
incluye tipos de datos primitivos, como doubles, floats, e integers, como viste en el mtodo
computePayment y tipos de datos de referencia, tales como objetos y arreglos.
Aqu hay un ejemplo de un mtodo que acepta un arreglo como argumento. En este ejemplo, el
mtodo crea un objeto nuevo Polygon y lo Inicializa desde un arreglo de objetos Point
(asuma que Point es una clase que representa una coordenada x, y):
Nombres de parmetros
Cuando se declara un parmetro a un mtodo o un constructor, proporcionas un nombre
para ese parmetro. Este nombre se utiliza en el cuerpo del mtodo para referirse al
argumento que se pasa dentro.
El nombre de un parmetro debe ser nico en su mbito de aplicacin. No puede ser el mismo
que el nombre de otro parmetro para el mismo mtodo o constructor, y no puede ser el nombre de
una variable local dentro del mtodo o constructor.
Un parmetro puede tener el mismo nombre que uno de los campos de la clase. Si este es el
caso, se dice del parmetro que sombrea al campo. Sombrear los campos puede dificultar leer su
cdigo y convencionalmente se utiliza solo dentro de los constructores y mtodos que fijan un
campo particular. Por ejemplo, considere la siguiente clase Circle y su mtodo setOrigin :
utilizar un nombre cualificado. Esto ser discutido ms adelante en esta leccin en la seccin
titulada "Usando la palabra clave this.
Dentro del mtodo, circle inicialmente se refiere a myCircle. El mtodo cambia las
coordenadas x y y del objeto de esas referencias circle (es decir, myCircle) por 23 y 56,
respectivamente. Estos cambios se mantendrn cuando el mtodo devuelve. Entonces circle es
asignado a una referencia a un objeto nuevo Circle con x = y = 0. Esta reasignacin no tiene
ninguna permanencia, sin embargo, debido a que la referencia fue pasada por su valor y no se
puede cambiar. Dentro del mtodo, el objeto apuntado por circle ha cambiado, pero, cuando el
mtodo devuelve, myCircle todava hace referencia al mismo objeto Circle como antes de que
se llamar al mtodo.
Objetos
Un tpico programa Java crea muchos objetos, que como ya sabes, interactan mediante la
invocacin de mtodos. A travs de estas interacciones del objeto, un programa puede realizar
diversas tareas, como implementar un GUI, ejecutar una animacin, o enviar y recibir informacin
sobre una red. Una vez que un objeto ha completado el trabajo para el cual fue creado, sus
recursos son reciclados para su uso por otros objetos.
Aqu est un pequeo programa, llamado CreateObjectDemo, que crea tres objetos: un objeto
Point y dos objetos Rectangle. Usted necesitar los tres archivos fuente completos para
compilar este programa.
23
94
40
72
Las siguientes tres secciones utilizan el ejemplo anterior para describir el ciclo de vida de un objeto
dentro de un programa. De ellos, aprender cmo escribir cdigo que crea y utiliza los objetos en
sus propios programas. Tambin aprenders cmo el sistema limpia despus un objeto cuando su
vida ha terminado.
Creacin de objetos
Como ya sabes, una clase proporciona el plan de accin para los objetos; crea un objeto de
una clase. Cada una de las siguientes instrucciones extradas del programa CreateObjectDemo
crea un objeto y lo asigna a una variable:
Instruccin: el cdigo en negrita son todas las declaraciones de variables que asocian un
nombre de variable a un tipo de objeto.
Instanciacin o creacin de instancias: la palabra clave new es un operador de Java que
crea el objeto.
Inicializacin: el nuevo operador es seguido por una llamada a un constructor, que
inicializa el objeto nuevo.
type name;
Esto notifica al compilador que usar nombre para referirse a datos cuyo tipo es de un tipo de valor.
Con una variable primitiva, esta instruccin tambin reserva la cantidad adecuada de memoria
para la variable.
Tambin puede declarar una variable de referencia en su propia lnea. Por ejemplo:
Point originOne;
Si se declara originOne as, su valor ser indeterminado hasta que un objeto es creado y
asignado a l. Simplemente declarar una variable de referencia no crea un objeto. Por eso,
tienes que utilizar el operador new, tal como se describe en la seccin siguiente. Debe asignar
un objeto a originOne antes de usarlo en su cdigo. De lo contrario, obtendr un error del
compilador.
Una variable en este estado, que actualmente hace referencia a ningn objeto, se puede ilustrar
como sigue (nombre de la variable, originOne, adems de una referencia apuntando a la nada):
Nota: La frase "crear instancias de una clase" significa lo mismo que "creando un objeto". Cuando
crea un objeto, crear una "instancia" de una clase, por lo tanto es el "ejemplar" de una clase.
El operador new requiere un solo argumento postfijo: una llamada a un constructor. El nombre
del constructor proporciona el nombre de la clase a instanciar.
El operador new devuelve una referencia al objeto creado. Esta referencia es asignada a una
variable del tipo adecuado, como:
Inicializar un objeto
Aqu est el cdigo para la clase Point:
Cada constructor permite ofrecer valores iniciales para el origen del rectngulo, anchura y altura,
usando ambos tipos primitivos y de referencia. Si una clase tiene varios constructores, deben
tener diferentes firmas. El compilador de Java distingue los constructores basados en el
nmero y el tipo de los argumentos. Cuando el compilador de Java se encuentra con el siguiente
cdigo, sabe llamar al constructor de la clase Rectangle que es el que requiere un argumento
point seguido de dos argumentos enteros:
La siguiente lnea de cdigo llama al constructor de Rectangle que requiere dos argumentos
enteros, que proporcionan los valores iniciales para la anchura y altura. Si revisas el cdigo en
el constructor, ver que crea un nuevo objeto point cuyo x y valores y se inicializan con 0:
Uso de objetos
Una vez que haya creado un objeto, probablemente quieras usarlo para algo. Puede necesitar
usar el valor de uno de sus campos, cambiar uno de sus campos o llamar a uno de sus
mtodos para realizar una accin.
Usted puede utilizar un nombre simple para un campo dentro de su propia clase. Por ejemplo,
podemos agregar una instruccin dentro de la clase Rectangle que imprime la width (ancho) y la
height (altura):
objectReference.fieldName
Por ejemplo, el cdigo de la clase CreateObjectDemo est fuera del cdigo de la clase
Rectangle. As que para hacer referencia a los campos de origin, width, y height
dentro del objeto Rectangle llamado rectOne, la clase CreateObjectDemo debe usar los
nombres rectOne.origin, rectOne.widthy rectOne.height, respectivamente. El
programa utiliza dos de estos nombres para mostrar la width y la height de rectOne:
objectReference.methodName(argumentList);
o:
objectReference.methodName();
La clase rectngulo tiene dos mtodos: getArea() para calcular el rea del rectngulo y
move() para cambiar el origen del rectngulo. Aqu est el cdigo CreateObjectDemo que
invoca estos dos mtodos:
El recolector de basura
Algunos lenguajes orientados a objetos requieren que usted haga un seguimiento de todos los
objetos que crea y que explcitamente los destruya cuando ya no son necesarios. La Gestin de
memoria manual o explcita es tedioso y propenso a errores. La plataforma Java te permite crear
tantos objetos como t quieras (limitado, por supuesto, por lo que pueda manejar tu sistema) y no
debes preocuparte por destruirlos. El entorno de ejecucin de Java (JRE) elimina objetos
cuando determina que ya no se estn utilizando. Este proceso se denomina recoleccin de
basura.
Un objeto es elegible para la recoleccin de basura cuando no existen ms referencias a ese
objeto. Las referencias que se llevan a cabo en una variable generalmente se cayeron cuando la
variable sale del mbito. O, usted puede tirar explcitamente una referencia a un objeto
estableciendo la variable en el valor especial null. Recuerde que un programa puede tener
mltiples referencias al mismo objeto; todas las referencias a un objeto deben dejarse caer antes
de que el objeto sea elegible para la recoleccin de basura.
El entorno de ejecucin Java tiene un recolector de basura que peridicamente libera la
memoria utilizada por los objetos a los que ya no se hace referencia. El recolector de basura
hace su trabajo automticamente cuando determina que es el momento adecuado.
Ms sobre clases
Esta seccin cubre ms aspectos de las clases que dependen del uso de referencias a objetos y el
operador dot que has aprendido en las secciones anteriores sobre los objetos:
return;
Si usted intenta devolver un valor de un mtodo que es declarado void, obtendr un error del
compilador.
Cualquier mtodo que no sea declarado void debe contener una instruccin return con un valor
de retorno correspondiente, as:
return returnValue;
El tipo de dato del valor devuelto debe coincidir con el tipo de retorno declarado del mtodo;
No se puede devolver un valor entero de un mtodo declarado para devolver un valor booleano.
El mtodo getArea() de la clase Rectangle que se discuti en las secciones sobre objetos
devuelve un entero:
Nota: Tambin puede utilizar nombres de interfaces como tipos de retorno. En este caso, el
objeto devuelto debe implementar la interfaz especificada.
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
Esta clase contiene un conjunto de constructores. Cada constructor inicializa todas o algunas de
las variables miembro del rectngulo. Los constructores proporcionan un valor por defecto
para cualquier variable miembro cuyo valor inicial no es proporcionado por un argumento.
Por ejemplo, el constructor sin-argumentos crea un Rectangle de 1 x 1 en las coordenadas 0,0. El
constructor de dos-argumentos llama al constructor de cuatro-argumentos, pasando el ancho y alto
pero siempre utilizando las coordenadas 0,0. Como antes, el compilador determina qu constructor
llamar, basado en el nmero y el tipo de argumentos.
Si se presenta, la invocacin de un constructor debe ser la primera lnea en el constructor.
Puede declarar una clase con el modificador public, en el caso de que la clase sea visible
para todas las clases de cualquier parte. Si una clase no tiene ningn modificador (es por
defecto, y se conoce como paquete privado), que es visible solamente dentro de su propio
paquete (los paquetes son nombres de grupos de clases relacionadas usted aprender acerca
de ellos en una leccin posterior.)
En el nivel de miembro, tambin puede utilizar el modificador public o sin modificadores
(paquete privado) as como con clases de nivel superior y con el mismo significado. Para los
miembros, hay dos modificadores de acceso adicional: private y protected. El modificador
private especifica que slo se puede acceder al miembro de su propia clase. El modificador
protected especfica que el miembro slo puede accederse desde dentro de su propio
paquete (como con paquete privado) y, adems, por una subclase de la clase en otro paquete.
La siguiente tabla muestra el acceso a los miembros permitidos por cada modificador.
Niveles de acceso
Modificador
public
protected
sin modificador Y
private
La primera columna de datos indica si la clase tiene acceso a los miembros definidos por el nivel de
acceso. Como puedes ver, una clase siempre tiene acceso a sus propios miembros. La segunda
public
protected
sin modificadores Y
private
Use el nivel de acceso ms restrictivo que tenga sentido para un determinado miembro.
Use private a menos que tenga una buena razn para no hacerlo.
Evite los campos public excepto para las constantes. (Muchos de los ejemplos en el
tutorial usan los campos pblicos. Esto puede ayudar a ilustrar algunos puntos de forma
concisa, pero no se recomienda para el cdigo de produccin.) Los campos pblicos
tienden a vincularte a una implementacin en particular y limitar la flexibilidad de modificar
su cdigo.
Variables de clase
Cuando se crea una serie de objetos desde la misma clase plantilla, cada uno tiene sus
propias copias diferentes de las variables de instancia. En el caso de la clase de Bicycle, las
variables de instancia son cadence, gear y speed. Cada objeto Bicycle tiene sus propios
valores de estas variables, almacenadas en localizaciones de memoria diferentes.
A veces, quieres tener variables que son comunes a todos los objetos. Esto se logra con el
modificador static. Los Campos que tienen el modificador static en su declaracin se
denominan campos estticos o variables de clase. Estn asociados con la clase, en lugar de
cualquier objeto. Cada instancia de la clase comparte una variable de clase, que se encuentra
en una posicin fija en la memoria. Cualquier objeto puede cambiar el valor de una variable
de clase, pero tambin se pueden manipular variables de clase sin crear una instancia de la
clase.
Por ejemplo, supongamos que desea crear un nmero de objetos de Bicycle y asignar a cada uno
un nmero de serie, empezando por 1 para el primer objeto. Este nmero de identificacin es nico
para cada objeto y por lo tanto es una variable de instancia. Al mismo tiempo, necesitas un campo
para hacer un seguimiento de cuntos objetos de Bicycle han sido creados para que sepas qu
ID se le asignar al siguiente. Un campo no est relacionado a ningn objeto individual, sino a
la clase como un todo. Para ello es necesario una variable de clase, numberOfBicycles, como
sigue:
Bicycle.numberOfBicycles
Esto pone de manifiesto que son variables de clase.
Nota: Tambin puede hacer referencia a campos estticos con una referencia a un objeto como
myBike.numberOfBicycles
Pero esto es desalentado porque no deja en claro que son variables de clase.
int
int
int
int
cadence;
gear;
speed;
id;
Mtodos de la clase
El lenguaje de programacin Java soporta mtodos estticos, as como con las variables estticas.
Los mtodos estticos, que tienen el modificador static en sus declaraciones, deben ser
invocados con el nombre de clase, sin la necesidad de crear una instancia de la clase, como
en
ClassName.methodName(args)
Nota: Tambin puede hacer referencia a mtodos estticos con referencia a un objeto como
instanceName.methodName(args)
Pero esto es desalentado porque no deja en claro que son mtodos de la clase.
Un uso comn de mtodos estticos es para acceder a los campos estticos. Por ejemplo,
nosotros podramos aadir un mtodo esttico a la clase de Bicycle para acceder al campo
esttico de numberOfBicycles :
Constantes
El modificador static, en combinacin con el modificador final, tambin se utiliza para definir
constantes. El modificador final indica que no puede cambiar el valor de este campo.
Por ejemplo, la siguiente declaracin de variable define una constante llamada PI, cuyo valor es
una aproximacin de pi (la proporcin de la circunferencia de un crculo y su dimetro):
Nota: Si un tipo primitivo o una cadena se define como una constante y el valor es conocido en
tiempo de compilacin, el compilador sustituye el nombre de la constante en todas partes en el
cdigo con su valor. Esto se llama una constante de tiempo de compilacin. Si cambia el valor de la
constante en el mundo exterior (por ejemplo, si se est legislado que pi en realidad debera ser
3.975), tendr que volver a compilar las clases que utilizan esta constante para obtener el valor
actual.
La clase de Bicycle
Despus de todas las modificaciones realizadas en esta seccin, la clase Bicycle es ahora:
Inicializar campos
Como has visto, a menudo se puede proporcionar un valor inicial para un campo en su declaracin:
static {
// cualquier cdigo que se necesita para la inicializacin va aqu
}
Una clase puede tener cualquier nmero de bloques de inicializacin esttica, y pueden aparecer en
cualquier parte del cuerpo de la clase. El sistema runtime garantiza que la inicializacin esttica de
los bloques sean llamados en el orden en que aparecen en el cdigo fuente.
Hay una alternativa a los bloques estticos, se puede escribir un mtodo esttico privado:
class Whatever {
public static varType myVar = initializeClassVariable();
private static varType initializeClassVariable() {
// la inicializacin del cdigo va aqui
}
}
La ventaja de los mtodos estticos privados es que pueden ser reutilizados ms tarde si
tienes que reiniciar la variable de clase.
{
// cualquier cdigo que se necesita para la inicializacin va aqu
}
El compilador de Java copia bloques de inicializacin en cada constructor. Por lo tanto, este
enfoque puede utilizarse para compartir un bloque de cdigo entre varios constructores.
Un mtodo final no puede invalidarse en una subclase. Esto se discute en la leccin sobre
interfaces y herencia. Aqu est un ejemplo del uso de un mtodo final para inicializar una variable
de instancia:
class Whatever {
private varType myVar = initializeInstanceVariable();
protected final varType initializeInstanceVariable() {
// la inicializacin del cdigo va aqui
}
}
nueva instancia de una clase utilizan el nombre de la clase y lucen como mtodos sin un tipo de
retorno.
Controlas el acceso a clases y miembros de la misma manera: mediante el uso de un modificador de
acceso como el public en su declaracin.
Especifica una variable de clase o un mtodo de clase mediante el uso de la palabra clave static
en la declaracin del miembro. Un miembro que no est declarado como static implcitamente es
un miembro de instancia. Las variables de clase son compartidas por todas las instancias de una
clase y pueden accederse mediante el nombre de clase, as como una referencia a la instancia. Las
instancias de una clase obtienen su propia copia de cada variable de instancia, a las cuales debe
accederse a travs de una referencia a la instancia.
Se crea un objeto de una clase utilizando el operador new y un constructor. El nuevo operador
devuelve una referencia al objeto que fue creado. Puede asignar la referencia a una variable o
usarlo directamente.
Las variables y mtodos de instancia que son accesibles al cdigo fuera de la clase que se declaran
pueden ser referidos mediante el uso de un nombre cualificado. El nombre de una variable de
instancia se ve as:
objectReference.variableName
El nombre completo de un mtodo se ve as:
objectReference.methodName(argumentList)
o:
objectReference.methodName()
El recolector de basura limpia automticamente los objetos no utilizados. Un objeto no es utilizado si
el programa no mantiene ms referencias a l. Usted puede eliminar explcitamente una referencia
estableciendo la variable que contiene la referencia a null.
Ejercicios
1.
Escribir una clase cuyas instancias representan una sola carta de una baraja de cartas.
Jugar a las cartas tienen dos caractersticas distintivas: rango y palo. Asegrese de
mantener su solucin ya que se le pedir reescribirla en Enum Types.
Sugerencia:
Puede utilizar la instruccin assert para comprobar sus asignaciones. Escribe:
2.
3.
Escribir una clase cuyas instancias representan una baraja completa de cartas. Tambin
debe mantener esta solucin.
Escriba un pequeo programa para poner a prueba tus clases baraja y carta. El programa
puede ser tan simple como crear una baraja de cartas y que muestre sus cartas.
El cdigo siguiente crea una matriz y un objeto string. Cuntas referencias a esos objetos
existen despus de que el cdigo se ejecuta? Cualquier objeto es elegible para el
recolector de basura?
...
String[] students = new String[10];
String studentName = "Peter Parker";
students[0] = studentName;
studentName = null;
...
3.
Ejercicios
1.
2.
Clases anidadas
El lenguaje de programacin Java permite definir una clase dentro de otra clase. Dicha clase se
llama una clase anidada (nested class) y se muestra aqu:
class OuterClass {
...
class NestedClass {
...
}
}
Terminologa: Las clases anidadas se dividen en dos categoras: esttica y no esttica. Las clases
anidadas que se declaran static se denominan clases anidadas estticas. Clases anidadas no
estticas se denominan clases internas (inner classes).
class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
}
Una clase anidada es un miembro de la clase a la que pertenece o que la envuelve. Las clases
anidadas no estticas (clases internas) tienen acceso a otros miembros de la clase a la que
pertenecen, aunque sean declaradas privadas. Las clases anidadas estticas no tienen
acceso a otros miembros de la clase a la que pertenecen. Como miembro de la OuterClass,
una clase anidada puede declararse private, public, protected o package private.
(Recordemos que las clases externas slo pueden ser declaradas public o package private.)
Es una forma de agrupar lgicamente las clases que se utilizan solamente en un solo
lugar: Si una clase es til slo a otra clase, entonces es lgico incrustarla en esa clase y
mantener las dos juntas. La anidacin de tales "Clases ayudantes" hace su paquete ms
gil.
Nota: Una clase anidada esttica interacta con los miembros de la instancia de la clase externa (y
otras clases) justo igual que con cualquier otra clase de nivel superior. En efecto, una clase anidada
esttica su comportamiento es como una clase de nivel superior que se ha anidado en otra clase de
nivel superior para conveniencia del empaquetado.
Las clases anidadas estticas son accedidas usando el nombre de clase a la que pertencece:
OuterClass.StaticNestedClass
Por ejemplo, para crear un objeto de la clase anidada esttica, use esta sintaxis:
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();
Clases internas
Como con mtodos y variables de instancia, una clase interna se asocia con una instancia de la
clase a la que pertenece y tiene acceso directo a los campos y mtodos del objeto. Tambin,
debido a que una clase interna esta asociada a una instancia, no se puede definir a cualquier
miembro esttico por s mismo.
Los objetos que son instancias de una clase interna existen dentro de una instancia de la clase
externa. Considere las siguientes clases:
class OuterClass {
...
class InnerClass {
...
}
}
Una instancia de InnerClass puede existir solamente dentro de una instancia de OuterClass y
tiene acceso directo a los campos y mtodos de su instancia envolvente.
Para crear una instancia de una clase interna, primero debe instanciar la clase externa. Luego,
crea el objeto interno dentro del objeto externo con esta sintaxis:
Sombreado
Si una declaracin de un tipo (por ejemplo, una variable de miembro o un nombre de parmetro) en
un mbito determinado (por ejemplo, una clase interna o una definicin de mtodo) tiene el mismo
nombre que otra declaracin en el mbito al que pertenece, entonces la declaracin sombrea la
declaracin del mbito envolvente. Usted no puede hacer referencia a una declaracin sombreada
solo por su nombre. El ejemplo siguiente, ShadowTest, lo demuestra:
Este ejemplo define tres variables denominadas x: la variable miembro de la clase ShadowTest, la
variable miembro de la clase interna FirstLevel y el parmetro en el mtodo
methodInFirstLevel. La variable x definido como un parmetro del mtodo
methodInFirstLevel sombrea la variable de la clase interna FirstLevel. En consecuencia,
cuando se utiliza la variable x en el mtodo methodInFirstLevel, se refiere al parmetro del
mtodo. Para hacer referencia a la variable miembro de la clase interna FirstLevel, utilice la
palabra clave this para representar el mbito al que pertenece:
System.out.println("this.x = " + this.x);
Se llama a las variables miembro encerradas en mbitos mayores por el nombre de clase a la
que pertenecen. Por ejemplo, la siguiente declaracin accede a la variable miembro de la clase
ShadowTest desde el mtodo methodInFirstLevel:
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
La clase externa DataStructure, que incluye un constructor para crear una instancia
de DataStructure que contiene un arreglo lleno de valores enteros consecutivos (0, 1,
2, 3 y as sucesivamente) y un mtodo que imprime los elementos del arreglo que tienen un
valor de ndice incluido.
La clase interna EvenIterator, que implementa la interfaz
DataStructureIterator, que se extiende de la interfaz de Iterator< Integer>.
Los Iteradores se utilizan para pasar a travs de una estructura de datos y suelen tener
mtodos de prueba para el ltimo elemento, recuperan el elemento actual y pasan al
siguiente elemento.
Un mtodo main que crea una instancia de un objeto DataStructure (ds), luego
invoca al mtodo printEven para imprimir los elementos del arreglo arrayOfInts con
los valores de ndice incluidos.
Integer retValue =
Integer.valueOf(arrayOfInts[nextIndex]);
// obten el siguiente elemento incluido
nextIndex += 2;
return retValue;
}
}
public static void main(String s[]) {
// llene el arreglo con los valores enteros e imprime solo
// los valores de los indices incluidos
DataStructure ds = new DataStructure();
ds.printEven();
}
}
La salida es:
0 2 4 6 8 10 12 14
Tenga en cuenta que la clase EvenIterator se refiere directamente a la variable de instancia
arrayOfInts del objeto DataStructure .
Puede utilizar clases internas para implementar clases auxiliares como se muestra en este ejemplo.
Para manejar los eventos de la interfaz de usuario, debes saber cmo utilizar clases internas,
porque el mecanismo de control de eventos hace uso extensivo de ellos.
Modificadores
Se puede utilizar los mismos modificadores para las clases internas que utilizas para otros miembros
de la clase externa. Por ejemplo, puedes usar los especificadores de acceso private, public
y protected para restringir el acceso a las clases internas, al igual que las usarias para
restringir el acceso a otros miembros de clase.
Clases locales
Las Clases locales son definidos en un bloque, que es un grupo de cero o ms instrucciones entre
llaves. Normalmente encontrar clases locales definidas en el cuerpo de un mtodo.
Esta seccin abarca los siguientes temas:
Puede definir una clase local dentro de cualquier bloque (vase expresiones, declaraciones y los
bloques para obtener ms informacin). Por ejemplo, puede definir una clase local en un cuerpo de
mtodo, un bucle for o una condicin if.
El ejemplo siguiente, LocalClassExample, valida dos nmeros de telfono. Define la clase local
PhoneNumber en el mtodo validatePhoneNumber:
myNumber1.printOriginalNumbers();
if (myNumber1.getNumber() == null)
System.out.println("First number is invalid");
else
System.out.println("First number is " +
myNumber1.getNumber());
if (myNumber2.getNumber() == null)
System.out.println("Second number is invalid");
else
System.out.println("Second number is " +
myNumber2.getNumber());
}
En el ejemplo se valida un nmero de telfono quitando todos los caracteres del nmero de telfono
excepto los dgitos 0 a 9. Despus, comprueba si el nmero de telfono contiene exactamente diez
dgitos (la longitud de un nmero de telfono en Amrica del norte). Este ejemplo imprime lo
siguiente:
First number is 1234567890
Second number is invalid
No puede declarar inicializadores estticos o interfaces de miembro de una clase local. El siguiente
fragmento de cdigo no compila porque el mtodo EnglishGoodbye.sayGoodbye se declara
static. El compilador genera un error similar al "modificador 'static' slo est permitido en la
declaracin de variable constante" cuando se encuentra con esta definicin de mtodo:
public void sayGoodbyeInEnglish() {
class EnglishGoodbye {
public static void sayGoodbye() {
System.out.println("Bye bye");
}
}
EnglishGoodbye.sayGoodbye();
}
Una clase local puede tener miembros estticos que son variables constantes. (Una variable
constante es una variable de tipo primitivo o tipo String que se declara final e inicializado con una
expresin constante de tiempo de compilacin. Una expresin constante de tiempo de compilacin
es normalmente una cadena o una expresin aritmtica que puede evaluarse en tiempo de
compilacin. Ver Miembros de la clase de comprensin para obtener ms informacin). El siguiente
fragmento de cdigo compila porque el miembro esttico EnglishGoodbye.farewell es una
variable constante:
public void sayGoodbyeInEnglish() {
class EnglishGoodbye {
public static final String farewell = "Bye bye";
public void sayGoodbye() {
System.out.println(farewell);
}
}
EnglishGoodbye myEnglishGoodbye = new EnglishGoodbye();
myEnglishGoodbye.sayGoodbye();
}
Clases de annimas
Annimas clases permiten hacer el cdigo ms conciso. Le permiten declarar y crear una
instancia de una clase al mismo tiempo. Son como las clases locales excepto que no tienen un
nombre. Usarlas, si es necesario utilizar una clase local solamente una vez.
Esta seccin abarca los siguientes temas:
El new operador
El nombre de una interfaz para implementar o una clase para extender. En este ejemplo, la
clase annima est implementando la interfaz HelloWorld.
Parntesis que contienen los argumentos de un constructor, slo como una expresin de
creacin de instancia de clase normal. Nota: cuando se implementa una interfaz, no hay
ningn constructor, as que utiliza un par de parntesis, como en este ejemplo vaco.
Un cuerpo, que es un rgano de la declaracin de clase. Ms concretamente, en el cuerpo,
declaraciones de mtodos estn permitidas pero no son declaraciones.
Porque la definicin de una clase annima es una expresin, debe ser parte de una declaracin. En
este ejemplo, la expresin de la clase annima es parte de la declaracin que crea una instancia del
objeto frenchGreeting . (Esto explica por qu hay un punto y coma despus de la abrazadera
de cierre.)
Como local las clases, clases annimas pueden capturar variables; tienen el mismo acceso a las
variables locales del mbito envolvente:
Las clases annimas tambin tienen las mismas restricciones que las clases locales con respecto a
sus miembros:
Campos
Mtodos adicionales (incluso si no implementan los mtodos del supertipo)
Inicializadores de instancia
Clases locales
import
import
import
import
import
import
javafx.event.ActionEvent;
javafx.event.EventHandler;
javafx.scene.Scene;
javafx.scene.control.Button;
javafx.scene.layout.StackPane;
javafx.stage.Stage;
javafx.application.Application;
javafx.event.ActionEvent;
javafx.event.EventHandler;
javafx.geometry.Insets;
javafx.scene.Group;
javafx.scene.Scene;
javafx.scene.control.*;
javafx.scene.layout.GridPane;
javafx.scene.layout.HBox;
javafx.stage.Stage;
@Override
public void replaceSelection(String text) {
if (!text.matches("[a-z, A-Z]")) {
super.replaceSelection(text);
}
}
};
sum.setPromptText("Enter the total");
sum.setPrefColumnCount(10);
GridPane.setConstraints(sum, 1, 0);
grid.getChildren().add(sum);
Button submit = new Button("Submit");
GridPane.setConstraints(submit, 2, 0);
grid.getChildren().add(submit);
submit.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
label.setText(null);
}
});
GridPane.setConstraints(label, 0, 1);
GridPane.setColumnSpan(label, 3);
grid.getChildren().add(label);
scene.setRoot(grid);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Clase local: usarlo si usted necesita crear ms de una instancia de una clase, para acceder
a su constructor o introducir uno nuevo, llamar un tipo (, por ejemplo, es necesario invocar
mtodos adicionales ms adelante).
Clase annima: usarlo si necesita declarar campos o mtodos adicionales.
Clase anidada: usarlo si sus requerimientos son similares a los de una clase local, quieres
que sea el tipo ms ampliamente disponible, y no necesita acceso a variables locales o los
parmetros del mtodo.
o Utilice una clase anidada no esttico (o clase interna) si requiere acceso a campos
no pblicos y mtodos de una instancia envolvente. Utilice una clase anidada
esttica si no necesita este acceso.
Expresin lambda:
o Utilizar si usted encapsula una sola unidad de comportamiento que desea pasar a
otro cdigo. Por ejemplo, se usara una expresin lambda si quieres cierta accin
http://docs.oracle.com/javase/8/docs/api/javax/swing/Box.html
Ejercicios
1.
2.
http://docs.oracle.com/javase/8/docs/api/javax/swing/Box.html
a.
b.
c.
d.
e.
maxDimension)
Ejercicio
1.
Tipos enumerados
Un tipo enum es un tipo especial de datos que permite a una variable ser un conjunto
de constantes predefinidas. La variable debe ser igual a uno de los valores que han sido
predefinidos para ello. Los ejemplos ms comunes incluyen direcciones de la brjula
(valores de norte, sur, este y oeste) y los das de la semana.
Porque son constantes, son los nombres de los campos de un tipo enum en letras
maysculas.
En el lenguaje de programacin Java, definimos un tipo enum utilizando la palabra clave
enum . For example, especificara un tipo enum dias-de-la-semana como:
Usted debe usar los tipos enum cualquier momento en que necesite representar un
conjunto fijo de constantes. Eso incluye tipos enum naturales tales como los planetas de
nuestro sistema solar y los conjuntos de datos donde conoces a todos los valores posibles
en tiempo de compilacin, por ejemplo, las opciones de un men, parmetros de lnea de
comandos y as sucesivamente.
Aqu hay un cdigo se muestra cmo utilizar la enumeracin Day definida anteriormente:
seventhDay.tellItLikeItIs();
}
}
La salida es:
En el ejemplo siguiente, el Planet es un tipo enum representa los planetas del sistema
solar. Se definen con propiedades de radio y masa constante.
Cada constante de enumeracin se declara con valores para los parmetros de masa y el
radio. Estos valores se pasan al constructor cuando se crea la constante. Java exige las
constantes definirse en primer lugar, antes de cualquier campo o mtodos. Adems,
cuando hay campos y mtodos, la lista de constantes enum debe terminar con coma un
punto y.
Nota: El constructor de un tipo enum debe ser paquete privado o de acceso privado.
Crea automticamente las constantes definidas al principio del cuerpo enum. No se
puede invocar un constructor de enum.
public enum
MERCURY
VENUS
EARTH
MARS
JUPITER
SATURN
URANUS
NEPTUNE
Planet {
(3.303e+23,
(4.869e+24,
(5.976e+24,
(6.421e+23,
(1.9e+27,
(5.688e+26,
(8.686e+25,
(1.024e+26,
2.4397e6),
6.0518e6),
6.37814e6),
3.3972e6),
7.1492e7),
6.0268e7),
2.5559e7),
2.4746e7);
Leccin: anotaciones
Anotaciones, una forma de metadatos, proporcionar datos sobre un programa que no es parte del
programa de s mismo. Anotaciones no tienen ningn efecto directo sobre el funcionamiento del
cdigo que anotan.
Anotaciones tienen un nmero de usos, entre ellos:
Esta leccin explica donde anotaciones pueden ser utilizadas, cmo aplicar las anotaciones, qu
tipo de anotacin predefinidos est disponible en la plataforma Java, Standard Edition (Java SE
API), cmo tipo annnotations puede utilizarse en conjuncin con sistemas de tipo enchufable para
escribir cdigo con verificacin de tipos ms fuerte y cmo implementar la repeticin anotaciones.
@Entity
La arroba carcter (@) indica al compilador que lo que sigue es una anotacin. En el ejemplo
siguiente, nombre de la anotacin es Override:
@Override
void mySuperMethod() { ... }
La anotacin puede incluir elementos, que puede ser llamado o no identificada, y hay valores para
los elementos:
@Author(
name = "Benjamin Franklin",
date = "3/27/2003"
)
class MyClass() { ... }
o
@SuppressWarnings(value = "unchecked")
void myMethod() { ... }
Si hay un elemento denominado value, entonces el nombre puede ser omitido, como en:
@SuppressWarnings("unchecked")
void myMethod() { ... }
Si la anotacin no tiene elementos, entonces los parntesis se pueden omitir, como se muestra en el
ejemplo anterior @Override .
Tambin es posible usar varias anotaciones en la misma declaracin:
Esta forma de anotacin se llama una anotacin de tipo. Para ms informacin, consulte tipo de
anotaciones y sistemas de tipo enchufable.
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
// Note use of array
String[] reviewers();
}
La definicin de tipo de anotacin es similar a una definicin de interfaz donde la palabra clave
interface est precedido por la arroba (@) (@ = AT, como en el tipo de anotacin). Tipos de
anotacin son una forma de interfaz, que sern cubiertos en una leccin posterior. Por el momento,
no necesitas comprender las interfaces.
El cuerpo de la definicin anterior anotacin contiene elementos de tipo anotacin declaraciones,
que parecen muchos mtodos. Tenga en cuenta que pueden definir valores por defecto opcional.
Despus se define el tipo de anotacin, puede utilizar las anotaciones de ese tipo, con los valores de
relleno, as:
@ClassPreamble (
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe",
// Note array notation
reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {
// class code goes here
}
Nota: Para ampliar la informacin en @ClassPreamble en la documentacin generada por
Javadoc, usted debe anotar la definicin de @ClassPreamble con la anotacin @Documented :
}
Cada advertencia del compilador pertenece a una categora. La especificacin del lenguaje Java
listas dos categoras: deprecation y unchecked. La advertencia unchecked puede ocurrir
cuando con cdigo legado escrito antes de la llegada de los genricos. Para suprimir varias
categoras de advertencias, utilice la siguiente sintaxis:
@SuppressWarnings({"unchecked", "deprecation"})
@SafeVarargs @SafeVarargs anotacin, cuando se aplica a un mtodo o constructor, afirma que
el cdigo no realizar operaciones potencialmente inseguras sobre su parmetro varargs . Cuando
se utiliza este tipo de anotacin, advertencias relativas al uso de varargs son suprimidas.
@FunctionalInterface Anotacin @FunctionalInterface , introducido en Java SE 8, indica
que la declaracin de tipo pretende ser una interfaz funcional, como se define en la especificacin
del lenguaje Java.
@Inherited @Inherited anotacin indica que el tipo de anotacin puede ser heredado de la
superclase. (Esto no es cierto por defecto). Cuando el usuario consulta el tipo de anotacin y la
clase no tiene anotacin para este tipo, se consulta a la superclase de la clase para el tipo de
anotacin. Esta anotacin se aplica slo a las declaraciones de clase.
Herencia
Esta seccin describe la manera en la que se puede derivar una clase de otra. Es decir, cmo
una subclase puede heredar campos y mtodos de una superclase. Usted aprender que todas
las clases se derivan de la clase Object, y cmo modificar los mtodos que una subclase hereda de
superclases. Esta seccin cubre tambin interfaces como clases abstractas.
Interfaces
Hay una serie de situaciones en ingeniera de software cuando es importante para los grupos
dispares de programadores acordar un "contrato" que detalle cmo interacta su software. Cada
grupo debe ser capaz de escribir su cdigo sin ningn conocimiento de cmo se escribe el
cdigo del otro grupo. En trminos generales, las interfaces son esos contratos.
Por ejemplo, imaginemos una sociedad futurista donde los coches robticos controlados por
computadora transportan pasajeros por las calles sin un operador humano. Fabricantes de
automviles escriben software (Java, por supuesto) que opera el automvil parar, arrancar,
acelerar, girar a la izquierda, y as sucesivamente. Otro grupo industrial, fabricantes del instrumento
electrnico de posicionamiento, sistemas informticos que reciben datos de posicin GPS (Global
Positioning System) y la transmisin inalmbrica de las condiciones del trfico, usan esa informacin
para conducir el coche.
Los fabricantes de automviles deben publicar una interfaz estndar de la industria que explica
en detalle qu mtodos pueden invocarse para mover el coche (cualquier coche, de cualquier
fabricante). Los fabricantes del posicionamiento pueden entonces escribir software que invoca los
mtodos descritos en la interfaz para dirigir el coche. Ninguno de los dos grupos industriales
necesita saber Cmo es que implementa el otro grupo el software. De hecho, cada grupo
considera su software altamente patentado y se reserva el derecho de modificarlo en cualquier
momento, siempre que continue adherido a la interfaz publicada.
Interfaces en Java
En el lenguaje de programacin Java, una interfaz es un tipo de referencia, similar a una clase,
que puede contener slo constantes, firmas de mtodos, mtodos por defecto, mtodos estticos y
tipos anidados. Los cuerpos de mtodo existen solamente para mtodos por defecto y mtodos
estticos. Las interfaces No pueden ser instanciadas slo pueden ser implementadas por las
clases o extendidas por otras interfaces. La Extensin se discute ms adelante en esta leccin.
Definir una interfaz es similar a la creacin de una nueva clase:
Tenga en cuenta que las firmas de los mtodos no tienen llaves y se terminan con un punto y
coma.
Para utilizar una interfaz, escriba una clase que implementa la interfaz. Cuando una clase
instanciable implementa una interfaz, proporciona un cuerpo de mtodo para cada uno de los
mtodos declarados en la interfaz. Por ejemplo,
// firmas de mtodos
void doSomething (int i, double x);
int doSomethingElse(String s);
}
El especificador de acceso public indica que la interfaz se puede utilizar por cualquier clase
en cualquier paquete. Si no se especifica que la interfaz es pblica, su interfaz es accesible
slo para las clases definidas en el mismo paquete que la interfaz.
Una interfaz puede extender otras interfaces, as como una subclase de la clase o ampliar
otra clase. Sin embargo, considerando que una clase puede extender slo de otra clase, una
interfaz puede extender cualquier nmero de interfaces. La declaracin de interfaz incluye una
lista separada por comas de todas las interfaces que se extiende.
El cuerpo de la interfaz
El cuerpo de la interfaz puede contener mtodos abstractos, mtodos por defecto y mtodos
estticos. Un mtodo abstracto dentro de una interfaz es seguido por un punto y coma, pero sin
llaves (un mtodo abstracto no contiene una implementacin). Los Mtodos por defecto se definen
con el modificador default y los mtodos estticos con la palabra clave static. Todos los
mtodos abstractos, por defecto y estticos en una interfaz son implcitamente public, entonces
se puede omitir el modificador public.
Adems, una interfaz puede contener declaraciones de constantes. Todos los valores
constantes definidos en una interfaz son implcitamente public, static y final. Una vez
ms, se pueden omitir estos modificadores.
Si sabes que una clase implementa Relatable, entonces usted sabe que puede comparar el
tamao de los objetos instanciados desde esa clase.
Nota: El mtodo isLargerThan, tal como se define en la interfaz de Relatable, toma un objeto
de tipo Relatable. La lnea de cdigo, que se muestra en negrita en el ejemplo anterior, castea o
arroja other a una instancia RectanglePlus. Este tipo de casting indica al compilador qu
objeto realmente es. Invocando getArea directamente en la instancia other
(other.getArea()) fallara la compilacin porque el compilador no entiende que other es
actualmente una instancia de RectanglePlus.
La seccin Interfaces describe un ejemplo que involucra a fabricantes de coches controlados por
computadora que publican las interfaces estndar de la industria que describen los mtodos que
pueden invocarse para operar sus coches. Qu pasa si los fabricantes de coches controlados por
computadora aaden nuevas funciones, tales como vuelo, a sus coches? Estos fabricantes tendran
que especificar nuevos mtodos para permitir que otras empresas (como los fabricantes de
instrumentos de posicionamiento electrnico) adapten su software para autos voladores. Dnde
declararan estos fabricantes de automviles estos nuevos mtodos relacionados con los vuelos? Si
los aaden a sus interfaces originales, los programadores que han implementado las interfaces
tendran que reescribir sus implementaciones. Si los aaden como mtodos estticos, entonces los
programadores los consideraran como mtodos de utilidad, no como esenciales, como mtodos
bsicos.
Los Mtodos por defecto permiten aadir nuevas funciones a las interfaces de sus
bibliotecas y asegurar la compatibilidad binaria con cdigo escrito para las versiones ms
antiguas de las interfaces.
Considere la siguiente interfaz, TimeClient, como se describe en respuestas a las preguntas y
ejercicios: Interfaces:
import java.time.*;
public interface TimeClient {
void setTime(int hour, int minute, int second);
void setDate(int day, int month, int year);
void setDateAndTime(int day, int month, int year,
int hour, int minute, int second);
LocalDateTime getLocalDateTime();
}
La clase siguiente, SimpleTimeClient, implementa TimeClient:
package defaultmethods;
import java.time.*;
import java.lang.*;
import java.util.*;
public class SimpleTimeClient implements TimeClient {
private LocalDateTime dateAndTime;
public SimpleTimeClient() {
dateAndTime = LocalDateTime.now();
}
public void setTime(int hour, int minute, int second) {
LocalDate currentDate = LocalDate.from(dateAndTime);
LocalTime timeToSet = LocalTime.of(hour, minute, second);
dateAndTime = LocalDateTime.of(currentDate, timeToSet);
}
public void setDate(int day, int month, int year) {
LocalDate dateToSet = LocalDate.of(day, month, year);
LocalTime currentTime = LocalTime.from(dateAndTime);
dateAndTime = LocalDateTime.of(dateToSet, currentTime);
}
public void setDateAndTime(int day, int month, int year,
int hour, int minute, int second) {
package defaultmethods;
import java.time.*;
public interface TimeClient {
void setTime(int hour, int minute, int second);
void setDate(int day, int month, int year);
void setDateAndTime(int day, int month, int year,
int hour, int minute, int second);
LocalDateTime getLocalDateTime();
static ZoneId getZoneId (String zoneString) {
try {
return ZoneId.of(zoneString);
} catch (DateTimeException e) {
System.err.println("Invalid time zone: " + zoneString +
"; using default time zone instead.");
return ZoneId.systemDefault();
}
}
package defaultmethods;
import java.time.*;
import java.lang.*;
import java.util.*;
public class TestSimpleTimeClient {
public static void main(String... args) {
TimeClient myTimeClient = new SimpleTimeClient();
System.out.println("Current time: " +
myTimeClient.toString());
System.out.println("Time in California: " +
myTimeClient.getZonedDateTime("Blah blah").toString());
}
}
No mencione en absoluto el mtodo por defecto, deje que su interfaz extendida herede
el mtodo por defecto.
Vuelva a declarar el mtodo por defecto, que lo convierte en abstract.
Redefina el mtodo por defecto, que lo reemplaza.
Mtodos estticos
Adems de los mtodos por defecto, se pueden definir mtodos estticos en las interfaces. (Un
mtodo esttico es un mtodo que se asocia con la clase en la que se define en lugar de con
cualquier objeto. Cada instancia de la clase comparte sus mtodos estticos). Esto hace ms
fcil para que usted pueda organizar mtodos auxiliares en sus bibliotecas; Puedes quedarte con
mtodos estticos especficos en una interfaz en la misma interfaz en lugar de una clase
aparte. El ejemplo siguiente define un mtodo esttico que recupera un objeto ZoneId
correspondiente a un identificador de zona horaria; utiliza la zona horaria del sistema por defecto si
no hay ningn objeto ZoneId correspondiente al identificador determinado. (Como resultado, puede
simplificar el mtodo getZonedDateTime):
package defaultmethods;
public interface Card extends Comparable<Card> {
public enum Suit
DIAMONDS (1,
CLUBS
(2,
HEARTS
(3,
SPADES
(4,
{
"Diamonds"),
"Clubs"
),
"Hearts" ),
"Spades" );
La interfaz de Deck contiene varios mtodos que manipulan las cartas de una baraja:
package defaultmethods;
import java.util.*;
import java.util.stream.*;
import java.lang.*;
public interface Deck {
List<Card> getCards();
Deck deckFactory();
int size();
void addCard(Card card);
void addCards(List<Card> cards);
void addDeck(Deck deck);
void shuffle();
void sort();
void sort(Comparator<Card> c);
String deckToString();
Map<Integer, Deck> deal(int players, int numberOfCards)
throws IllegalArgumentException;
}
La clase PlayingCard implementa la interfaz de Card, y la clase StandardDeck implementa la
interfaz Deck.
La clase StandardDeck implementa el mtodo abstracto Deck.sort como sigue:
package defaultmethods;
import java.util.*;
import java.util.stream.*;
import java.lang.*;
public class SortByRankThenSuit implements Comparator<Card> {
public int compare(Card firstCard, Card secondCard) {
int compVal =
firstCard.getRank().value() secondCard.getRank().value();
if (compVal != 0)
return compVal;
else
return firstCard.getSuit().value() secondCard.getSuit().value();
}
}
La siguiente invocacin ordena la baraja de cartas primero por su rango, luego por traje:
Porque la interfaz Comparator es una interfaz funcional, puede utilizar una expresin lambda
como argumento para el mtodo de sort. En este ejemplo, la expresin lambda compara dos
valores enteros.
Sera ms simple para sus desarrolladores si podan crear una instancia de Comparator
invocando el mtodo Card.getRank slo. En particular, sera til si sus desarrolladores podran
crear una instancia de Comparator que compara a cualquier objeto que puede devolver un valor
numrico de un mtodo getValue como hashCode. Ha mejorado la interfaz Comparator con
esta capacidad con el mtodo esttico comparing :
myDeck.sort(Comparator.comparing(Card::getRank));
Esta invocacin mejor demuestra que para ordenar en lugar de Cmo hacerlo.
Se ha mejorado la interfaz Comparator con otras versiones del mtodo esttico comparing tales
como comparingDouble y comparingLong que permiten crear instancias Comparator que
comparar otros tipos de datos.
Supongamos que sus desarrolladores le gustara crear una instancia de Comparator que podra
comparar objetos con ms de uno de los criterios. Por ejemplo, cmo sera que ordenar la baraja
de cartas primero por fila y luego por traje? Como antes, se puede utilizar una expresin lambda
para especificar los criterios de ordenacin:
myDeck.sort(
Comparator
.comparing(Card::getRank)
.thenComparing(Comparator.comparing(Card::getSuit)));
Se ha mejorado la interfaz Comparator con otras versiones del del mtodo por defecto
thenComparing (como thenComparingDouble y thenComparingLong) que permiten
construir instancias Comparator que comparar otros tipos de datos.
Supongamos que sus desarrolladores le gustara crear una instancia de Comparator que permite
ordenar una coleccin de objetos en orden inverso. Por ejemplo, cmo sera que ordenar la baraja
de cartas primero por orden descendente de rango, desde el as hasta dos (en lugar de entre dos y
As)? Como antes, puede especificar otra expresin lambda. Sin embargo, sera ms sencillo para
los desarrolladores podran revertir un Comparator de existente mediante la invocacin de un
mtodo. Se ha mejorado la interfaz Comparator con esta capacidad con el mtodo de
predeterminado reversed :
myDeck.sort(
Comparator.comparing(Card::getRank)
.reversed()
.thenComparing(Comparator.comparing(Card::getSuit)));
Este ejemplo muestra cmo se ha mejorado la interfaz Comparator con mtodos
predeterminados, mtodos estticos, expresiones lambda, y mtodo referencias para crear mtodos
ms expresivos de la biblioteca cuyos programadores de funcionalidad pueden deducir rpidamente
mirando cmo ellos son invocados. Utilice estas construcciones para mejorar las interfaces en las
bibliotecas.
Resumen de Interfaces
Una declaracin de interfaz puede contener firmas de mtodos, mtodos por defecto, mtodos
estticos y definiciones de constantes. Los nicos mtodos que tienen implementaciones son por
defecto y mtodos estticos.
Una clase que implementa una interfaz debe implementar todos los mtodos declarados en la
interfaz.
El Nombre de una interfaz puede ser usado en cualquier lugar que se pueda usar un tipo.
Ejercicios
1.
Supongamos que usted ha escrito un servidor de hora que notifica peridicamente a sus
clientes la fecha y hora actual. Escriba una interfaz que podra utilizar el servidor para
cumplir un protocolo concreto con sus clientes.
Herencia
En las lecciones anteriores, usted ha visto herencia mencionado varias veces. En el lenguaje Java,
las clases pueden ser derivadas de otras clases, as heredar Campos y mtodos de las
clases.
Definiciones: Una clase que se deriva de otra clase se llama una subclase (tambin una clase
derivada, clase extendida o clase de nio). La clase de la cual se deriva la subclase se llama una
superclase (tambin una clase base o una clase padre).
Con la excepcin de Object, el cual no tiene ninguna superclase, cada clase tiene slo una
superclase directa (herencia simple). En ausencia de cualquier otro superclase explcita, cada clase
implcitamente es una subclase de Object.
Las clases se pueden derivar de las clases que se derivan de las clases que se derivan las clases y
as sucesivamente y deriva en ltima instancia de la clase superior, Object. Esa clase se dice que
desciende de todas las clases en la cadena de herencia que se remontan a Objeto.
La idea de la herencia es simple pero poderosa: cuando desea crear una nueva clase y ya hay una
clase que incluye parte del cdigo que usted quiere, puede derivar su nueva clase de la clase
existente. Al hacer esto, usted puede reutilizar los campos y mtodos de la clase existente sin tener
que escribir (y depurar) los mismos.
Una subclase hereda todos los miembros (campos, mtodos y clases anidadas) de su superclase.
Los constructores no son miembros, as que ellos no se heredan de las subclases, pero puede
invocar el constructor de la superclase desde la subclase.
Un ejemplo de herencia
Aqu est el cdigo de ejemplo para una posible implementacin de una clase de Bicycle que se
present en la leccin de clases y objetos:
Los campos heredados pueden utilizarse directamente, al igual que cualquier otro
campo.
Puede declarar un campo en la subclase con el mismo nombre como el de la
superclase, as ocultandolo (no recomendado).
Se pueden declarar nuevos campos en la subclase que no estn en la superclase.
Los mtodos heredados pueden ser utilizados directamente como son.
Puede escribir un nuevo mtodo de instancia de la subclase que tiene la misma firma como
el de la superclase, as reemplazar todo.
Puede escribir un nuevo mtodo esttico en la subclase que tiene la misma firma
como el de la superclase, as sobreescribiendolo.
Se pueden declarar nuevos mtodos en la subclase que no estn en la superclase.
Puedes escribir un constructor de la subclase que invoca al constructor de la
superclase, implcita o mediante el uso de la palabra clave super.
Casting de Objetos
Hemos visto que un objeto es del tipo de datos de la clase de la cual se ha instanciado. Por
ejemplo, si escribimos:
El Casting muestra el uso de un objeto de un tipo en lugar de otro tipo, entre los objetos
permitidos por la herencia y las implementaciones. Por ejemplo, si escribimos:
Nota: Puedes hacer una prueba lgica en cuanto al tipo de un objeto determinado utilizando el
operador instanceof. Esto puede ahorrar un error en tiempo de ejecucin debido a un cast
inadecuado. Por ejemplo:
son tales como conflictos de nombres y ambigedad. Cuando los compiladores de lenguajes que
admiten este tipo de herencia mltiple de programacin encuentran superclases que contienen
mtodos con el mismo nombre, a veces no pueden determinar el miembro o mtodo para
acceder o invocar. Adems, un programador puede introducir involuntariamente un conflicto de
nombres mediante la adicin de un nuevo mtodo de una superclase. Los mtodos por defecto
introducen una forma de implementacin de herencia mltiple. Una clase puede implementar ms
de una interfaz, que puede contener mtodos por defecto que tengan el mismo nombre. El
compilador de Java proporciona algunas reglas para determinar qu mtodo predeterminado utiliza
una clase en particular.
El lenguaje de programacin Java soporta herencia mltiple de tipo, que es la capacidad de una
clase para implementar ms de una interfaz. Un objeto puede tener varios tipos: el tipo de su
propia clase y los tipos de todas las interfaces que implementa la clase. Esto significa que si
una variable se declara como el tipo de una interfaz, entonces su valor puede hacer referencia a
cualquier objeto que es instanciado desde cualquier clase que implemente la interfaz. Esto se
discute en la seccin utilizando una interfaz como un tipo.
Como con la implementacin de la herencia mltiple, una clase puede heredar diferentes
implementaciones de un mtodo definido (como por defecto o esttico) en las interfaces que
extiende. En este caso, el compilador o el usuario deben decidir cul usar.
Mtodos estticos
Si una subclase define un mtodo esttico con la misma firma que un mtodo esttico en la
superclase, entonces el mtodo de la subclase oculta la de la superclase.
La distincin entre ocultar un mtodo esttico y reemplazar o socreescribir un mtodo de instancia
tiene implicaciones importantes:
Examinemos un ejemplo que contiene dos clases. El primero es el Animal, que contiene un
mtodo de instancia y un mtodo esttico:
Mtodos de interfaz
Los mtodos por defecto y los mtodos abstractos en interfaces son heredados como mtodos de
instancia. Sin embargo, cuando los supertipos de una clase o interfaz proporcionan varios mtodos
por defecto con la misma firma, el compilador de Java sigue las reglas de herencia para resolver el
conflicto de nombres. Estas reglas son conducidas por los siguientes dos principios:
Los mtodos de instancia son preferidos sobre los mtodos de interfaz por defecto.
Considere las siguientes clases e interfaces:
public class Horse {
public String identifyMyself() {
return "I am a horse.";
}
}
public interface Flyer {
default public String identifyMyself() {
return "I am able to fly.";
}
}
public interface Mythical {
default public String identifyMyself() {
return "I am a mythical creature.";
}
}
public class Pegasus extends Horse implements Flyer, Mythical {
public static void main(String... args) {
Pegasus myApp = new Pegasus();
System.out.println(myApp.identifyMyself());
}
}
Los mtodos que ya estn sobreescritos por otros candidatos son ignorados. Esta
circunstancia puede surgir cuando los supertipos comparten un ancestro comn.
Considere las siguientes interfaces y clases:
public interface Animal {
default public String identifyMyself() {
return "I am an animal.";
}
}
public interface EggLayer extends Animal {
default public String identifyMyself() {
return "I am able to lay eggs.";
}
}
public interface FireBreather extends Animal { }
public class Dragon implements EggLayer, FireBreather {
public static void main (String... args) {
Dragon myApp = new Dragon();
System.out.println(myApp.identifyMyself());
}
}
eggs.
Si dos o ms conflictos de mtodos independientemente definidos por defecto, o un mtodo por
defecto entran en conflicto con un mtodo abstracto, entonces el compilador de Java produce un
error del compilador. Explcitamente debe sobreescribir los mtodos del supertipo.
Considere el ejemplo de coches controlados por computadora que ahora pueden volar. Tiene dos
interfaces (OperateCar y FlyCar) que proporciona implementaciones por defecto para el mismo
mtodo, (startEngine):
public interface OperateCar {
// ...
default public int startEngine(EncryptedKey key) {
// Implementation
}
}
public interface FlyCar {
// ...
default public int startEngine(EncryptedKey key) {
// Implementation
}
}
Una clase que implementa tanto OperateCar como FlyCar debe reemplazar el mtodo
startEngine. Se podra invocar cualquiera de las implementaciones por defecto con la palabra
clave super.
public class FlyingCar implements OperateCar, FlyCar {
// ...
public int startEngine(EncryptedKey key) {
FlyCar.super.startEngine(key);
OperateCar.super.startEngine(key);
}
}
El nombre anterior super (en este ejemplo, FlyCar u OperateCar) debe hacer referencia a una
superinterface directa que define o hereda un valor por defecto para el mtodo invocado. Esta forma
de invocacin de mtodo no se limita a diferenciar entre mltiples interfaces implementadas que
contienen mtodos por defecto con la misma firma. Puede utilizar la palabra clave super para
invocar un mtodo por defecto en ambas, clases e interfaces.
Los mtodos de instancia heredados de las clases pueden sobreescribir mtodos de interfaz
abstracta. Considere las siguientes interfaces y clases:
Modificadores
El especificador de acceso para un mtodo sobreescrito puede permitir ms, pero no menos,
acceso que el mtodo sobreescrito. Por ejemplo, un mtodo de instancia protegido en la
superclase puede hacerse pblico, pero no privado, en la subclase.
Obtendr un error de compilacin si se intenta cambiar un mtodo de instancia en la superclase a un
mtodo esttico en la subclase y viceversa.
Resumen
La siguiente tabla resume lo que sucede cuando se define un mtodo con la misma firma como un
mtodo en una superclase.
Definir un mtodo con la misma firma como mtodo de una superclase
Mtodo de instancia de la
superclase
Mtodo de instancia de la
subclase
Mtodo esttico de la
subclase
Mtodo esttico de la
superclase
Sobreescribir
Ocultar
Nota: En una subclase, se pueden sobrecargar los mtodos heredados de la superclase. Tales
mtodos sobrecargados ni ocultan ni sobreescriben los mtodos de instancia de la superclase
son nuevos mtodos, nicos de la subclase.
Polimorfismo
La definicin del diccionario de polimorfismo se refiere a un principio de biologa en el cual un
organismo o especie puede tener muchas formas diferentes o etapas. Este principio puede aplicarse
tambin a la programacin orientada a objetos y lenguajes como el lenguaje Java. Las subclases
de una clase pueden definir sus propios comportamientos nicos y an compartir la misma
funcionalidad de la clase padre.
Polimorfismo puede demostrarse con una pequea modificacin a la clase de Bicycle. Por
ejemplo, podra aadirse un mtodo printDescription a la clase que muestra todos los datos
almacenados actualmente en una instancia.
}
public void printDescription() {
super.printDescription();
System.out.println("The " + "MountainBike has a" +
getSuspension() + " suspension.");
}
}
Notese el mtodo sobreescrito printDescription. Adems de la informacin facilitada antes, se
incluye en la salida datos adicionales sobre la suspensin.
A continuacin, cree la clase RoadBike. Porque las bicicletas de carretera o de carreras tienen
neumticos delgados, se agrega un atributo para rastrear el ancho del neumtico. Aqu est la clase
RoadBike:
Ocultar campos
Dentro de una clase, un campo que tiene el mismo nombre que un campo de la superclase
oculta el campo de la superclase, incluso si sus tipos son diferentes. Dentro de la subclase, el
campo de la superclase no puede ser referenciado por su nombre simple. En lugar de ello, el campo
debe accederse a travs de super, que se cubre en la seccin siguiente. En trminos generales,
no es recomendable ocultar campos ya que hace difcil leer el cdigo.
System.out.println("Printed in Subclass");
}
public static void main(String[] args) {
Subclass s = new Subclass();
s.printMethod();
}
}
Dentro de Subclass, el nombre simple printMethod() se refiere al declarado en la Subclass,
que sobreescribe en la Superclass. As que, para hacer referencia a printMethod() heredado
de la Superclass, Subclass debe utilizar un nombre cualificado, usando super como se
muestra. Al compilar y ejecutar Subclass imprime lo siguiente:
Printed in Superclass.
Printed in Subclass
super();
o:
super(parameter list);
Con super(), se llama al constructor sin-argumentos de la superclase. Con super(parameter
list), se llama al constructor de la superclase con una lista de parmetros coincidentes.
public
public
public
public
public
final
final
final
final
final
void
void
void
void
void
notify()
notifyAll()
wait()
wait(long timeout)
wait(long timeout, int nanos)
Nota: Hay algunos aspectos sutiles a un nmero de estos mtodos, especialmente el mtodo
clone.
El mtodo clone()
Si una clase, o una de sus superclases, implementa la interfaz Cloneable, usted puede
utilizar el mtodo clone() para crear una copia de un objeto existente. Para crear un clon,
escribe:
aCloneableObject.clone();
La implementacin de Object en este mtodo comprueba si el objeto sobre el que se invoc
clone() implementa la interfaz Cloneable . Si el objeto no lo hace, el mtodo produce una
excepcin CloneNotSupportedException. El manejo de excepciones ser cubierto en una
leccin posterior. Por el momento, tienes que saber que clone() deben ser declarado como
El mtodo equals()
El mtodo equals() compara dos objetos para igualdad y devuelve true si son iguales. El
mtodo equals() proporcionado en la clase de Object utiliza el operador de identidad (==)
para determinar si dos objetos son iguales. Para tipos de datos primitivos, esto da el resultado
correcto. Para los objetos, sin embargo, no lo hace. El mtodo equals() proporcionado por
Object prueba si las referencias de objeto son iguales es decir, si los objetos comparados
son el mismo objeto exacto.
Para comprobar si dos objetos son iguales en el sentido de equivalencia (que contengan la misma
informacin), es necesario reemplazar el mtodo equals(). Aqu hay un ejemplo de una clase de
Book que reemplaza equals():
El mtodo finalize()
La clase Object proporciona un mtodo de devolucin de llamada, finalize(), este puede
ser invocado por un objeto cuando se convierte en basura. La implementacin de Object de
finalize() no hace nada puede sobreescribir finalize() para hacer limpieza, como
liberando recursos.
El mtodo finalize()puede ser llamado automticamente por el sistema, pero cuando se llama,
o incluso si se llama, es incierto. Por lo tanto, no debe confiar en este mtodo para hacer la
limpieza por usted. Por ejemplo, si no cierra los descriptores de ficheros en el cdigo despus de
realizar la I/O y esperas finalize() para cerrarlas por usted, es posible que se quede sin
descriptores de archivos.
El mtodo getClass()
Usted no puede sobreescribir getClass.
El mtodo getClass() devuelve un objeto Class , que tiene mtodos que puede utilizar para
obtener informacin acerca de la clase, como su nombre (getSimpleName()), su superclase
(getSuperclass()) y las interfaces que implementa (getInterfaces()). Por ejemplo, el
siguiente mtodo obtiene y muestra el nombre de clase de un objeto:
El mtodo hashCode()
El valor devuelto por hashCode() es cdigo hash del objeto, que es la direccin de memoria del
objeto en hexadecimal.
Por definicin, si dos objetos son iguales, sus cdigos hash tambin deben ser iguales. Si
reemplaza el mtodo equals(), cambia la forma en que se comparan dos objetos y la
implementacin de Object del hashCode() ya no es vlida. Por lo tanto, si reemplaza el
mtodo equals() , tambin debe reemplazar el mtodo hashCode().
El mtodo toString()
Siempre debe considerar sobreescribir el mtodo toString() en sus clases.
El mtodo toString() del Object devuelve una representacin de String del objeto, que es
muy til para la depuracin. La representacin de String de un objeto depende del objeto, por eso
tienes que sobreescribir toString() en tus clases.
Puede utilizar toString() junto con System.out.println() para mostrar una representacin
de un objeto, como una instancia de Book:
System.out.println(firstBook.toString());
Que seria, para un mtodo toString() sobreescrito apropiadamente, imprime algo til, como
esto:
class ChessAlgorithm {
enum ChessPlayer { WHITE, BLACK }
...
final ChessPlayer getFirstPlayer() {
return ChessPlayer.WHITE;
}
...
}
Los mtodos llamados desde los constructores generalmente deben declararse como finales. Si un
constructor llama a un mtodo no-final, una subclase puede redefinir el mtodo con resultados
sorpresivos o indeseables.
Tenga en cuenta que tambin puede declarar una clase completa final. Una clase que se declara
final no puede tener subclases. Esto es particularmente til, por ejemplo, cuando se crea una clase
inmutable como la clase String.
Nota: Los mtodos de una interfaz (vase la seccin Interfaces ) que no se declararon como
por defecto o estticos son implcitamente abstractos, as que no se utiliza el modificador
abstract con los mtodos de la interfaz. (Puede ser utilizado, pero es innecesario).
o
o
o
o
o
o
Un ejemplo de una clase abstracta en el JDK es AbstractMap, que forma parte de las
Colecciones. Sus subclases (que incluyen HashMap, TreeMap y ConcurrentHashMap)
comparten muchos mtodos get que define AbstractMap.
Un ejemplo de una clase en el JDK que implementa varias interfaces es HashMap, que implementa
las interfaces Serializable, Cloneable y Map<K, V>. Al leer esta lista de interfaces, se
puede deducir que una instancia de HashMap (independientemente del desarrollador o empresa
que implementa la clase) pueden ser clonados, es serializable (lo que significa que puede ser
convertido en un byte corriente; vea la seccin Objetos serializables), y tiene la funcionalidad de un
mapa. Adems, se ha mejorado la interfaz de Map<K, V> con muchos mtodos por defecto como
merge y forEach que no tienen clases mayores que han implementado esta interfaz para definir.
Tenga en cuenta que muchas bibliotecas de software utilizan tanto las clases abstractas como
las interfaces; la clase HashMap implementa varias interfaces y tambin extiende la clase
abstracta AbstractMap.
Miembros de la clase
Una clase abstracta puede tener campos static y mtodos static. Puede utilizar a estos
miembros estticos con una referencia de la clase (por ejemplo,
AbstractClass.staticMethod()) como lo hara con cualquier otra clase.
Resumen de la herencia
Con excepcin de la clase de Object , una clase tiene exactamente una superclase directa. Una
clase hereda campos y mtodos de todos sus superclases, directa o indirecta. Una subclase puede
reemplazar mtodos que hereda, o pueden ocultar campos o mtodos que hereda. (Nota que ocultar
campos es generalmente mala prctica de programacin.)
La tabla en seccin de anulacin y ocultar mtodos muestra el efecto de declarar un mtodo con la
misma firma que un mtodo de la superclase.
La clase de Object es la parte superior de la jerarqua de clases. Todas las clases son
descendientes de esta clase y heredan los mtodos. Mtodos tiles heredados de Object incluyen
toString(), equals(), clone()y getClass().
Puede evitar que una clase de ser subclases mediante la palabra clave final en declaracin de la
clase. Asimismo, puede impedir que un mtodo siendo reemplazadas por las subclases
declarndola como forma final.
Una clase abstracta puede solamente ser subclases; No puede ser instanciada. Una clase abstracta
puede contener mtodos abstractos mtodos que son declarados pero no implementados.
Subclases proporcionan las implementaciones de los mtodos abstractos.
public
}
public
}
public
}
public
}
void methodOne(int i) {
void methodTwo(int i) {
static void methodThree(int i) {
static void methodFour(int i) {
}
public class ClassB extends ClassA {
public static void methodOne(int i) {
}
public void methodTwo(int i) {
}
public void methodThree(int i) {
}
public static void methodFour(int i) {
}
}
a. Qu mtodo sobreescribe un mtodo en la superclase?
b. Qu mtodo oculta un mtodo en la superclase?
c. Qu hacen los otros mtodos?
Strings
Las strings, que son ampliamente utilizadas en programacin Java, son una secuencia de
caracteres. En el lenguaje de programacin Java, las strings son objetos. Esta seccin describe
cmo utilizar la clase String para crear y manipular cadenas. Tambin compara las clases
String y StringBuilder.
Nmeros
Esta seccin comienza con una discusin sobre el Number de clase en el paquete java.lang,
sus subclases y las situaciones donde se usara instancias de estas clases en lugar de los tipos
primitivos de nmero.
Esta seccin presenta tambin las clases de PrintStream y DecimalFormat, que proporciona
mtodos para escribir con formato de salida numrica.
Por ltimo, se discute la clase de Math en java.lang. Contiene las funciones matemticas para
complementar los operadores incorporados en la lengua. Esta clase tiene mtodos para las
funciones trigonomtricas, funciones exponenciales y as sucesivamente.
int i = 500;
float gpa = 3.65f;
byte mask = 0xff;
Sin embargo, hay razones para usar objetos en lugar de primitivos, y la plataforma Java proporciona
clases contenedoras para cada uno de los tipos de datos primitivos. Estas clases "envuelven" la
primitiva en un objeto. A menudo, la envoltura se realiza por el compilador, si utilizas un primitivo
donde se espera un objeto, el compilador cajas la primitiva en su envoltorio clase para usted.
Similarmente, si utilizas un objeto number cuando un hombre primitivo y se espera, el compilador
unboxes el objeto para ti. Para obtener ms informacin, vea Autoboxing y Unboxing
Todas las clases contenedoras numricos son subclases de la clase abstracta Number:
Nota: Hay cuatro otras subclases de Number que no se discuten aqu. BigDecimal y
BigInteger se utilizan para los clculos de alta precisin. AtomicInteger y AtomicLong se
utilizan para aplicaciones de subprocesos mltiples.
Hay tres razones que puede utilizar un objeto Number en lugar de una primitiva:
1.
2.
3.
La tabla siguiente enumeran los mtodos de instancia que implementan todas las subclases de la
clase de Number.
Mtodos implementada por todas las subclases de nmero
Mtodo
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
Descripcin
int compareTo(Byte
anotherByte)
int compareTo(Double
anotherDouble)
int compareTo(Float
anotherFloat)
int compareTo(Integer
anotherInteger)
int compareTo(Long
anotherLong)
int compareTo(Short
anotherShort)
boolean equals(Object
obj)
Cada clase Number contiene otros mtodos que son tiles para la conversin de nmeros y de las
cadenas y para convertir entre sistemas de numeracin. La tabla siguiente enumera estos mtodos
en la clase Integer . Mtodos para las otras subclases de Number son similares:
Mtodos de conversin, clase Integer
Mtodo
Descripcin
static Integer
decode(String s)
static int
parseInt(String s)
static int
parseInt(String s,
int radix)
String toString()
static String
toString(int i)
static Integer
valueOf(int i)
static Integer
valueOf(String s)
static Integer
valueOf(String s,
int radix)
System.out.format(.....);
La sintaxis de estos dos mtodos de java.io.PrintStream es la misma:
java.util.Formatter
Aqu est un ejemplo bsico:
int i = 461012;
System.out.format("The value of i is: %d%n", i);
El %d especifica que la nica variable es un entero decimal. El %n es un caracter independiente de
la plataforma. La salida es:
Para imprimir nmeros en el sistema francs (donde se utiliza una coma en lugar de la posicin
decimal en la representacin inglesa de nmeros de coma flotante), por ejemplo, utilice:
System.out.format(Locale.FRANCE,
"The value of the float " + "variable is %f, while the " +
"value of the integer variable " + "is %d, and the string is
%s%n",
floatVar, intVar, stringVar);
Un ejemplo
La tabla siguiente enumeran algunos de los convertidores y banderas que se utilizan en el programa
de la muestra, TestFormat.java, que sigue en la tabla.
Convertidores y banderas utilizadas en TestFormat.java
Convertidor
Bandera
Explicacin
Un entero decimal.
Un flotador.
tB
TD, te
Ty tY
TL
tM
TP
TM
tD
Justifica a la izquierda...
.3
10.3
El siguiente programa muestra algunos de los que puedes hacer con formatformato. La salida se
muestra dentro de comillas dobles en el comentario incrustado:
import java.util.Calendar;
import java.util.Locale;
public class TestFormat {
public static void main(String[] args) {
long n = 461012;
System.out.format("%d%n", n);
// --> "461012"
System.out.format("%08d%n", n);
// --> "00461012"
System.out.format("%+8d%n", n);
// --> " +461012"
System.out.format("%,8d%n", n);
// --> " 461,012"
System.out.format("%+,8d%n%n", n); // --> "+461,012"
double pi = Math.PI;
System.out.format("%f%n", pi);
// -->
System.out.format("%.3f%n", pi);
// -->
System.out.format("%10.3f%n", pi);
// -->
System.out.format("%-10.3f%n", pi); // -->
System.out.format(Locale.FRANCE,
"%-10.4f%n%n", pi); // -->
"3.141593"
"3.142"
"
3.142"
"3.142"
"3,1416"
Calendar c = Calendar.getInstance();
System.out.format("%tB %te, %tY%n", c, c, c); // -->
"May 29,
"2:34 am"
2006"
System.out.format("%tD%n", c);
// -->
// -->
"05/29/06"
}
}
Nota: La discusin en esta seccin cubre slo los conceptos bsicos de los mtodos de format y
printf . Ms detalles pueden encontrarse en la seccin de Basic I/O del camino esencial, en la
pgina de "Formato".
Utilizando String.format y para crear cadenas est cubierto de cadenas.
La clase DecimalFormat
Usted puede utilizar la clase java.text.DecimalFormat para controlar la visualizacin de
iniciales y ceros, prefijos y sufijos, separadores de agrupacin (miles) y el separador de decimales.
DecimalFormat ofrece una gran flexibilidad en el formato de nmeros, pero puede hacer ms
compleja su cdigo.
El ejemplo siguiente crea un objeto DecimalFormat , myFormatter, generando una cadena de
patrn para el constructor DecimalFormat . Luego se invoca el mtodo format() , que
import java.text.*;
public class DecimalFormatDemo {
static public void customFormat(String pattern, double value ) {
DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);
}
static public void main(String[] args) {
customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
}
}
La salida es:
Patrn
Salida
Explicacin
123456.789
###,###.###
123,456.789
123456.789
###.##
123456.79
123.78
000000.000
000123.780
$12.345,67
12345.67
$###,###.###
El lenguaje de programacin Java soporta aritmtica bsica con sus operadores aritmticos: +, -, *, /
y %. La clase de Math en el paquete java.lang proporciona mtodos y constantes para hacer el
clculo matemtico ms avanzado.
Los mtodos en la clase de Math son todo estticos, as se llaman directamente de la clase, as:
Math.cos(angle);
Nota: Mediante la funcin de lengua static import , no tienes que escribir Math frente a todas
las funciones matemticas:
cos(angle);
La clase de Math tambin incluye ms de 40 mtodos estticos. La tabla siguiente enumera una
serie de los mtodos bsicos.
Mtodos bsicos de matemticas
Mtodo
Descripcin
double abs(double d)
float abs(float f)
int abs(int i)
long abs(long lng)
double ceil(double d)
double floor(double d)
double rint(double d)
long round(double d)
int round(float f)
Descripcin
The
The
The
The
The
The
Descripcin
double exp(double d)
double log(double d)
double sqrt(double d)
double sin(double d)
Descripcin
Devuelve el seno del doble valor especificado.
double cos(double d)
double tan(double d)
double asin(double d)
double acos(double d)
double atan(double d)
double toDegrees(double d)
double toRadians(double d)
Aqu es un programa, TrigonometricDemo, que utiliza cada uno de estos mtodos para calcular
varios valores de funciones trigonomtricos para un ngulo de 45 grados:
Math.toDegrees(Math.atan(Math.tan(radians))));
}
}
La salida de este programa es como sigue:
The
The
The
The
The
The
The
value of pi is 3.1416
sine of 45.0 degrees is 0.7071
cosine of 45.0 degrees is 0.7071
tangent of 45.0 degrees is 1.0000
arcsine of 0.7071 is 45.0000 degrees
arccosine of 0.7071 is 45.0000 degrees
arctangent of 1.0000 is 45.0000 degrees
Nmeros aleatorios
El mtodo random() devuelve un nmero pseudo aleatoriamente seleccionado entre 0.0 y 1.0. La
gama incluye 0.0 pero no 1.0. En otras palabras: 0.0 <= Math.random() < 1.0. Para obtener
un nmero en un rango diferente, puede realizar aritmtica en el valor devuelto por el mtodo
aleatorio. Por ejemplo, para generar un nmero entero entre 0 y 9, escribira:
Resumen de nmeros
Utiliza uno de las clases contenedoras Byte, Double, Float, Integer, Longo Short para
envolver un nmero de tipo primitivo en un objeto. El compilador de Java automticamente envuelve
a primitivas (cajas) para que cuando sea necesario y unboxes, otra vez cuando sea necesario.
El Number clases incluye constantes y mtodos de la clase til. Las constantes MIN_VALUE y
MAX_VALUE contienen los valores ms pequeos y ms grandes que pueden contener un objeto de
ese tipo. El byteValue, shortValuey mtodos similares convierten a un tipo numrico a otro. El
mtodo valueOf convierte una cadena en un nmero, y el mtodo toString convierte a un
nmero en una cadena.
Para dar formato a una cadena que contenga nmeros de salida, puede utilizar los mtodos
printf() o format() en la clase de PrintStream . Como alternativa, puede utilizar la clase
NumberFormat para personalizar formatos numricos usando patrones.
La clase Math contiene una variedad de mtodos de la clase para realizar funciones matemticas,
incluyendo mtodos exponenciales, logartmicos y trigonomtricos. Math tambin incluye funciones
aritmticas bsicas, tales como valor absoluto y redondeo y un mtodo random(), para la
generacin de nmeros aleatorios.
Caracteres
La mayora de las veces, si usted est utilizando un valor de carcter individual, utilizar el tipo
primitivo char. Por ejemplo:
char ch = 'a';
// Unicode for uppercase Greek omega character
char uniChar = '\u03A9';
// an array of chars
char[] charArray = { 'a', 'b', 'c', 'd', 'e' };
Hay veces, sin embargo, cuando tienes que usar un char como un objeto por ejemplo, como un
argumento de mtodo donde se espera un objeto. El lenguaje de programacin Java proporciona
una clase contenedora que "envuelve" el char en un objeto de Character para este propsito. Un
objeto de tipo Character contiene un solo campo, cuyo tipo es char. Esta clase de caracteres
tambin ofrece una serie de tiles clases (es decir, estticos) mtodos para manipular caracteres.
Puede crear un objeto de Character con el constructor de Character:
Nota: La clase de Character es inmutable, de modo que una vez que se crea, no se puede
cambiar un objeto de Character.
La tabla siguiente enumera algunos de los mtodos ms tiles en la clase de Character, pero no
es exhaustiva. Para una lista completa de todos los mtodos de esta clase (hay ms de 50),
consulte la especificacin java.lang.Character API.
Mtodos tiles en la clase de Character
Mtodo
Descripcin
boolean
isLetter(char ch)
boolean
isDigit(char ch)
boolean
isWhitespace(char
ch)
boolean
isUpperCase(char
ch)
boolean
isLowerCase(char
ch)
char
toUpperCase(char
ch)
char
toLowerCase(char
ch)
toString(char ch)
Secuencias de escape
Un carcter precedido por una barra invertida (\) es una secuencia de escape y tiene un significado
especial para el compilador. La siguiente tabla muestra las secuencias de escape de Java:
Secuencias de escape
Secuencia
de escape
Descripcin
\t
\b
\n
\r
\f
\'
\"
\\
Cuando se encuentra una secuencia de escape en una instruccin print, el compilador lo interpreta
en consecuencia. Por ejemplo, si usted quiere poner citas entre comillas debe utilizar la secuencia
de escape, \ ", sobre las comillas interiores. Para imprimir la sentencia
Strings
Las strings, que son ampliamente utilizadas en programacin Java, son una secuencia de
caracteres. En el lenguaje de programacin Java, las strings son objetos.
La plataforma Java proporciona la clase String para crear y manipular cadenas.
Creacin de strings
Nota: La clase String es inmutable, de modo que una vez que se crea un objeto String no
puede cambiarse. La clase String tiene un nmero de mtodos, algunos de los cuales sern
discutidos ms abajo, que parecen modificar cadenas. Puesto que las cadenas son inmutables,
estos mtodos realmente qu es crear y devolver una cadena nueva que contiene el resultado de la
operacin.
Longitud de cadena
Mtodos utilizados para obtener informacin acerca de un objeto son conocidos como mtodos de
descriptor de acceso. Un mtodo de descriptor de acceso que se puede usar con las cadenas es el
mtodo length() , que devuelve el nmero de caracteres contenidos en el objeto string. Despus
de las dos lneas de cdigo siguientes han sido ejecutadas, len equivale a 17:
charArray[j] =
tempCharArray[len - 1 - j];
}
String reversePalindrome =
new String(charArray);
System.out.println(reversePalindrome);
}
}
Ejecutar el programa produce esta salida:
Concatenacin de cadenas
La clase String incluye un mtodo para concatenar dos cadenas:
string1.concat(string2);
Esto devuelve una nueva cadena que cadena1 con cadena2 aadida al final.
Tambin puede utilizar el mtodo concat() con los literales de cadena, como en:
"Hello, world!"
El + operador es ampliamente utilizado en las declaraciones print . Por ejemplo:
Nota: El lenguaje de programacin Java no permite literales para abarcar las lneas en archivos de
cdigo fuente, as que usted debe usar el + operador de concatenacin al final de cada lnea en una
cadena de mltiples lneas. Por ejemplo:
String quote =
"Now is the time for all good " +
"men to come to the aid of their country.";
Rompiendo cadenas entre lneas usando el + operador de concatenacin es, una vez ms, muy
comn en las declaraciones print .
String fs;
fs = String.format("The value of the float " +
"variable is %f, while " +
"the value of the " +
"integer variable is %d, " +
" and the string is %s",
floatVar, intVar, stringVar);
System.out.println(fs);
a
a
a
a
a
+
*
/
%
b
b
b
b
b
=
=
=
=
=
91.7
-82.7
392.4
0.0516055
4.5
Nota: Cada una de las subclases de Number que envuelven los tipos primitivos numricos tambin
proporciona un mtodo parseXXXX() (por ejemplo, parseFloat()) que puede utilizarse para
convertir cadenas en nmeros primitivos. Puesto que se devuelve un tipo primitivo en lugar de un
objeto, el mtodo parseFloat() es ms directo que el mtodo valueOf() . Por ejemplo, en el
programa ValueOfDemo , necesitamos:
float a = Float.parseFloat(args[0]);
float b = Float.parseFloat(args[1]);
int i;
// Concatenate "i" with an empty string; conversion is handled for
you.
String s1 = "" + i;
o
int i;
double d;
String s3 = Integer.toString(i);
String s4 = Double.toString(d);
El ejemplo ToStringDemo utiliza el mtodo toString para convertir a un nmero en una
cadena. Entonces, el programa utiliza algunos mtodos de cadena para calcular el nmero de
dgitos antes y despus del punto decimal:
Descripcin
String substring(int
beginIndex, int endIndex)
String substring(int
beginIndex)
El cdigo siguiente obtiene desde el Palndromo Niagara la subcadena que se extiende desde ndice
11, pero no incluyendo, ndice 15, que es el palabra "rugido":
Descripcin
CharSequence subSequence(int
beginIndex, int endIndex)
String trim()
String toLowerCase()
String toUpperCase()
Descripcin
boolean contains(CharSequence s)
Nota: CharSequence es una interfaz implementada por la clase String . Por lo tanto, puede
utilizar una cadena como argumento para el mtodo contains() .
Descripcin
String replace(CharSequence
target, CharSequence replacement)
Un ejemplo
La clase siguiente, Filename, ilustra el uso de lastIndexOf() y substring() a aislar las
diferentes partes de un nombre de archivo.
Nota: Los mtodos en la clase siguiente de Filename no hacer ninguna comprobacin de errores
y asumir que su argumento contiene una ruta de directorio completo y un nombre de archivo con la
extensin. Si estos mtodos fueron cdigo de produccin, verificara que sus argumentos fueron
construidos correctamente.
Extension = html
Filename = index
Path = /home/user
Como se muestra en la figura siguiente, nuestro mtodo de extension utiliza lastIndexOf para
localizar la ltima aparicin del punto (.) en el nombre del archivo. Luego substring utiliza el valor
devuelto de lastIndexOf para extraer la extensin de nombre de archivo es decir, la
subcadena de la poca hasta el final de la cadena. Este cdigo asume que el nombre de archivo
tiene un perodo Si el nombre del archivo no tiene un perodo, lastIndexOf devuelve -1, y el
mtodo substring lanza un StringIndexOutOfBoundsException.
Adems, observe que el mtodo de extension utiliza dot + 1 como argumento de substring.
Si el personaje perodo (..) es el ltimo carcter de la cadena, dot + 1 es igual a la longitud de la
cadena, que es uno ms grande que el mayor ndice en la cadena (porque los ndices comienzan en
0). Este es un argumento legal para substring porque ese mtodo acepta un ndice igual, pero no
superior a la longitud de la cadena y lo interpreta en el sentido de "el final de la cadena".
Descripcin
int compareTo(String
anotherString)
int compareToIgnoreCase(String
str)
boolean equalsIgnoreCase(String
anotherString)
boolean regionMatches(int
toffset, String other, int
ooffset, int len)
boolean regionMatches(boolean
ignoreCase, int toffset, String
other, int ooffset, int len)
La clase StringBuilder
Objetos StringBuilder son como objetos String, excepto que se puede modificar.
Internamente, estos objetos son tratados como arrays de longitud variable que contienen una
secuencia de caracteres. En cualquier momento, la longitud y el contenido de la secuencia
pueden ser cambiados a travs de invocaciones de mtodo.
Las strings siempre deben ser usadas a menos que los constructores de cadenas ofrecen una
ventaja en trminos de cdigo ms simple (ver el programa muestra al final de esta seccin) o mejor
rendimiento. Por ejemplo, si necesitas concatenar un gran nmero de cadenas, anexar un
objeto StringBuilder es ms eficiente
Longitud y capacidad
La clase StringBuilder, como la clase String , tiene un mtodo length() que devuelve la
longitud de la secuencia de caracteres en el constructor.
A diferencia de las cuerdas, cada constructor string tambin tiene una capacidad, el nmero de
espacios de carcter que han sido asignados. La capacidad, que es devuelto por el mtodo
capacity(), es siempre mayor o igual a la longitud (generalmente mayor) y se expandir
automticamente segn sea necesaria para acomodar las adiciones al constructor string.
StringBuilder Constructores
Constructor
Descripcin
StringBuilder()
StringBuilder(CharSequence cs)
StringBuilder(int initCapacity)
StringBuilder(String s)
sb.append("Greetings");
producir un constructor de cadena con una longitud de 9 y una capacidad de 16 aos:
La clase StringBuilder tiene algunos mtodos relacionados con la longitud y capacidad que no
tiene la clase String :
Longitud y capacidades mtodos
Mtodo
Descripcin
void ensureCapacity(int
minCapacity)
Operaciones de StringBuilder
Las principales operaciones en un StringBuilder que no estn disponibles en String son los
mtodos append() y insert() , que estn sobrecargados para aceptar datos de cualquier tipo.
Cada uno convierte su argumento en una cadena y luego anexa o inserta los caracteres de la
cadena a la secuencia de caracteres en el configurador de cadena. El mtodo append agrega
siempre estos personajes al final de la secuencia de caracteres existentes, mientras que el mtodo
insert aade los caracteres en un punto especificado.
Aqu estn varios de los mtodos de la clase StringBuilder .
Varios mtodos de StringBuilder
Mtodo
StringBuilder append(boolean b)
StringBuilder append(char c)
StringBuilder append(char[] str)
StringBuilder append(char[] str,
int offset, int len)
StringBuilder append(double d)
StringBuilder append(float f)
StringBuilder append(int i)
StringBuilder append(long lng)
Descripcin
StringBuilder reverse()
String toString()
Un ejemplo
El programa StringDemo que se enumera en la seccin titulada "Strings" es un ejemplo de un
programa que sera ms eficaz si se utilizaron un StringBuilder en lugar de una String.
// reverse it
System.out.println(sb);
}
}
Ejecutar este programa produce el mismo resultado:
System.out.println(sb);
porque sb.toString() se llama implcitamente, como es con cualquier otro objeto en una
invocacin println() .
Nota: Tambin hay una clase StringBuffer que es exactamente el mismo que el
StringBuilder clase, excepto que es segura para subprocesos en virtud de tener sus mtodos
sincronizados. Hilos de rosca se discutir en la leccin en simultaneidad.
Autoboxing y Unboxing
Autoboxing es la conversin automtica que hace que el compilador de Java entre los tipos
primitivos y sus correspondientes clases contenedoras de objeto. Por ejemplo, convertir un int a un
nmero entero, un doble con un dobley as sucesivamente. Si la conversin va al revs, esto
se llama unboxing.
Aqu es el ejemplo ms simple de autoboxing:
Character ch = 'a';
El resto de los ejemplos de esta seccin utilizar medicamentos genricos. Si todava no ests
familiarizado con la sintaxis de los genricos, vea la leccin de los medicamentos genricos
(actualizado) .
Considere el siguiente cdigo:
li.add(i);
Aunque agrega los valores int tipos primitivos, sino como objetos enteros , a li, el cdigo se
compila. Li es una lista de objetos enteros , no una lista de valores int , se preguntarn por qu
el compilador de Java no emite un error en tiempo de compilacin. El compilador no generar un
error porque se crea un objeto Integer de i y agrega el objeto a li. Por lo tanto, el compilador
convierte el cdigo anterior al siguiente en tiempo de ejecucin:
Pasa como parmetro a un mtodo que espera un valor del tipo primitivo correspondiente.
Asignado a una variable del tipo primitivo correspondiente.
import java.util.ArrayList;
import java.util.List;
public class Unboxing {
public static void main(String[] args) {
absolute value of -8 = 8
pi = 3.1416
Autoboxing y unboxing permite los desarrolladores escribir limpiador el cdigo, hacindolo ms fcil
de leer. La tabla siguiente enumera los tipos primitivos y sus correspondientes clases contenedoras,
que son utilizados por el compilador de Java para autoboxing y unboxing:
Tipo primitivo Clase contenedora
Boolean
Boolean
Byte
Byte
Char
Personaje
flotador
Flotador
int
Nmero entero
largo
Largo
corto
Corto
doble
Doble