Вы находитесь на странице: 1из 40

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
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

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
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.

El siguiente nivel de proteccin se lo hace justamente a nivel de paquete, esto es,


entre clases asociadas entre s, dentro de un sistema, una biblioteca o programa
(o cualquier otra agrupacin de clases relacionadas).

Este nivel de acceso no tiene un nombre preciso, pero est indicado por la
ausencia de algn modificador de acceso en una declaracin.

Algunas veces ha sido llamado con varios nombres sugerentes, incluidos


amigable y paquete. Este ltimo parece ser el ms apropiado y es el que
utilizaremos aqu.

Las declaraciones hasta hoy utilizadas en este curso son de este tipo y lucen as:

public class AlessPublicClass {


int aPackageInt = 2;
String aPackageString = a 1 and a ;
float aPackageMethod() { // no colocar modificador significa package
...
}
}
public class AclassInTheSamePackage {
public void testUse(){
AlessPublicClass aLPC = new AlessPublicClass();
System.out.println(aLPC.aPackageString + aLPC.aPackageInt);
ALPC.aPackageMethod();
}
}

package se convirti en el nivel de proteccin predeterminado porque cuando se


disea un gran sistema, se suelen dividir las clases en grupos de trabajo para
implantar partes ms pequeas, y las clases con frecuencia necesitan compartir
ms entre ellas que con el mundo exterior.

Si se desean detalles de implantacin que no se quiere compartir, se tiene que


usar otro nivel de proteccin.

3. Elementos del lenguaje


a. Variables
Una variable es un nombre que se asocia con una porcin de la memoria del ordenador,
en la que se guarda el valor asignado a dicha variable. Hay varios tipos de variables que
requieren distintas cantidades de memoria para guardar datos.

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

Tiene dos valores true o false.

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

Tamao 8 bits. El intervalo de valores va desde -27 hasta 27 -1 (-128 a 127)

short

Tamao 16 bits. El intervalo de valores va desde -215 hasta 215-1 (-32768 a 32767)

int

Tamao 32 bits. El intervalo de valores va desde -231 hasta 231-1 (-2147483648 a


2147483647)

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

Los arreglos son una forma de almacenar una lista de elementos.

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.

DECLARACION DE VARIABLES DE ARREGLO

Se declaran indicando el tipo de objeto que el arreglo contendr y el nombre del


arreglo, seguido por corchetes vacos.

. Ejemplos:
String palabrasDifciles[ ];
int temps[ ];

Un mtodo alterno es colocar los corchetes despus del tipo, en lugar de


enseguida de la variable. Este mtodo es ms legible.

. Ejemplos:
String[ ] palabrasDifciles;
int[ ] temps;
CREACION DE OBJETOS DE ARREGLO

El segundo paso es crear un objeto de arreglo y asignarlo a esa variable.

Existen dos formas de hacerlo:

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:

String[ ] nombres = new String[10];

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.

Los objetos de arreglo pueden contener tipos primitivos o booleanos, de la


misma forma que contienen objetos:

int[ ] temps = new int[99];

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.

Tambin se puede crear e inicializar un arreglo al mismo tiempo.

En lugar de utilizar new, se encierran los elementos del arreglo dentro de llaves,
separados por comas:

String[ ] chiles = {jalapeno, anaheim, serrano, habanero, thai};

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.

Un arreglo del tamao de elementos que se incluyeron se crear en forma


automtica; por ejemplo, en el caso anterior se crea un objeto String llamado
chiles que contiene cinco elementos.

ACCESO A LOS ELEMENTOS DEL ARREGLO

Para obtener un valor de un arreglo, se utiliza la expresin de arreglo subndice:

arreglo[subndice];

subndice especifica la casilla a consultar dentro del arreglo.

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:

String[ ] arr = new String[10];


arr[10] = enunciado;

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.

Si el subndice del arreglo se calcula al momento de la ejecucin (por ejemplo,


como parte de un ciclo) y est fuera de las fronteras del arreglo, el intrprete
Java tambin produce un error, es decir, lanza una excepcin.

Para evitar cometer estos errores en forma accidental, se puede examinar la


longitud del arreglo utilizando la variable de instancia length, que est
disponible para todos los objetos de arreglo sin importar el tipo:

int len = arr.length // retorna el valor 10


ASIGNACION DE VALORES A ELEMENTOS DE UN ARREGLO

Para asignar un valor de elemento a una casilla de un arreglo, se usa un


