Introduccin a Java
a. historia e introduccin al lenguaje
b. importancia en el da de hoy
c. instalacin en Windows y Linux
- descarga
- configuracin
- verificacin de instalacin
- programa de ejemplo y su ejecucin: hola mundo
2. Conceptos bsicos de programacin OOP
a. objetos
b. clases
c. herencia
d. interfaces
e. paquetes
3. Elementos del lenguaje
a. Variables
- tipos de datos primitivos
- arreglos
- tipos de variables: de instancia, estticas o de clases, locales, parmetros
- definicin e inicializacin de variables
- convenciones de nomenclatura u otros
b. Operadores
- lista de operadores y su uso
- precedencia
c. Sentencias
- asignacin, invocacin de mtodos, creacin de objetos
- expresiones y bloques de cdigo
- sentencias de control de flujo
- sentencias de bucle (loop)
d. Clases
- constructores
- mtodos
- this
- overloading y overriding
e. Modificadores
- de acceso y otros
- variables y mtodos
1. Introduccin a Java
1. Introduccin a Java
a. historia e introduccin al lenguaje
b. importancia en el da de hoy
c. instalacin en Windows y Linux
- descarga
- configuracin
- verificacin de instalacin
- programa de ejemplo y su ejecucin: hola mundo
2. Conceptos bsicos de programacin OOP
La POO se puede definir como una forma de programar aplicaciones informticas que
representa acciones o cosas de la vida basada en objetos. Existen ciertos conceptos que
la identifican y se mencionan a continuacin:
a. objetos
Los objetos son una instancia de una clase.
Son entidades que tienen un determinado estado, comportamiento (mtodo) e identidad:
- el estado esta compuesto de datos, son atributos a los que se le asignan valores.
- El comportamiento esta definido por Metodos, es decir que operaciones puede
realizar.
- La identidad es una propiedad nica que representa al objeto y lo diferencia del
resto.
b. clases
Son estructuras o plantillas que describen las caractersticas y el comportamiento de un
conjunto de objetos.
Una clase se compone de 3 partes:
- Nombre: contiene el nombre de la clase.
- Atributos: propiedades que caracterizan a la clase.
- Mtodos: comportamiento u operaciones, la forma como interactua la clase con
su entorno.
c. herencia
Es la creacin de nuevas clases basadas en clases ya existentes
Se obtienen caractersticas de las clases padres (heredando atributos y mtodos)
En Java solo se puede heredar de una sola clase padre y se representa mediante la
palabra extends.
Ejemplo:
public class Animal{
public String tamao;
public void comer(){
/**Comportamiento.....*/
}
}
class Perro extends Animal{
public int dientes;
public void correr(){
/**Comportamiento.....*/
}
}
class Paloma extends Animal{
public int plumas;
public void volar(){
/**Comportamiento.....*/
}
d. interfaces
Las interfaces son el mecanismo que utiliza Java para simular la herencia mltiple.
Las interfaces definen lo que la clase que la implemente deber hacer, mas no la forma
como lo har (es comn relacionarlas con un contrato en el que se define que se debe
hacer, as cada clase concreta que implemente una interfaz esta obligada a implementar
todos los mtodos que la compongan)
La implementacin de los mtodos depende de las clases concretas que las usen.
Se debe tener en cuenta que toda variable definida en una interfaz automticamente se
convierte en una constante, adems tampoco se puede instanciar una interfaz.
En java se representan con la palabra interface y se usan con la palabra implements as:
interface InterfacePrincipal {
public void metodoAbstracto();
public String otroMetodoAbstracto();
}
public class Principal implements InterfacePrincipal{
public void metodoAbstracto() {
/**Implementacin definida por la clase concreta*/
}
public String otroMetodoAbstracto() {
/**Implementacin definida por la clase concreta*/
return "retorno";
}
}
e. paquetes
Los paquetes pueden agrupar clases.
Este nivel de acceso no tiene un nombre preciso, pero est indicado por la
ausencia de algn modificador de acceso en una declaracin.
Las declaraciones hasta hoy utilizadas en este curso son de este tipo y lucen as:
Todas las variables han de declararse antes de usarlas, la declaracin consiste en una
sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Una
vez declarada se le podr asignar valores.
- tipos de datos primitivos
Tipo
Descripcion
boolean
char
Caracteres Unicode de 16 bits Los caracteres alfa-numricos son los mismos que los
ASCII con el bit alto puesto a 0. El intervalo de valores va desde 0 hasta 65535
(valores de 16-bits sin signo).
byte
short
Tamao 16 bits. El intervalo de valores va desde -215 hasta 215-1 (-32768 a 32767)
int
long
Tamao 64 bits. El intervalo de valores va desde -263 hasta 263-1 (9223372036854775808 a 9223372036854775807)
float
Tamao 32 bits. Nmeros en coma flotante de simple precisin. Estndar IEEE 7541985 (de 1.40239846e45f a 3.40282347e+38f)
double
Tamao 64 bits. Nmeros en coma flotante de doble precisin. Estndar IEEE 7541985. (de 4.94065645841246544e324d a 1.7976931348623157e+308d.)
Caracteres
En Java los caracteres no estn restringidos a los ASCII sino son Unicode. Un carcter
est siempre rodeado de comillas simples como 'A', '9', '', etc. El tipo de dato char
sirve para guardar estos caracteres.
Un tipo especial de carcter es la secuencia de escape, similares a las del lenguaje C/C+
+, que se utilizan para representar caracteres de control o caracteres que no se
imprimen. Una secuencia de escape est formada por la barra invertida (\) y un carcter.
En la siguiente tabla se dan las secuencias de escape ms utilizadas.
Carcter
Secuencia de escape
retorno de
carro
\r
tabulador
horizontal
\t
nueva lnea
\n
barra
invertida
\\
- arreglos
Cada espacio del arreglo guarda un elemento individual y se pueden colocar los
elementos o cambiar el contenido de esos espacios segn se necesite.
Los arreglos pueden tener cualquier tipo de valor de elemento (tipos primitivos u
objetos), pero no se pueden almacenar diferentes tipos en un solo arreglo.
. Ejemplos:
String palabrasDifciles[ ];
int temps[ ];
. Ejemplos:
String[ ] palabrasDifciles;
int[ ] temps;
CREACION DE OBJETOS DE ARREGLO
Usar new
Inicializar de manera directa el contenido de ese arreglo.
El primero implica el uso del operador new para crear una nueva instancia de un
arreglo:
Esta lnea crea un nuevo arreglo de Strings con diez slots (casillas) conteniendo
los elementos.
Cuando se crea un nuevo objeto de arreglo con new se deben indicar cuntas
casillas tendr ese arreglo.
Cuando se crea un objeto de arreglo mediante el uso de new, todas sus casillas se
inicializan con algn valor: 0 para arreglos numricos, false para booleanos, `\0'
para arreglos de caracteres y null para objetos.
En lugar de utilizar new, se encierran los elementos del arreglo dentro de llaves,
separados por comas:
Cada elemento dentro del arreglo dentro de las llaves debe ser del mismo tipo y
debe coincidir con el tipo de la variable que contiene ese arreglo.
arreglo[subndice];
Los subndices (subscripts) de arreglos inician con 0, por lo que un arreglo con
10 elementos, tendr diez casillas a las cuales se puede tener acceso al utilizar
los subndices del 0 al 9.
Cuando se usan arreglos, se revisan todos los subndices del arreglo para
asegurarse de que estn dentro de su frontera: igual o mayor a cero y menor o
igual a n-1, donde n es la longitud del arreglo, ya sean cuando se compila el
programa o cuando se ejecuta.
En Java no se puede tener acceso a asignar un valor a una casilla del arreglo
fuera de las fronteras de ste. Ejemplo:
Este ltimo enunciado produce un error de compilacin puesto que el arreglo arr
slo tiene 10 casillas, numeradas de 0 a 9. El elemento arr[10] no existe.
arreglo[1] = 15;
sentencia[0] = El;
sentencia[10] = sentencia[0];
ARREGLOS MULTIDIMENSIONALES
Las variables de clase son similares a las de instancia, con la diferencia de que
sus valores se aplican a todas las instancias de clase (y a la misma clase), en
lugar de tener diferentes valores para cada objeto.
return area;
}
Delante del nombre de cada variable se ha de especificar el tipo de variable que hemos
destacado en letra negrita. Las variables pueden ser
Un array
Declarar
Inicializar
Usar
Identificadores
Un identificador es un nombre que identifica a una variable, a un mtodo o funcin
miembro, a una clase. Todos los lenguajes tienen ciertas reglas para componer los
identificadores:
Adems de estas restricciones, hay ciertas convenciones que hacen que el programa sea
ms legible, pero que no afectan a la ejecucin del programa. La primera y fundamental
es la de encontrar un nombre que sea significativo, de modo que el programa sea lo ms
legible posible. El tiempo que se pretende ahorrar eligiendo nombres cortos y poco
significativos se pierde con creces cuando se revisa el programa despus de cierto
tiempo.
Tipo de
Convencin
identificador
Ejemplo
String, Rectangulo,
CinematicaApplet
nombre de
funcin
calcularArea, getValue,
setColor
nombre de
variable
nombre de
constante
En letras
maysculas
PI, MAX_ANCHO
b. Operadores
- lista de operadores y su uso
Java proporciona un amplio conjunto de operadores, que se pueden dividir en los cuatro
grupos
siguientes: aritmticos, a nivel de bit, relacionales y lgicos.
Operadores aritmticos
Los operadores aritmticos se utilizan en expresiones matemticas de la misma forma
que son
utilizados en lgebra. En la siguiente tabla se da un listado de los operadores
aritmticos:
Operador
Resultado
+
*
/
%
++
+=
=
*=
/=
%=
Suma
Resta (tambin es el menos unario)
Multiplicacin
Divisin
Mdulo
Incremento
Suma y asignacin
Resta y asignacin
Multiplicacin y asignacin
Divisin y asignacin
Mdulo y asignacin
Decremento
Los operandos de los operadores aritmticos deben ser del tipo numrico. No se pueden
utilizar
sobre operandos del tipo boolean, pero s sobre operadores del tipo char, ya que el tipo
char de Java es, esencialmente, un subconjunto de int.
// Ejemplo del funcionamiento de los operadores aritmticos bsicos.
c1ass BasicMat {
pub1ic static void main(String args[]) {
// aritmtica utilizando enteros
System.out.print1n("Aritmtica de Enteros");
int a = 1 + 1;
int b = a * 3;
int c = b / 4;
int d = c a;
int e = d;
System.out.print1n("a = " +a);
System.out.print1n("b = " +b);
System.out.print1n("c = " +c);
System.out.print1n("d = " +d);
System.out.print1n("e = " +e);
// Aritmtica utilizando el tipo doble
System.out.println(\nAritmtica de Punto F1otante);
doub1e da = 1 + 1;
doub1e db = da * 3;
doub1e dc = db / 4;
doub1e dd = dc a;
doub1e de = dd;
System.out.print1n("da = " + da);
System.out.print1n("db = " + db);
System.out.print1n("dc = " + dc);
System.out.print1n("dd = " + dd);
System.out.print1n("de = " + de);
}
}
Operador
Resultado
~
&
|
^
>>
>>>
<<
&=
|=
^=
>>=
>>>=
<<=
Ya que los operadores a nivel de bit manipulan los bits en un entero, es importante
comprender qu efectos pueden tener esas manipulaciones sobre el valor.
Concretamente, es
til conocer cmo almacena Java los valores enteros y cmo representa nmeros
negativos. As
que antes de continuar, revisemos brevemente estos dos temas.
Todos los tipos enteros se representan mediante nmeros binarios con un nmero
distinto de bits. Por ejemplo, el valor 42, para el tipo byte, en binario es 00101010,
donde
cada posicin representa una potencia de dos, comenzando con 20 para el bit situado
ms a la
derecha. El siguiente bit a la izquierda sera 21, o 2, continuando hacia la izquierda con
22, o 4, y
seguidamente 8, 16, 32, etc. De esta forma, 42 tiene un valor 1 en los bits de las
posiciones 1, 3
y 5 (contando desde 0 a partir de la derecha); as que 42 es la suma de 21 + 23 + 25, es
decir, 2 + 8
+ 32.
Todos los tipos enteros excepto char son enteros con signo. Esto significa que pueden
representar tanto valores positivos como valores negativos. Java utiliza una codificacin
denominada complemento a dos, lo que significa que los nmeros negativos se
representan
invirtiendo (cambiando los unos por ceros y viceversa) todos los bits en el valor y
aadiendo un
1 al resultado. Por ejemplo, 42 se representa invirtiendo todos los bits de 42, o
00101010, lo que
da lugar a 11010101, y aadiendo 1 se produce el resultado final 11010110, o 42. Para
decodificar un nmero negativo, primero se invierten todos sus bits, y luego se suma 1.
Invirtiendo por ejemplo los bits de 42, o 11010110, se obtiene 00101001, o 41,
entonces
aadiendo 1 se obtiene 42.
Los operadores lgicos a nivel de bit son &, |, ^ y ~. La siguiente tabla muestra el
resultado de
cada operacin. En la siguiente discusin, hay que tener en cuenta que los operadores a
nivel de
B
0
0
1
1
A|B
0
1
1
1
A&B
0
0
0
1
A^B
0
1
1
0
~A
1
0
1
0
El operador NOT
El operador NOT unario, ~, tambin denominado complemento a nivel de bit, invierte
todos los
bits de su operando. Por ejemplo, al aplicar el operador NOT al nmero 42, que tiene la
siguiente
representacin:
00101010
se obtiene
11010101
despus de que el operador NOT es aplicado.
El operador AND
El operador AND, &, produce un bit 1 si ambos operandos son 1, y un 0 en el resto de
los casos.
Como ejemplo:
00101010 42
& 00001111 15
00001010 10
El operador OR
El operador OR, |, combina los bits de manera tal que si uno de los bits del operando es
un 1,
entonces el bit resultante es un 1, tal y como se muestra a continuacin:
00101010 42
| 00001111 15
00101111 47
El operador XOR
El operador XOR, ^, combina los bits de tal forma que si exactamente uno de los
operandos
es 1, entonces el resultado es 1. En el resto de los casos el resultado es 0. El siguiente
ejemplo
sirve para ver el efecto del operador ^. Este ejemplo tambin demuestra un atributo til
de
la operacin XOR. Observe cmo se invierte el patrn de bits de 42 siempre que el
segundo
operando tenga un bit 1. Sin embargo, si el segundo operando tiene un bit 0, el primer
operando
no cambia. Esta propiedad es til en determinadas manipulaciones de bits.
00101010 42
^ 00001111 15
00100101 37
Operadores relacionales
Los operadores relacionales determinan la relacin que un operando tiene con otro.
Especficamente, determinan relaciones de igualdad y orden. A continuacin se
muestran los
operadores relacionales:
Operador
==
!=
Resultado
Igual a
Diferente de
>
<
>=
<=
Mayor que
Menor que
Mayor o igual que
Menor o igual que
Resultado
AND lgico
OR lgico
XOR lgico (OR exclusivo)
OR en cortocircuito
AND en cortocircuito
NOT lgico unario
Asignacin AND
Asignacin OR
Asignacin XOR
Igual a
Diferente de
if-then-else ternario
Los operadores lgicos booleanos, &, | , y ^, operan sobre valores del tipo boolean de
la misma forma que operan sobre los bits de un entero. El operador lgico !, invierte el
estado
booleano: !true == false y !false== true. La siguiente tabla muestra el resultado de
cada
operacin lgica:
A
False
true
False
true
B
False
False
true
true
A|B
False
true
true
true
A&B
False
False
False
true
A^B
False
true
true
False
!A
true
False
true
false
El operador de asignacin
Aunque el operador de asignacin se ha estado utilizando desde el Captulo 2, en este
momento
se puede analizar de manera ms formal. El operador de asignacin es un solo signo
igual, =. Este
operador se comporta en Java del mismo modo que en otros lenguajes de programacin.
Tiene la
forma general:
var = expresin;
donde el tipo de la variable var debe ser compatible con el tipo de expresin.
El operador de asignacin tiene un atributo interesante con el que puede que no est
familiarizado: permite crear una cadena de asignaciones. Consideremos, por ejemplo,
este fragmento de cdigo:
int x, y, z;
x = y = z = 100; // asigna a x, y, y z el valor 100
Este cdigo, asigna a las variables x, y y z el valor 100 mediante una nica sentencia. Y
esto es as
porque el operador = es un operador que cede el valor de la expresin de la derecha.
Por tanto,
el valor de z =100 es 100, que entonces se asigna a y, y que a su vez se asigna a x.
Utilizar una
cadena de asignaciones es una forma fcil de asignar a un grupo de variables un valor
comn.
El operador de mdulo
El operador de mdulo, %, devuelve el residuo generado por una operacin de divisin.
Se
puede aplicar tanto a los tipos de punto flotante como a los tipos entero. El siguiente
programa
ejemplifica al operador %:
// Ejemplo del operador %.
class Modulo {
public static void main(String args[]) {
int x = 42;
double y = 42.25;
System.out.println("x mod 10 = " + x % 10 );
System.out.println("y mod 10 = " + y % l0 );
}
}
- precedencia
Precedencia de operadores
La Tabla 4.1 muestra el orden de precedencia de los operadores de Java, desde la ms
alta a la
ms baja. Observe que la primera fila presenta elementos a los que normalmente no se
considera
como operadores: parntesis, corchetes y el operador punto. Tcnicamente, stos son
llamados
separadores, pero ellos actan como operadores en una expresin. Los parntesis son
usados
para alterar la precedencia de una operacin. Despus de haber visto los captulos
anteriores,
ya sabemos que los corchetes se utilizan para indexar arreglos. El operador punto se
utiliza para
acceder a los elementos contenidos en un objeto y se discutir ms adelante.
El uso de parntesis
Los parntesis aumentan la prioridad de las operaciones en su interior. Esto es necesario
para
obtener el resultado deseado en muchas ocasiones. Consideremos la siguiente
expresin:
a >> b + 3
I
Precedencia
ms alta
()
[]
++
*
~
%
>>
>>>
<<
>
==
>=
!=
<
<=
&
^
|
&&
||
?:
=
op=
Sin embargo, si en primer lugar, se quiere desplazar a a la derecha las posiciones que
indique b, y despus aadir 3 al resultado, ser necesario utilizar parntesis.
(a >> b) + 3
c. Sentencias
Una sentencia es una orden que se le da al programa para realizar una tarea especfica,
esta puede ser: mostrar un mensaje en la pantalla, declarar una variable (para reservar
espacio en memoria), inicializarla, llamar a una funcin, etc. Las sentencias acaban con
;. este carcter separa una sentencia de la siguiente. Normalmente, las sentencias se
ponen unas debajo de otras, aunque sentencias cortas pueden colocarse en una misma
lnea. He aqu algunos ejemplos de sentencias
int i=1;
import java.awt.*;
System.out.println("El primer programa");
rect.mover(10, 20);
En cualquiera de los casos, despus del nombre se ponen entre parntesis los
argumentos que necesite el mtodo. Incluso si se trata de un mtodo que no tiene
parmetros declarados, se ponen los parntesis.
class ejemplo{
public static void main(Stringargs[]){
Alumnop=new Alumno();
double alfa;
//nombreObjeto.nombreMtodo(argumentos)
p.ponGrupo("33",Horario.MAANA);
//nombreObjeto.nombreMtodo()
p.imprime();
//nombreClase.nombreMetodo
alfa=Math.atan2(1,0);
}
}
Creacin de objetos:
Tal y como se acaba de explicar, cuando se crea una clase, se est creando un nuevo
tipo de datos
que se utilizar para declarar objetos de ese tipo. Sin embargo, la obtencin de objetos
de una
clase es un proceso que consta de dos etapas. En primer lugar, se debe declarar una
variable del
tipo de la clase. Esta variable no define un objeto, sino que simplemente es una
referencia a un
objeto. En segundo lugar, se debe obtener una copia fsica del objeto y asignarla a esa
variable.
Para ello se utiliza el operador new que asigna dinmicamente, durante el tiempo de
ejecucin,
memoria a un objeto y devuelve una referencia al mismo. Esta referencia es algo as
como la
direccin en memoria del objeto creado por la operacin new. Luego se almacena esta
referencia
en la variable. Todos los objetos de una clase en Java se asignan dinmicamente.
Veamos con ms
detalle este procedimiento.
En los ejemplos anteriores se utiliz una lnea similar a la siguiente para declarar un
objeto
de la clase Caja:
Caja miCaja = new Caja();
Esta sentencia combina las dos etapas descritas anteriormente y, para mostrar ms
claramente
cada una de ellas, dicha sentencia se puede volver a escribir del siguiente modo:
Caja miCaja; // declara la referencia a un objeto
miCaja = new Caja(); // reserva espacio en memoria para el objeto
condicin es falsa.
if (condicin){
sentencias
}else {
sentencias
}
while
Con este ciclo se repite una sentencia o un bloque mientras la condicin de control es
verdadera. Su forma general es:
while (condicin) {
// cuerpo del ciclo
}
La condicin puede ser cualquier expresin booleana. El cuerpo del ciclo se ejecutar
mientras la
expresin condicional sea verdadera. Cuando la condicin sea falsa, la ejecucin pasa a
la
siguiente lnea de cdigo localizada inmediatamente despus del ciclo. Las llaves no son
necesarias si solamente se repite una sentencia en el cuerpo del ciclo.
El ciclo while que se presenta a continuacin cuenta hacia atrs comenzando en 10 e
imprime exactamente diez lneas con la palabra tick:
// Ejemplo de un ciclo while.
class While {
public static void main (String args[]) {
int n = 3;
while (n > 0) {
System.out.println ("tick " + n);
n--;
}
}
}
sentencias
}
do-while
Como se acaba de ver, si la expresin condicional que controla un ciclo while es
inicialmente falsa,
el cuerpo del ciclo no se ejecutar ni una sola vez. Sin embargo, puede haber casos en
los que se
quiera ejecutar el cuerpo del ciclo al menos una vez, incluso cuando la expresin
condicional sea
inicialmente falsa. En otras palabras, puede que se desee evaluar la expresin
condicional al final
del ciclo, en lugar de hacerlo al principio. Afortunadamente, Java dispone de un ciclo que
lo hace
exactamente as, el ciclo do-while. El ciclo do-while ejecuta siempre, al menos una
vez, el cuerpo,
ya que la expresin condicional se encuentra al final. Su forma general es:
do {
// cuerpo del ciclo
} while (condicin);
En cada iteracin del ciclo do-while se ejecuta en primer lugar el cuerpo del ciclo, y a
continuacin se evala la expresin condicional. Si la expresin es verdadera, el ciclo se
repetir.
En caso contrario, el ciclo finalizar. Como en todos los dems ciclos de Java, la
condicin debe
ser una expresin booleana.
Las siguientes lneas son un ejemplo de un ciclo do-while. El ejemplo es otra versin del
programa tick y genera la misma salida que se obtuvo anteriormente.
// Ejemplo del ciclo do-while.
class DoWhile {
public static void main (String args[]) {
int n = 3;
do {
System.out.println ("tick " + n);
n--;
} while (n > 0);
}
}
For
La forma general de la sentencia for tradicional es la siguiente:
for (inicializacin; condicin; iteracin) {
// cuerpo
}
El ciclo for acta como se describe a continuacin: cuando comienza, se ejecuta la
parte
de inicializacin. Generalmente, la inicializacin es una expresin que establece el valor
de
la variable de control del ciclo, que acta como un contador que lo controla. La
expresin de inicializacin se ejecuta una sola vez. A continuacin, se evala la
condicin, que debe ser una expresin booleana mediante la que, normalmente, se
compara la variable de control con un valor de referencia. Si la expresin es verdadera,
entonces se ejecuta el cuerpo del ciclo. Si es falsa, el ciclo finaliza. A continuacin se
ejecuta la parte correspondiente a la iteracin. Habitualmente sta es una expresin en
la que se incrementa o reduce el valor de la variable de control. Cada vez que se recorre
el ciclo, en primer lugar se vuelve a evaluar la expresin condicional, a continuacin se
ejecuta el cuerpo y despus la expresin de iteracin. Este proceso se repite hasta que
la expresin condicional sea falsa.
A continuacin otra versin del programa tick, ahora utilizando un ciclo for:
// Ejemplo del ciclo for
class ForTick {
public static void main (String args[]) {
int n;
for (n=3; n>0; n--)
System.out.println ("tick " + n);
}
}
Para calcular la suma, cada elemento en nums es ledo de forma secuencial del inicio al
final.
Esto se logra por la indexacin manual del arreglo nums, mediante la variable de
control de ciclo i.
El estilo for-each automatiza el ciclo for anterior. Especficamente, elimina la necesidad
de
establecer un contador de ciclo, declarar un valor de inicio y uno de fin, y manualmente
indexar
el arreglo. En lugar de esto, automticamente el ciclo recorre el arreglo completo,
obteniendo
un elemento a la vez en secuencia de principio al fin. Por ejemplo, a continuacin se
muestra el
programa anterior utilizando el estilo del ciclo for-each:
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
int sum = 0
for (int x: nums) sum += x;
d. Clases
Las clases son el ncleo de Java. Es la construccin lgica sobre la que se basa el
lenguaje
Java porque define la forma y naturaleza de un objeto. De tal forma que son la base de
la
programacin orientada a objetos en Java. Cualquier concepto que se quiera
implementar en
Java debe estar encapsulado dentro de una clase.
Probablemente la caracterstica ms importante de una clase es que define un nuevo
tipo de
dato. Una vez definido, este nuevo tipo de dato se puede utilizar para crear objetos de
ese tipo o
clase. De este modo, una clase es un template (un modelo) para un objeto, y un objeto
es una instancia de una clase. Debido a que un objeto es una instancia de una clase, a
menudo las dos palabras objeto e instancia se usan indistintamente.
EJ:
class nombre_de_clase {
tipo variable_de:instancia1;
tipo variable_de_instancia2;
// ...
tipo variable_de_instanciaN;
tipo nombre_de_mtodo1 (parmetros) {
// cuerpo del mtodo
}
tipo nombre_de_mtodo2 (parmetros) {
// cuerpo del mtodo
}
// ...
tipo nombre_de_metodoN (parmetros) {
// cuerpo del mtodo
}
}
Los datos, o variables, definidos en una clase se denominan variables de instancia. El
cdigo est
contenido en los mtodos. El conjunto de los mtodos y las variables definidos dentro de
una
clase se denominan miembros de la clase. En la mayor parte de las clases, los mtodos
definidos
acceden y actan sobre las variables de instancia, es decir, los mtodos determinan
cmo se
deben utilizar los datos de una clase.
- una clase define un nuevo tipo de dato. En este caso, el nuevotipo se llama Caja.
Utilizaremos este nombre para declarar objetos de tipo Caja.
- Es importante recordar que la declaracin de una clase solamente crea un modelo o
patrn y no un objeto real.
- Para crear un objeto de tipo Caja habr que utilizar una sentencia como la siguiente:
Caja miCaja = new Caja(); // crea un objeto de la clase Caja llamado miCaja
Caja miCaja; // declara la referencia a un objeto
miCaja = new Caja(); // reserva espacio en memoria para el objeto
- Cuando se ejecute esta sentencia, miCaja ser una referencia a una instancia de Caja.
Cada vez que creemos una instancia de una clase, estaremos creando un objeto que
contiene su propia copia de cada variable de instancia definida por la clase. Por lo tanto,
cada
objeto Caja contendr sus propias copias de las variables de instancia ancho, alto y
largo. Para
acceder a estas variables, utilizaremos el operador punto (.). El operador punto liga el
nombre del
objeto con el nombre de una de sus variables de instancia.
EJ:
miCaja.ancho = 100;
- constructores
- mtodos
las clases estn formadas por variables de instancia y mtodos.
La forma general de un mtodo es la siguiente:
tipo nombre_de_mtodo (parmetros) {
// cuerpo del mtodo
}
Donde tipo especifica el tipo de dato que devuelve el mtodo, el cual puede ser
cualquier tipo
vlido, incluyendo los tipos definidos mediante clases creadas por el programador.
Cuando el
mtodo no devuelve ningn valor, el tipo devuelto debe ser void. El nombre del mtodo
se
especifica en nombre_de_mtodo, que puede ser cualquier identificador vlido que sea
distinto
de los que ya estn siendo utilizados por otros elementos del programa. Los parmetros
son
una sucesin de pares de tipo e identificador separados por comas. Los parmetros son,
esencialmente, variables que reciben los valores de los argumentos que se pasa a los
mtodos
cuando se les llama. Si el mtodo no tiene parmetros, la lista de parmetros estar
vaca.
Los mtodos que devuelven un tipo diferente del tipo void devuelven el valor a la rutina
llamante mediante la siguiente forma de la sentencia return:
return valor;
Donde valor es el valor que el mtodo retorna.
Devolucin de un valor
La implementacin del mtodo volumen( ) realiza el clculo del volumen de una caja
dentro de
la clase Caja a la que pertenece, sin embargo esta implementacin no es la mejor. Por
ejemplo,
puede ser un problema si en otra parte del programa se necesita el valor del volumen
de la caja,
pero sin que sea necesario presentar dicho valor. Una mejor forma de implementar el
mtodo
volumen( ) es realizar el clculo del volumen y devolver el resultado a la parte del
programa que
llama al mtodo. En el siguiente ejemplo, que es una versin mejorada del programa
anterior, se
hace eso.
// Ahora volumen() devuelve el volumen de una caja.
class Caja {
double ancho;
double alto;
double largo;
// clculo y devolucin del valor
double volumen() {
return ancho * alto * largo;
}
}
class CajaDemo4 {
public static void main (String args[]) {
Caja miCajal = new Caja();
Caja miCaja2 = new Caja();
double vol;
// se asigna valores a las variables de instancia de miCaja1
miCaja1.ancho = 10;
miCaja1.alto = 20;
miCaja1.largo = 15;
/* se asigna diferentes valores a las variables
de instancia de miCaja2 */
miCaja2.ancho = 3;
miCaja2.alto = 6;
miCaja2.largo = 9;
// se obtiene el volumen de la primera caja
vol = miCajal. volumen ();
System.out.println ("El volumen es " + vol);
// se obtiene el volumen de la segunda caja
vol = miCaja2 .volumen ();
System.out.println ("El volumen es " + vol);
}
}
- this
PALABRA CLAVE this
Es usada para referirse al objeto actual, aquel objeto que el mtodo llam.
Tambin se usa para referirse a las variables de instancia de ese objeto o para
pasar el objeto actual como un argumento a otro mtodo.
Si bien normalmente ser ms sencillo utilizar nombres diferentes, this permite hacer
- overloading y overriding
Cuando en una clase, declaramos mas de una vez el mismo mtodo pero,
con diferente nmero de argumentos y de diferentes tipos, con
igual o diferente tipo de retorno, a eso le llamamos sobrecarga.
Cuando una clase hereda de otra, y en esta clase hija se redefine el
mtodo, pero la implementacin es distinta a la de la clase padre, a
esto le llamamos sobre-escritura.
Se utiliza la clase Animal y Caballo para ejemplificar.
Tenemos la clase animal con la siguiente estructura:
public class Animal {
public void comer(){
System.out.println("Accion de comer, genrica de un animal");
}
public void crecer(){
System.out.println("Accion de crecer, genrica de un animal");
}
}
La clase Animal tiene definidos los mtodos comer y crecer, ambos son
publicos y no devuelven ningn valor, ahora declaramos la clase Caballo
que heredar de Animal:
public class Caballo extends Animal{
}
La clase Caballo, hereda todas las caractersticas de Animal, por lo tanto en
primer instancia, Caballo tambin posee los mtodos comer y crecer.
Sobrecargar
Lo que heremos en este momento es sobrecargar uno o los dos mtodos de
la clase Animal en la clase Caballo, veamos.
public class Caballo extends Animal{
//Notemos que ambos mtodos han sido declarados en la superclase
//pero en esta clase hija se estan redefiniendo y
//colocando argumentos distintos al de la clase padre
}
@Override
public void crecer(){
System.out.println("Ahora esta es la sobre-escritura del mtodo crecer
original en la clase hija");
}
@Override
public void crecer(long altura, long peso){
System.out.println("Esta es la sobre-escritura del mtodo crecer que
recibe dos parametros en la clase hija");
}
}
Vemos que tenemos la sobre-escritura tanto de los mtodos originales como
los sobrecargados en la clase padre, notemos tambin que podemos
combinar la sobrecarga y la sobre-escritura de los mtodos.
Observacin: En la misma clase solamente podemos sobre-cargar mtodos,
pero no sobre-escribirlos, la sobre-escritura solo se da con la herencia, es
decir, solo en las clases hijas podremos implementar el concepto de
sobre-escritura.
2)
3)
4)
5)
Method Overriding
Method overriding is used to
provide the specific
Method overloading is used to increase the
implementation of the method that
readability of the program.
is already provided by its super
class.
Method overriding occurs in two
Method overloading is performed within class. classes that have IS-A
(inheritance) relationship.
In case of method overloading, parameter must In case of method overriding,
be different.
parameter must be same.
Method overloading is the example of compile Method overriding is the example
time polymorphism.
of run time polymorphism.
In java, method overloading can't be performed
by changing return type of the method only.
Return type must be same or
Return type can be same or different in method
covariant in method overriding.
overloading. But you must have to change the
parameter.
4. }
e. Modificadores
- de acceso y otros
clase puede acceder a los miembros privados de otro objeto de la misma clase, por lo
que algo como lo siguiente sera perfectamente vlido:
view plaincopy to clipboardprint?
1. class MiObjeto {
2.
3.
4.
MiObjeto(MiObjeto otro) {
5.
valor = otro.valor;
6.
7. }
El modificador protected, por ltimo, indica que los elementos slo pueden ser
accedidos desde su mismo paquete (como el acceso por defecto) y desde cualquier clase
que extienda la clase en que se encuentra, independientemente de si esta se encuentra en
el mismo paquete o no. Este modificador, como private, no tiene sentido a nivel de
clases o interfaces no internas.
final
Indica que una variable, mtodo o clase no se va a modificar, lo cul puede ser til para
aadir ms semntica, por cuestiones de rendimiento, y para detectar errores.
Si una variable se marca como final, no se podr asignar un nuevo valor a la variable.
Si una clase se marca como final, no se podr extender la clase. Si es un mtodo el que
se declara como final, no se podr sobreescribir.
1. public class Ejemplo {
2.
3.
4.
cadena.concat(" mundo");
5.
6. }
DEFAULT:
Si no elegimos ningn modificador, se usa el de por defecto, que slo puede ser
accedido por clases que estn en el mismo paquete.
PUBLIC:
Este nivel de acceso permite a acceder al elemento desde cualquier clase,
independientemente de que esta pertenezca o no al paquete en que se encuentra el
elemento.
PRIVATE:
Es el modificador ms restrictivo y especifica que los elementos que lo utilizan slo
pueden ser accedidos desde la misma clase en la que se encuentran. Este
modificador slo puede utilizarse sobre los miembros de una clase y sobre interfaces y
clases internas, no sobre clases o interfaces de primer nivel, dado que esto no tendra
sentido.
PROTECTED:
Indica que los elementos slo pueden ser accedidos desde su mismo paquete y desde
cualquier clase que extienda la clase en que se encuentra, independientemente de si
esta se encuentra en el mismo paquete o no. Este modificador, como private, no tiene
sentido a nivel de clases o interfaces no internas.
En otras palabras, si determinada clase Hijo hereda el comportamiento de una clase
Padre, la clase Hijo tendr acceso a todos aquellos campos/mtodos definidos como
protected en Padre, pero no aquellos declarados como private en Padre.
- variables y mtodos
STATIC:
Sirve para crear miembros que pertenecen a la clase, y no a una instancia de la clase.
Esto implica, entre otras cosas, que no es necesario crear un objeto de la clase para
poder acceder a estos atributos y mtodos.
En ocasiones es necesario o conveniente generar elementos que tomen un mismo valor
para cualquier nmero de instancias generadas o bien invocar/llamar mtodos sin la
necesidad de generar instancias, y es bajo estas dos circunstancias que es empleado el
calificador static.
Dos aspectos caractersticos de utilizar el calificador static en un elemento Java son los
siguientes:
- No puede ser generada ninguna instancia (uso de new) de un elemento static puesto
que solo existe una instancia.
- Todos los elementos definidos dentro de una estructura static deben ser static ellos
mismos, o bien, poseer una instancia ya definida para poder ser invocados.
NOTA: Lo anterior no implica que no puedan ser generadas instancias dentro de un
elemento static; no es lo mismo llamar/invocar que crear/generar.
FINAL:
Indica que una variable, mtodo o clase no se va a modificar, lo cul puede ser til para
aadir ms semntica, por cuestiones de rendimiento, y para detectar errores.
- Si una variable se marca como final, no se podr asignar un nuevo valor a la
variable.
- Si una clase se marca como final, no se podr extender la clase.
- Si es un mtodo el que se declara como final, no se podr sobreescribir.
Algo muy a tener en cuenta a la hora de utilizar este modificador es que si es un objeto
lo que hemos marcado como final, esto no nos impedir modificar el objeto en s, sino
tan slo usar el operador de asignacin para cambiar la referencia. Por lo tanto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NOTA: Una variable con modificadores static y final sera lo ms cercano en Java a las
constantes de otros lenguajes de programacin.
ABSTRACT:
La palabra clave abstract indica que no se provee una implementacin para un cierto
mtodo, sino que la implementacin vendr dada por las clases que extiendan la clase
actual. Una clase que tenga uno o ms mtodos abstract debe declararse como
abstract a su vez.
VOLATILE:
volatile es ms simple y ms sencillo que synchronized, lo que implica tambin un
mejor rendimiento. Sin embargo, volatile, a diferencia de synchronized, no
proporciona atomicidad (que o se ejecuten todos los pasos o ninguno), lo que puede
hacer que sea ms complicado de utilizar.
Una operacin como el incremento, por ejemplo, no es atmica. El operador de
incremento se divide en realidad en 3 instrucciones distintas (primero se lee la variable,
despus se incrementa, y por ltimo se actualiza el valor) por lo que algo como lo
siguiente podra causarnos problemas a pesar de que la variable sea volatile:
1
2
3
4
5
6
SYNCRHONIZED:
En caso de que necesitemos atomicidad podemos recurrir a synchronized o a cosas ms
avanzadas, como las clases del API java.util.concurrent de Java 5.
synchronized se diferencia de volatile entre otras cosas en que este modificador se
utiliza sobre bloques de cdigo y mtodos, y no sobre variables. Al utilizar
synchronized sobre un bloque se aade entre parntesis una referencia a un objeto que
utilizaremos a modo de lock.
?
1
2
3
4
5
6
7
8
9
10
11
12 public void synchronized aumentar() {
13 contador++;
14 }
15