enunciado de asignacin:

arreglo[1] = 15;
sentencia[0] = El;
sentencia[10] = sentencia[0];
ARREGLOS MULTIDIMENSIONALES

Java no soporta los arreglos multidimensionales directamente, pero permite


declarar y crear un arreglo de arreglos, y esos arreglos pueden contener arreglos
y as en los sucesivo, en tantas dimensiones como se necesite, y tener acceso a l
como se hara en un arreglo multidimensional estilo C:

int coords[ ] [ ] = new int[12][12];


coords[0][0] = 1;
coords[0][1] = 2;

- tipos de variables: de instancia, estticas o de clases, locales, parmetros

Variables son lugares en la memoria donde pueden guardarse valores.

Poseen un nombre, un tipo y un valor.

Antes de usar una variable, primero se la debe declarar y a partir de ah es


factible asignarle valores.

Java posee tres clases de variables: de instancia, de clase y locales.

Las variables de instancia se utilizan para definir atributos o el estado de un


objeto en particular.

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.

Las variables locales se declaran y utilizan dentro de las definiciones de mtodo,


por ejemplo, para contadores de ndica en ciclos, como variables temporales, o
para guardar valores que slo se necesitan dentro de la definicin.

Se recomienda utilizar variables locales para guardar la informacin necesitada


por un solo mtodo y las variables de instancia para guardar la informacin
requerida por varios mtodos en el objeto.

- definicin e inicializacin de variables


Las variables de clase o miembros dato estticos son similares a las variables de
instancia, con la excepcin de que los valores que guardan son los mismos para todos
los objetos de una determinada clase. En el siguiente ejemplo, PI es una variable de
clase y radio es una variable de instancia. PI guarda el mismo valor para todos los
objetos de la clase Circulo, pero el radio de cada crculo puede ser diferente
class Circulo{
static final double PI=3.1416;
double radio;
//...
}

Las variables locales se utilizan dentro de las funciones miembro o mtodos. En el


siguiente ejemplo area es una variable local a la funcin calcularArea en la que se
guarda el valor del rea de un objeto de la clase Circulo. Una variable local existe desde
el momento de su definicin hasta el final del bloque en el que se encuentra.
class Circulo{
//...
double calcularArea(){
double area=PI*radio*radio;

return area;
}

En el lenguaje Java, las variables locales se declaran en el momento en el que son


necesarias. Es una buena costumbre inicializar las variables en el momento en el que
son declaradas. Veamos algunos ejemplos de declaracin de algunas variables
int x=0;
String nombre="Angel";
double a=3.5, b=0.0, c=-2.4;
boolean bNuevo=true;
int[] datos;

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 tipo de dato primitivo

El nombre de una clase

Un array

El lenguaje Java utiliza el conjunto de caracteres Unicode, que incluye no solamente el


conjunto ASCII sino tambin carateres especficos de la mayora de los alfabetos. As,
podemos declarar una variable que contenga la letra
int ao=1999;

Se ha de poner nombres significativos a las variables, generalmente formados por varias


palabras combinadas, la primera empieza por minscula, pero las que le siguen llevan la
letra inicial en maysculas. Se debe evitar en todos los casos nombres de variables
cortos como xx, i, etc.
double radioCirculo=3.2;

Las variables son uno de los elementos bsicos de un programa, y se deben

Declarar

Inicializar

Usar

- convenciones de nomenclatura u otros

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:

Todos los identificadores han de comenzar con una letra, el carcter


subrayado ( _ ) o el carcter dollar ( $ ).

Puede incluir, pero no comenzar por un nmero

No puede incluir el carcter espacio en blanco

Distingue entre letras maysculas y minsculas

No se pueden utilizar las plabras reservadas como 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

nombre de una Comienza por letra


clase
mayscula

String, Rectangulo,
CinematicaApplet

nombre de
funcin

comienza con letra


minscula

calcularArea, getValue,
setColor

nombre de
variable

comienza por letra


minscula

area, color, appletSize

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);
}
}

Cuando se ejecuta este programa, la salida es la siguiente:


Aritmtica de Enteros
a=2
b=6
c=1
d =1
e=1
Aritmtica de Punto Flotante
da = 2.0
db = 6.0
dc = 1.5
dd =0.5
de = 0.5

Operadores a nivel de bit


Java define varios operadores a nivel de bit que se pueden aplicar a los tipos enteros,
long, int,
short, char y byte. Estos operadores actan sobre los bits individuales de sus
operandos. Estos
operadores se resumen en la siguiente tabla:

Operador

Resultado

~
&
|
^
>>
>>>

NOT unario a nivel de bit


AND a nivel de bit
OR a nivel de bit
OR exclusivo a nivel de bit
Desplazamiento a la derecha
Desplazamiento a la derecha rellenando con
ceros
Desplazamiento a la izquierda
AND a nivel de bit y asignacin
OR a nivel de bit y asignacin
OR exclusivo a nivel de bit y asignacin
Desplazamiento a la derecha y asignacin
Desplazamiento a la derecha rellenando con
ceros y asignacin
Desplazamiento a la izquierda y asignacin

<<
&=
|=
^=
>>=
>>>=
<<=

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.

Operadores lgicos a nivel de bit

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

bit se aplican a cada uno de los bits de los operandos.


A
0
1
0
1

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

El resultado de estas operaciones es un valor booleano. La aplicacin ms frecuente de


los
operadores relacionales es en la obtencin de expresiones que controlan la sentencia if
y las
sentencias de ciclos.
En Java se pueden comparar valores de cualquier tipo, incluyendo los nmeros enteros y
de punto flotante, los caracteres y valores booleanos, usando la prueba de igualdad,
==, y la
de desigualdad, !=. Observe que, la igualdad se indica utilizando dos signos igual, y no
slo
uno. (Recuerde que un signo igual es el operador de asignacin). Slo se pueden
comparar
valores numricos mediante los operadores de orden, es decir, solamente se pueden
comparar
operandos enteros, de punto flotante y caracteres, para ver cul es mayor o menor.
Como se mencion, el resultado que produce un operador relacional es un valor de tipo
boolean. El siguiente fragmento de cdigo, por ejemplo, es perfectamente vlido:
int a = 4;
int b = 1;
boolean c = a < b;

Operadores lgicos booleanos


Los operadores lgicos booleanos que se muestran a continuacin slo operan sobre
operandos
del tipo boolean. Todos los operadores lgicos binarios combinan dos valores boolean
para dar
como resultado un valor boolean.
Operador
&
|
^
||
&&
!
&=
|=
^=
==
!=
?:

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 );
}
}

Al ejecutar este programa se obtiene la siguiente salida:


x mod 10 = 2
y mod 10 = 2.25

- 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

En esta expresin, en primer lugar se aaden 3 unidades a b y despus se desplaza a a


la
derecha tantas posiciones como el resultado de la suma anterior. Esta expresin se
puede escribir
tambin utilizando parntesis:
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

Adems de cambiar la prioridad de un operador, los parntesis se utilizan en algunas


ocasiones para hacer ms claro el significado de una expresin. Para cualquiera que lea
su
cdigo, una expresin compleja puede ser difcil de entender. Aadir parntesis puede
ser
redundante, pero ayuda a que expresiones complejas resulten ms claras, evitando
posibles
confusiones posteriores. Por ejemplo, cul de las siguientes expresiones es ms fcil de
leer?
a | 4 + c >> b & 7
(a | ( ( (4 + c) >> b) & 7) )

Una cuestin ms: los parntesis, redundantes o no, no degradan el funcionamiento de


un
programa. Por lo tanto, aadir parntesis para reducir ambigedades no afecta
negativamente al
programa.

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);

- asignacin, invocacin de mtodos, creacin de objetos


Asignacion:

Si se quiere guardar un valor distinto en una variable se utiliza el operador de


asignacin de valor. El operador de asignacin de valor es el carcter igual y se
utiliza de la siguiente forma:
radio=23.4;

Donde se indica el nombre de la variable, el carcter igual (=), y cualquier


expresin o clculo que se desee cuyo resultado se vaya a guardar en la variable.
El smbolo igual significa en una sentencia lo siguiente: haz el clculo de la
expresin que se encuentra a la derecha del igual
Invocacin de mtodos:
Para invocar un mtodo, existen tres mecanismos distintos.
Fuera de la clase en la que se define el mtodo, se pone el nombre de un objeto
que tenga el mtodo, un punto y luego el nombre del mtodo que se desea invocar:
objeto.metodo (argumentos)
alumno1.ponGrupo("33",Horario.MAANA);

En el caso de que se trate de un mtodo de clase (declarado static, vase


Captulo 3), se pone el nombre de la clase que define el mtodo, un punto y el
nombre del mtodo a invocar:
clase.metodo (argumentos)
Math.sqrt(2);

Por ltimo, cuando el mtodo es utilizado de la misma clase que lo define,


basta poner directamente el nombre:
metodo (argumentos)
dameGrupo();

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

- expresiones y bloques de cdigo


Expresiones
Una expresin es todo aquello que se puede poner a la derecha del operador asignacin
=. Por ejemplo:
x=123;
y=(x+100)/4;
area=circulo.calcularArea(2.5);
Rectangulo r=new Rectangulo(10, 10, 200, 300);
La primera expresin asigna un valor a la variable x.
La segunda, realiza una operacin
La tercera, es una llamada a una funcin miembro calcularArea desde un objeto circulo
de una clase determinada
La cuarta, reserva espacio en memoria para un objeto de la clase Rectangulo mediante
la llamada a una funcin especial denominada constructor.
Bloques de cdigo
Un bloque de cdigo es un grupo de sentencias que se comportan como una unidad. Un
bloque de cdigo est limitado por las llaves de apertura { y cierre }. Como ejemplos de
bloques de cdigo tenemos la definicin de una clase, la definicin de una funcin
miembro, una sentencia iterativa for, los bloques try ... catch, para el tratamiento de las
excepciones, etc.
- sentencias de control de flujo
Estructuras condicionales
La forma ms simple de la estructura ifes con una condicin. Si la condicin se
evala a true(es cierta) se ejecutan las sentencias del bloque que encierra la
sentencia if. Si se evalan a false(no es cierta), no se ejecutan.
if (condicin){
sentencias
}

La estructura ifelseconsta de dos bloques: uno en la parte del ify otro


en la parte else. El primero se ejecuta si la condicin es cierta, el segundo si la

condicin es falsa.
if (condicin){
sentencias
}else {
sentencias
}

La estructura ifelsese puede encadenar con otras estructuras ifelse


de la siguiente forma.
if (condicin){
sentencias
}else if (condicin){
sentencias
}else if (condicin){
sentencias
}else {
sentencias
}

La estructura switchevala la expresin a un entero o un carcter y ejecuta,


a partir de ella, la sentencia case cuyo valor coincida. Si no existe se ejecuta a
partir de la sentencia default.
switch (expresinentera){
case expresinconstante:
sentencias
break;
...
default:
sentencias
break;
}

- sentencias de bucle (loop)

un ciclo ejecuta repetidas veces el mismo conjunto de instrucciones hasta que se


cumple una determinada condicin.

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--;
}
}
}

Cuando se ejecuta este programa, la salida es:


tick 3
tick 2
tick 1

La estructura de repeticin whilepermite que mientras se cumpla una determinada


condicin se repita una sentencia o un bloque de sentencias. La condicin ha
de ser una expresin aritmtica que devuelva un valor booleano.
La estructura de repeticin whilesigue el siguiente esquema:
while (condicin){

sentencias
}

La condicin tiene que estar obligatoriamente entre parntesis.


Cuando el programa empieza a ejecutar la estructura while, lo primero que
hace es evaluar la condicin. Si la condicin vale true, se ejecutan las sentencias
que componen el bucle. Cuando concluye la ejecucin de las instrucciones
del bucle se vuelve a evaluar la condicin. De nuevo, si la condicin es cierta se
vuelven a ejecutar las instrucciones del bucle. En algn momento la condicin
vale false, en cuyo caso finaliza la ejecucin del bucle y el programa contina
ejecutndose por la sentencia que se encuentre a continuacin de la estructura
while.
Si la condicin del bucle siempre se evala a true, el bucle nunca termina,
se ejecutar indefinidamente. Esto se conoce como bucle infinito. Las sentencias
del whiledeberan de modificar los valores que forman parte de la condicin,
de forma que en algn momento la condicin valga falsey el bucle
termine.
Si la primera vez que se evala la condicin ya es false, no se ejecuta ninguna
de las sentencias de la estructura. Es decir, puede que no slo no se repita
nada, sino que ni siquiera se llegue a ejecutar ni una sola vez. Se dice que la estructura
whilese repite cero o ms veces.

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);
}
}

En la estructura de repeticin dowhilese repite una sentencia o grupo de sentencias


mientras se cumpla una determinada condicin. En esta estructura la condicin
se evala despus de ejecutar las sentencias que componen la estructura.
El esquema de una estructura dowhilees:
do {
sentencias
}while (condicin);

La estructura dowhilecomienza con la palabra reservada doy, a continuacin,


un bloque de sentencias que es el que se repite. La estructura finaliza con la
palabra whiley, a continuacin, entre parntesis, la condicin que debe ser cierta
para volver a repetir la ejecucin del bucle.
Cuando en un programa se llega a una estructura dowhilese empiezan a
ejecutar las sentencias que componen la estructura. Cuando se terminan de ejecutar
se evala la condicin. Si la condicin vale true, se ejecutan de nuevo las
sentencias que componen la estructura. El bucle deja de repetirse cuando, tras
evaluarse la condicin, sta vale false.
Tenga en cuenta que la estructura de repeticin dowhilesiempre ejecuta
las sentencias que lo componen la primera vez que se ejecuta. Se dice que el bucle
se ejecuta una o ms veces. En este caso es preferible esta estructura a la estructura
while, ya que es necesario ejecutar al menos una vez las sentencias del bucle,
pues al menos hay que pedir una vez el nmero al usuario.

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);
}
}

Los elementos de que consta esta estructura forson los siguientes:


La inicializacines una sentencia que permite inicializar el bucle, puede
ser la declaracin e inicializacin de las variables que se utilizan en el bucle.
Esta sentencia de inicializacin se ejecuta nicamente una vez en la primera
ejecucin del bucle.
La condicines la condicin para continuar la ejecucin del bucle. La
condicin se evala siempre antes de empezar a ejecutar el bucle. Si la condicin
es cierta, se ejecutan las sentencias del bucle.
Despus de ejecutar las sentencias del bucle y antes de volver a evaluar la
condicin se ejecuta la actualizacin. Esta parte se suele utilizar para
modificar el valor de las variables que forman parte de la condicin.
Todos los elementos que se acaban de describir del bucle forson opcionales,
es decir, pueden ser vacas. Esto da una idea de la flexibilidad que proporciona
este bucle. Sin embargo, aunque alguna de las tres partes, o varias, sea vaca siempre
deben existir los caracteres punto y coma que separan las partes.

La versin for-each del ciclo for

La forma general del ciclo for-each se muestra a continuacin:


for (tipo variable : coleccin) bloque
Donde tipo especfica el tipo y variable especfica el nombre de una variable de iteracin
que
recibir elementos de una coleccin, uno a la vez de principio a fin. La coleccin de
elementos
que sern recorridos se especfica por coleccin. Existen varios tipos de colecciones
que pueden
ser usadas por el ciclo for (ej arreglos).
Con cada iteracin del ciclo, el siguiente elemento en la coleccin es recuperado y
guardado en la variable. El ciclo se repite hasta que todos los elementos en la coleccin
han sido
recuperados.
Dado que la variable de iteracin recibe valores de la coleccin, el tipo debe ser el
mismo
tipo que los elementos guardados en la coleccin o compatible con ellos. De forma que
cuando
se est iterando sobre arreglos el tipo debe ser compatible con el tipo base del arreglo.
Para entender la motivacin detrs del ciclo estilo for-each, veamos como quedara un
ciclo
for tradicional equivalente. El siguiente fragmento de cdigo utiliza un ciclo for
tradicional para
calcular la suma de los valores en un arreglo:
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
int sum = 0
for (int i=0; i < 10; i++) sum += nums[i];

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;

// Ejemplo del ciclo estilo for-each.


class ForEach {
public static void main(String args[]) {
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = 0;
// Uso del ciclo estilo for-each para mostrar y sumar valores
for(int x : nums) {
System.out.println("El valor es: " + x);
sum += x;
}
System.out.println("La suma de los valores es: " + sum);
}
}

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 simple


class Caja {
double ancho;
double alto;
double largo;
}

- 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;

Ej: de programa completo que utiliza la clase Caja:


/* Un programa que utiliza la clase Caja.
El nombre de este archivo es CajaDemo.java
*/
class Caja {
double ancho;
double alto;
double largo;
}
// Esta clase declara un objeto de la clase Caja.
class CajaDemo {
public static void main (String args[]) {
Caja miCaja = new Caja();
double vol;
// asignacin de valores a las variables del objeto miCaja
miCaja.ancho = 10;
miCaja.alto = 20;
miCaja.largo = 15;
// Se calcula el volumen de la caja
vol = miCaja.ancho * miCaja.alto * miCaja.largo;
System.out.println ("El volumen es " + vol);
}
}

- constructores

Un constructor inicializa un objeto inmediatamente despus de su creacin. Tiene el


mismo nombre que la clase en la que reside y, sintcticamente, es similar a un mtodo.
Una
vez definido, se llama automticamente al constructor despus de crear el objeto y
antes de
que termine el operador new. Los constructores resultan un poco diferentes, a los
mtodos
convencionales, porque no devuelven ningn tipo, ni siquiera void. Esto se debe a que
el
tipo implcito que devuelve un constructor de clase es el propio tipo de la clase. La tarea
del
constructor es inicializar el estado interno de un objeto de forma que el cdigo que crea
a la instancia pueda contar con un objeto completamente inicializado que pueda ser
utilizado
inmediatamente.
/* La clase Caja usa un constructor para inicializar
las dimensiones de las caja.
*/
class Caja {
double ancho;
double alto;
double largo;
// Este es el constructor para Caja.
Caja() {
System.out.println("Constructor de Caja");
ancho = 10;
alto = 10;
largo = 10;
}

// calcula y devuelve el volumen


doub1e volumen () {
return ancho * alto * largo;
}
}
c1ass CajaDemo6 {
pub1ic static void main (String args[]) {
// declara, reserva memoria, e inicial iza objetos de tipo Caja
Caja miCajal = new Caja();
Caja miCaja2 = new Caja();
doub1e vol;
// obtiene el volumen de la primera caja
vol = miCajal.volumen () ;
System.out.println ("E1 volumen es " + vol);
// obtiene el volumen de la segunda caja
vol = miCaja2.vo1umen ();
System.out.println ("El volumen es " + vol);
}
}

Cuando se ejecuta este programa, genera el siguiente resultado:


Constructor de Caja
Constructor de Caja
El volumen es 1000.0
El volumen es 1000.0

Constructores con parmetros


Aunque el constructor de Caja( ) en los ejemplos previos inicializa un objeto Caja, no es
muy
til que todas las cajas tengan las mismas dimensiones. Necesitamos una forma de
construir
objetos Caja de diferentes dimensiones. La solucin ms sencilla es aadir parmetros
al
constructor, con lo que se consigue que ste sea mucho ms til. La siguiente versin
de Caja
define un constructor con parmetros que asigna a las dimensiones de la caja los
valores
especificados por esos parmetros.
Prestemos especial atencin a la forma en que se crean los objetos de Caja.
/* Aqu, Caja usa un constructor parametrizado para
inicializar las dimensiones de una caja.
*/
class Caja {
double ancho;
double alto;
double largo;
// Este es el constructor de Caja.
Caja (double w, double h, double d) {
ancho = w;
alto = h;
largo = d;
}
// calcula y devuelve el volumen
double volumen () {
return ancho * alto * largo;
}
}
class CajaDemo7 {
public static void main(String args[]) {
// declara, reserva memoria, e inicializa los objetos de Caja
Caja miCajal = new Caja(10, 20, 15);
Caja miCaja2 = new Caja(3, 6, 9);
double vol;
// obtiene el volumen de la primera caja
vol = miCaja1.volumen();
System.out.println ("El volumen es " + vol);
// obtiene el volumen de la segunda caja
vol = miCaja2.volumen();

System.out.println ("El volumen es " + vol);


}
}

La salida de este programa es la siguiente:


El volumen es 3000.0
El volumen es 162.0

- 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.

Adicin de un mtodo a la clase Caja


// Este programa incluye un mtodo en la clase Caja.
class Caja {
double ancho;
double alto;
double largo;
// presenta el volumen de una caja
void volumen () {
System.out.print ("El volumen es ");
System.out.println (ancho * alto * largo);
}
}
class CajaDemo3 {
public static void main (String args[]) {
Caja miCaja1 = new Caja();
Caja miCaja2 = new Caja();
// Se asignan valores a las variables del objeto miCaja1
miCaja1.ancho = 10;
miCaja1.alto = 20;
miCaja1.largo = 15;
/* asigna diferentes valores a las variables
del objeto de miCaja2 */
miCaja2.ancho = 3;
miCaja2.alto = 6;
miCaja2.largo = 9;
// muestra el volumen de la primera caja
miCaja1.volumen ();
// muestra el volumen de la segunda caja
miCaja2.volumen ();
}
}

Este programa genera la siguiente salida:


El volumen es 3000.0
El volumen es 162.0

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);
}
}

En este ejemplo, cuando se llama al mtodo volumen( ), se coloca en la parte derecha


de la
sentencia de asignacin. En la parte izquierda est la variable, en este caso vol, que
recibir el
valor devuelto por volumen( ). Por lo tanto, despus de que se ejecute la sentencia:
vol = miCajal.volumen();

el valor de miCajal.volumen( ) es 3,000 y este valor se almacena en vol.


Dos puntos importantes a considerar sobre la devolucin de valores son:
El tipo de datos devueltos por un mtodo debe ser compatible con el tipo de retorno
especificado por el mtodo. Por ejemplo, si el tipo de retorno de un mtodo es
booleano,
no se puede devolver un entero.
La variable que recibe el valor devuelto por un mtodo (vol, en este caso) debe ser

tambin compatible con el tipo de retorno especificado por el mtodo.


Una cuestin ms: el programa anterior se puede escribir de forma ms eficiente
teniendo
en cuenta que realmente no es necesario que exista la variable vol. Se puede utilizar la
llamada
a volumen( ) directamente en la sentencia println( ), como se muestra a continuacin.
System.out.println(El volumen es + miCaja1.volumen());

Mtodos con parmetros


Mientras que algunos mtodos no necesitan parmetros, la mayora s. Los parmetros
permiten generalizar un mtodo, es decir, un mtodo con parmetros puede operar
sobre gran
variedad de datos y/o ser utilizado en un gran nmero de situaciones diferentes. Para
ilustrar
este punto usaremos un ejemplo muy sencillo. El siguiente mtodo devuelve el
cuadrado del
nmero 10:
int cuadrado ()
{
return 10 * 10;
}

Efectivamente este mtodo devuelve el cuadrado de 10, pero su utilizacin es muy


limitada.
Sin embargo, si se modifica de forma que tome un parmetro, como se muestra a
continuacin,
entonces se consigue que cuadrado( ) tenga una mayor utilidad.
int cuadrado(int i)
{
return i * i;
}

- 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.

La palabra clave this


En algunas ocasiones, un mtodo necesita referirse al objeto que lo invoc. Para permitir
esta situacin, Java define la palabra clave this, la cual puede ser utilizada dentro de
cualquier
mtodo para referirse al objeto actual. this es siempre una referencia al objeto sobre el
que
ha sido llamado el mtodo. Se puede usar this en cualquier lugar donde est permitida
una
referencia a un objeto del mismo tipo de la clase actual.
Consideremos la siguiente versin de Caja( ) para comprender mejor cmo funciona
this.
// Un uso redundante de this.
Caja (double w, double h, double d) {
this.ancho = w;
this.alto = h;
this.largo = d;
}

Ocultando variables de instancia

Si bien normalmente ser ms sencillo utilizar nombres diferentes, this permite hacer

referencia directamente al objeto y resolver de esta forma cualquier colisin entre


nombres,
que pudiera darse entre las variables de instancia y las variables locales. La siguiente
versin de
Caja( ) utiliza ancho, alto, y largo como nombres de parmetros y, despus, this para
acceder a
variables de instancia que tienen los mismos nombres.
// Uso de this para resolver colisiones en el espacio de nombres
Caja (double ancho, double alto, double largo) {
this.ancho = ancho;
this.alto = alto;
this.largo = largo;
}

- 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

//mtodo comer sobrecargado


public void comer(String comida){
System.out.println("El caballo come: "+ comida );
}
//mtodo crecer sobrecargado
public void crecer(long altura){
System.out.println("el caballo crecio: "+ altura +" cm de altura");
}
}
Al probar la clase vemos:
public class TestCaballo {
public static void main(String[] args){
Caballo c = new Caballo();
c.comer();
c.comer("pasto");
c.crecer();
c.crecer(25L);
}
}
Resultado:
run:
Accion de comer, genrica de un animal
El caballo come: pasto
Accion de crecer, genrica de un animal
el caballo crecio: 25 cm de altura
BUILD SUCCESSFUL (total time: 1 second)
Notemos que podemos invocar al mtodo comer en sus dos versiones, tanto
en la superclase como en la clase hija, en la clase padre se encuentra el
mtodo genrico y en la clase hija en mtodo sobrecragado. Podemos
sobrecargar mtodos en la misma clase tanto en la clase padre como en la
clase hija.
Sobreescribir
Ahora veremos la sobre-escritura de mtodos, ocuparemos la misma clase
ya que podemos mezclar ambos conceptos, recordar que la sobre-escritura
de mtodos tiene que ver con la implementacin del mtodo.
Tenemos la clase animal:
public class Animal {
public void comer(){
System.out.println("Accion de comer, genrica de un animal");
}
//Mtodo sobrecargado
public void comer(String comida, int kilos){
System.out.println("El animal come "+kilos+" de "+comida);
}

public void crecer(){


System.out.println("Accion de crecer, genrica de un animal");
}
//Mtodo sobrecargado
public void crecer(long altura, long peso){
System.out.println("Al animal crece "+altura+" metros de altura y
"+peso+" kilos");
}
}
Los mtodos comer y crecer, en su definicion original y en su sobrecarga,
podemos sobreescribirlos, es decir, cambiar la manera en que la
implementacin de estos mtodos se da, veamos el ejemplo.
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
//mtodo comer sobrecargado
public void comer(String comida){
System.out.println("El caballo come: "+ comida );
}
//mtodo crecer sobrecargado
public void crecer(long altura){
System.out.println("el caballo crecio: "+ altura +" cm de altura");
}
//sobrecargas vlidas para el mtodo comer y crecer
//las sobrecargas estn siendo en la clase hija aunque la definicin del
mtodo este en la superclase
private int comer(int kilos){
return 0;
}
public int comer(int kilos, String comida){
return 0;
}
private int crecer(int altura){
return 0;
}
public int crecer(int altura, long peso){
return 0;
}
//ejemplo de mtodos sobre-escritor de la superclase, en la clase hija
@Override
public void comer(){
System.out.println("Este es una sobre-escritura en la clase hija del
mtodo comer original");
}
@Override
public void comer(String comida, int kilos){
System.out.println("esta es la sobre-escritura del mtodo sobrecargado
comer en la clase hija");

}
@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.

Otro Ejemplo de Sobreescritura y Sobrecarga


No.
Method Overloading
1)

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.

Java Method Overloading example


1. class OverloadingExample{
2. static int add(int a,int b){return a+b;}
3. static int add(int a,int b,int c){return a+b+c;}

4. }

Java Method Overriding example


1. class Animal{
2. void eat(){System.out.println("eating...");}
3. }
4. class Dog extends Animal{
5. void eat(){System.out.println("eating bread...");}
6. }

e. Modificadores
- de acceso y otros

Modificadores de acceso: public, private, protected y


default
Los modificadores de acceso, como su nombre indica, determinan desde qu clases se
puede acceder a un determinado elemento. En Java tenemos 4 tipos: public, private,
protected y el tipo por defecto, que no tiene ninguna palabra clave asociada, pero se
suele conocer como default o package-private.
Si no especificamos ningn modificador de acceso se utiliza el nivel de acceso por
defecto, que consiste en que el elemento puede ser accedido slo desde las clases que
pertenezcan al mismo paquete.
El nivel de acceso public permite a acceder al elemento desde cualquier clase,
independientemente de que esta pertenezca o no al paquete en que se encuentra el
elemento.
private,

por otro lado, es el modificador ms restrictivo y especifica que los elementos


que lo utilizan slo pueden ser accedidos desde la 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.
Es importante destacar tambin que private convierte los elementos en privados para
otras clases, no para otras instancias de la clase. Es decir, un objeto de una determinada

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.

private short valor = 0;

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.

public static void main(String[] args) {

3.

final String cadena = "Hola";

4.

cadena.concat(" mundo");

5.
6. }

Modificadores de acceso: PUBLIC, PRIVATE, PROTECTED, DEFAULT.

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

Modificadores de clases y mtodos: STATIC, FINAL, ABSTRACT.

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

// El siguiente cdigo NO funcionara:


public class Ejemplo {
public static void main(String[] args) {
final String cadena = "Hola";
cadena = new String("Adios");
}
}
// El siguiente cdigo SI funcionara:
public class Ejemplo {
public static void main(String[] args) {
final String cadena = "Hola";
cadena.concat(" mundo");
}
}

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.

Mecanismos de sincronizacin: VOLATILE y SYNCRHONIZED.

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

//Ejemplo de volatile sobre una variable


volatile int contador;
public void aumentar() {
contador++;
}

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

//Ejemplo de syncrhonized sobre un bloque de codigo


int contador;
public void aumentar() {
synchronized(this) {
contador++;
}
}
//Ejemplo de syncrhonized sobre un metodo
int contador;

11
12 public void synchronized aumentar() {
13 contador++;
14 }
15

Вам также может понравиться