Académique Documents
Professionnel Documents
Culture Documents
Este docume nt o está escrito para ayudar a quien lo necesite. Puedes hacer con él
lo que quieras, pero siempre de forma gratuita y desinteresa da. Además, es demasiado
malo como para venderlo. Se reirían de ti :)
Si quieres aportar algo a este documen to, no dudes en ponerte en contacto con
el Grupo de Usuarios de Linux de la Universidad Carlos III de Madrid (gul@gul.uc3m.es ).
Gracias a:
· Jose Maria Chumo por sus sugerencias para mejorar este manual
· y a los señores del GUL por mantenerlo disponible para todo el mundo
Contenido
Aquí tienes la lista de contenidos del texto. Los aparta d o s marca dos con * son sólo
orienta tivos y no están amplia me nte explicados aquí, ya que no forma n parte del
objetivo de este texto. Puedes encontr a r una explicación exhaustiva de estos aparta d o s
en cualquier libro de Java, ademá s de las explicaciones que te dará el profesor de la
asignatu r a. Bueno, en alguna s ocasiones, que debería dar.
Introducción. Cultureta.
pelín de historia
Platón y la OOP
el proble ma...
... y la solución
concepto de objeto
propie da d e s
méto d o s
concepto de clase
Java
¿por qué Java?
caracteríaticas generales de Java *
facilidad (je je jeeee)
lenguaje interp re ta d o
tamaño de los program a s
orientado a Internet
JVM
Cómo usar el compilad or y la JVM (javac, java)
Recursividad
definición
metodología: la cola del cine
partes de un método recursivo
los factoriales
Herencia
para qué sirve
cómo se usa: exten d s
redefinición de méto d o s
uso de super()
una nota bastante importante
Casting
prelu dio al casting: las referencias
la señora referencia
cómo funciona
compa r ació n de referencias
Arreglan d o bicicletas: pará me tr os que son referencias
casting
¿Por qué?
cómo se usa
resu me n
comer te el coco 6
upcasting, downcasting, Y siguiendo con el inglés, explicit and implicit cast
upcasting
downcasting
casting implícito
casting explícito
La Clase Object
definición
contenid o *
¿para qué ese contenido?
la gran utilidad de la clase Object: referencias de tipo Object
Interfaces
definición
uso básico de interfaces
uso avanzado de interfaces: referencias de tipo de interfaces
¿herencia?¿Interfaces?¿comorl?
Epílogo
Cuando aprende m os
a programar siempre se nos
plantea si debemos
compaginar la progra -
mación con el lenguaje de programación. Parece
una tontería, pero podemos aprender OOP sin saber ningún
lenguaje. Es cierto: podemos saber sobre clases, objetos, herencia,
casting, etc sin saber una maldita palabra de ningún lenguaje. Sin
embargo, siempre es positivo compaginar nuestro aprendizaje de
programación con el de un lenguaje propicio para ello.
procedure debuti;
begin
Writeln('me alegro');
end;
procedure notandebuti;
begin
Writeln('alegrate!');
end;
begin
Writeln('¿Cómo estás?');
readln(cad);
if (cad='bien') then debuti else notandebuti;
end.
Platón y la OOP
a) Datos
b) Métodos
Debido a que los datos de un objeto definen en parte este objeto (lo
diferencian de los demás), a veces llamamos a estos datos “Propiedades ”.
¿Se te ocurre algún método propio de una mesa? A mí no, las mesas
son objetos puramente pasivos, ellas mismas no hacen nada. Sin
embargo, vamos a suponer que el cambio de color es una acción propia
de la mesa (y no del pintor).
OBJETO
CLASE
PROPIEDADES
MÉTODOS
INSTANCIA
¡Cuidado!
Si decimos que dos objetos de la misma clase tienen las mismas
propiedades, tal vez lo que realmente queramos decir es que dos
objetos de la misma clase tienen EL MISMO VALOR PARA TODAS Y
CADA UNA.DE SUS PROPIEDADES. Es evidente que dos objetos de la
misma clase van a tener las mismas propiedades: dos mesas
tendrán color, forma, número de patas, etc. Pero tal vez digamos
que dos mesas tienen las mismas propiedades cuando queremos
decir que ambas mesas tienen la misma forma, el mismo color y el
mismo número de patas. Hay que tener cuidado con esto, aunque
tampoco es tan importante.
Java
#include <owl.h>
: TApplication(AName,
hInstance,
hPrevInstance,
lpCmdLine,
nCmdShow) {};
virtual void InitMainWindow();
};
// el MainWindow de la clase
void THelloApp::InitMainWindow()
{
MainWindow = new TWindow(NULL, "Hola Mundo");
}
LENGUAJE Empiezo a
plantear me
LENGUAJE INTERPRETADO esto de
programar....
Y COMPILADO
COMPILADOR
JVM
BYTECODES
Definición de propiedade s
class Mesa {
String color;
int numPatas;
String forma;
.
.
.
Definición de métodos
a) valor de retorno.
b) parámetros
Un método que calcule 5*4 está claro que no va a necesitar parámetr os,
porque el método no puede hacer nada más que calcular 5*4. Sin
embargo, un método que calcule la multiplicación de dos enteros
cualquiera necesitará conocer esos enteros, es decir, se los daremos como
parámetro. Es como si queremos saber dónde está determinada calle, y le
pregunta m os a alguien: tenemos que decirle qué calle buscamos.
Imagínate, “Disculpe, ¿podría decirme dónde está la calle?” No tiene
sentido, habría que preguntar “Disculpe (educación ante todo), ¿podría
decirme dónde está la calle Butarque?”. Bueno, pues como éste se te
pueden ocurrir mil ejemplos
Es
MUY IMPORTANTE
que diferencies cuándo
un método necesita
parámetros y cuándo no.
float raizCuadrada(int a)
recibe un entero y devuelve un real
Debe quedar MUY MUY MUY claro este rollo de los parámetr os y
del tipo de dato devuelto por un método. Vamos a ver los métodos
anteriores implementa dos y comenta dos para que se vea todo mucho
mejor, y ya de paso aprendem o s cómo hace un método para devolver un
valor usando “return”:
void saludo(){
System.out.println(“Holas!”);
}
saludo();
void saludo()
int suma(....)
Este método es casi igual al que hemos visto poco más arriba,
peeeeeeeeeero tiene un grave problema: hemos dicho que devuelve un
entero ( INT suma(int a, int b) ), pero no hay ningún “return” en el cuerpo
del método. Habrá un error de compilación!
para saber si hemos podido abrir el fichero. Esto sería lo más normal,
pero en algunas ocasiones no necesitamos saber si se ha abierto
exitosamente, porque sabemos que va a ser así, por ejemplo, al hacer
algún programilla tonto en nuestra casa. Si no necesitamos asegurar nos
de si el fichero se ha abierto o no, entonces podemos hacer
abrirFichero(“miFichero.txt”);
PROPIEDAD
MÉTODO
TIPO DE DATOS (int, float....)
PARÁMETROS
VALOR DE RETORNO DE UN MÉTODO
SENTENCIA RETURN
VOID
Recuerda siempre que un valor de retorno puede ser ignorado
Ejercicio
Solución
por ejemplo:
Alberto.cambiarColor(“Azul”);
Sabiendo que “log” y “r” son objetos, ¿Hay algo complicado? ¿Hay
algo que no entiendas? ¡Claro que no!
Constructores
A primera vista, parece que “new” es un CONSTRUCTOR, porque su
misión es construir nuevos objetos. Bueno, pues nooooop. “new” INVOCA
a un constructor, NO ES un constructor. Bueno, no es tan difícil. “new”
invoca a un constructor. Vale. ¿Y qué es un constructor?
Bueno, pues una vez dicho esto, vamos a cambiar un poco lo que
decíamos sobre el uso de “new”, y vamos a cambiarlo por:
REFERENCIA
OPERADOR PUNTO “.”
NEW
CONSTRUCTOR
Definición de constructores
class Mesa {
String color;
int numPatas;
String forma;
RECUERDA:
el constructor
tiene el
void cambiarColor(String nuevoColor){ mismo nombre que su
clase,
color = nuevoColor; no devuelve ningún
valor,
} y se define sin
“void”
Mesa() {
color = “azul”;
numPatas = 4;
forma = “cuadrada”;
}
}
Margarita será una mesa cuadrada azul de cuatro patas, ¡Una mesa
en condiciones, vaya!
El Polimorfismo
permite tener varios
métodos diferentes entre sí
y con el mismo nombre.
Un buen momento para echarle
un vistazo!
Métodos get / s et
Y quiero hacer que sea amarilla. Bueno, pues tengo dos opciones:
String getColor(){
return color;
}
String getFoma(){
return forma;
}
int getNumPatas(){
return numPatas;
}
String getColor(){
return color;
}
String getForma(){
return forma;
}
int getNumPatas(){
return numPatas;
}
Mesa() {
color = “azul”;
numPatas = 4;
forma = “cuadrada”;
}
}
Vale. Supón que tenemos una clase paginaGué con las propiedades
dirección , contenido y numeroTeléfon o . Cada vez que creemos una
página, le daremos un contenido, una dirección y nuestro número de
teléfono. Por supuesto
definimos en la clase todos los métodos set y get necesarios. Creo
que eres
Ahora supón que cambiamos nuestra sede y, por tanto,
totalmente capaz de
nuestro número de teléfono.
escribir la clase
pagi
naGué
¡Dios! ¡Hemos creado mil páginas web
y ahora tenemos que cambiar el número de
teléfono de todas! ¡Mil llamadas al método
setNumeroTeléfon o !
String getColor(){
return color;
}
String getForma(){
return forma;
}
int getNumPatas(){
return numPatas;
}
Mesa() {
color = “azul”;
numPatas = 4;
forma = “cuadrada”;
numMesasFabricadas = numMesasFabricadas + 1;
}
int getNumMesasFabricadas() {
return numMesasFabricadas;
}
}
Y ya está. Ahora, si hacemos:
Constantes
¡Sí! También podemos definir constantes en Java. Una constante,
como comprenderás, no sólo no puede cambiar de valor: además, debe
ser compartida por todos los objetos. Vaya una constante tan estúpida
aquélla que no es la misma en todos los objetos de la clase donde esa
constan te se define. En Pascal, C, C+ +, BASIC, etc etc etc las constantes
se definen como const (de constant). Bueno, pues en Java, como es un
lenguaje tan especialito el jodío, se definen con final .
VARIABLE COMPARTIDA
MODIFICADOR STATIC
MÉTODO COMPARTIDO
LLAMADAS A MÉTODOS MEDIANTE EL NOMBRE DE LA CLASE
( Mesa.getNumMesasFabricadas() )
MODIFICADOR FINAL
Seguro que te has dado cuenta de que hemos definido mil clases,
métodos y propiedades, pero que realmente todavía no hemos hecho
ningún programa. Bueno. Vamos a solucionar eso.
java clase
Bueno, pues la JVM coge estos argumentos los mete en una lista. A
este tipo de listas se les denomina array , y funciona de la siguiente
manera:
Un inciso: arrays
sacabó el inciso.
class MesaMain{
public static void main(String[] args) {
Mesa Margarita = new Mesa( args[0], 4, args[1] );
System.out.println(“Hemos creado una mesa”);
System.out.println(“con ”+Margarita.getNumPatas()+”
patas,”);
System.out.println(“de color “+Margarita.getColor());
System.out.println(“y de forma “+Margarita.getForma());
}
}
javac Mesa.java
javac MesaMain.java
y hacemos:
Sentencias condicionales
sentencia if
if (condición) {
bloque1
} else {
bloque2
}
== igual a
!= diferente de
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
AND &&
OR ||
NOT !
if (num1 = = num2){
System.out.prinln(“Son iguales”);
} else {
System.out.println(“Son diferentes”);
}
Aparentemente, si tenemos
if (tal y cual) {
hacemos esto
if (nosequé){
pues esto otro
} else {
y si no, esto
}
} else {
if (vaya rollo){
bah, yo me piro
} else {
paso de todo
}
}
Pero hay que tener mucho cuidado con esto, sobre todo si
anidamos if s. Supongamos que queremos comparar dos enteros n1 y n2 ,
y saber si son iguales o si n1 > n2 . No nos importa saber si n2 > n1 .
Recuerda que cuando un bloque consta sólo de una sentencia (que puede
ser perfectamente una sentencia if ), las llaves pueden eliminarse.
int n1 = 1;
int n2 = 10;
if (n1 != n2)
if (n1 > n2)
System.out.println(“n1 > n2”);
/ / no comprobam os si n2 > n1
else
System.out.println(“Son iguales”);
int n1 = 1;
int n2 = 10;
if (n1 != n2)
if (n1 > n2)
System.out.println(“n1 > n2”);
else
/ / cualquier sentencia que no haga nada, por
ejemplo
n1 = n1;
else
System.out.println(“Son iguales”);
¡Bueno, hay que pasar siempre por estas cosas! Mucho cuidado
cuando anides if s, pon siempre sus else s, aunque no hagan nada. Otra
opción, tal vez te guste más, es la siguiente:
int n1 = 1;
int n2 = 10;
if (n1 != n2)
if (n1 > n2)
System.out.println(“n1 > n2”);
else { } / / bloque de código vacío
else
System.out.println(“Son iguales”);
int n1 = 1;
int n2 = 10;
if (n1 != n2) {
} else {
System.out.println(“Son iguales”);
}
sentencia switch
switch (expresión) {
case caso1:
bloque1
case caso2:
bloque2
.
.
.
}
switch (n){
case 1:
System.out.println(“uno”);
case 2:
System.out.println(“dos”);
case 3:
System.out.println(“tres”);
}
uno
dos
tres
dos
tres
y si n = 3 , pues se mostraría
tres
switch (n){
case 1:
System.out.println(“uno”);
break;
case 2:
System.out.println(“dos”);
break;
case 3:
System.out.println(“tres”);
break;
}
uno
a diferencia de antes.
Otra cosa sobre los switch es: existe un caso especial, el llamado
default . Se ejecuta este caso si no hay otro caso que correspon da a la
expresión:
switch (n){
case 1:
System.out.println(“uno”);
case 2:
System.out.println(“dos”);
case 3:
System.out.println(“tres”);
case default:
System.out.println(“más de tres”);
}
más de tres
uno
dos
tres
más de tres
Bueno, no es tan mortal.
switch (n){
case 1:
System.out.println(“uno”);
break;
case 2:
System.out.println(“dos”);
break;
case 3:
System.out.println(“tres”);
break;
case default:
System.out.println(“más de tres”);
}
piensa, piensa............
while
while (condición){
bloque
}
Un ejemplo:
int n = 0;
System.out.println(“a contar”);
while (n < = 1 0) {
System.out.println(“Voy por el ”+n);
n = n + 1;
}
Por estas razones suele haber una regla, que no siempre se cumple,
ni tienes por qué cumplirla, pero es conveniente:
Repito que no es una regla general, que no tiene por qué ser así,
pero que conviene. De hecho, seguir esta regla a veces complica la
existencia una barbaridad.
do {
bloque
} while (condición)
for
¿te suena?
int n = 0; / / INICIALIZACIÓN
System.out.println(“a contar”);
Bueno, pues for resume estas tres partes en una sola sentencia:
Por ejemplo:
System.out.println(“a contar”);
SENTENCIAS CONDICIONALES
IF / ELSE
SWITCH / CASE / CASE ELSE
SENTENCIAS REPETITIVAS
WHILE / DO – WHILE / FOR
Este fragmento lo que hace es iterar las sentencias “...” hasta que la
condición 2 deje de cumplirse. Por ello, se podría traducir por:
que es bastante más elegante, pero para gustos están los colores,
¿no?
Continue
mayoresDeEdad + +;
}
etiqueta:
for (inicio; condición; actualización) {
...
}
etiqueta:
for (inicio; condición; actualización) {
for(inicio2; condición 2; acualización 2) {
if (condición3)
break etiqueta;
...
}
}
Recursividad
pero, fíjate:
entonces,
(n+1)! = (n+1) · n!
y, por tanto,
n! = n · (n-1)!
tenemos:
long respuesta = 0;
return respuesta;
}
if ( numero == 1 ) {
respuesta = 1;
} else {
respuesta = numero * factorial(numero – 1);
}
return respuesta;
}
Como curiosidad....
¿Sabes por qué se le llama “conquista”? Pues es muy sencillo. Los
métodos recursivos se suelen usar para resolver problemas partiéndolos
en cachitos más pequeños. Por ejemplo, buscar a una persona en una cola
de gente: primero buscas en la mitad izquierda, y luego en la derecha.
Esto lo verás muy profunda m e n te en Laboratorio de Programación.
Bueno, pues como ya sabrás, hay un refrán árabe que dice: divide y
vencerás . En inglés, “divide and conquer”. De ahí lo de “conquista”.
Bueno, vamos a abordar una de las partes más bonitas de la OOP,
aunque trae sus dolores de cabeza, no te creas. Algunos lenguajes, como
C++ basan gran parte de su ingente potencial en esto que llamamos...
Herencia
Por tanto tenemos que tener en cuenta que, en Java, los objetos
sólo tienen un padre, y además, heredan de él el 100%, no como en las
personas que heredan el 50%
class Rueda {
void saludar() {
System.out.println(“Soy una rueda”);
}
}
class Motor {
void saludar() {
System.out.println(“Soy un motor”);
}
}
class Bicicleta {
Rueda delantera;
Rueda trasera;
Bicicleta(){ / / el constructor
delantera = new Rueda();
trasera = new Rueda();
}
void saludar() {
System.out.println(“Soy una bicicleta”);
}
}
Bueno, pues vamos a definir la moto. Para hacer que una clase
“hijo” extienda a otra “padre” , la primera clase se define así:
Moto() { / / el constructor
motor = new Motor();
}
void saludar(){
System.out.println(“Soy una amoto”);
}
}
Estas cuatro clases son lo más fácil del mundo. Si no las entiendes,
para y vuelve atrás, porque son de lo más básico. Pero seguro que las
entiendes sin problemas, ¿verdad?
No tendría sentido que una moto saludase como una bicicleta, ¿no?
Aunque no te creas, que gracias al casting , que en breve veremos,
podemos hacer que una moto pueda saludar como moto y como bicicleta.
Antonieta.saludar();
Anacleta.saludar();
y cada una nos saludaría diciendo lo que son. Hala. Voy a compilar
este código a ver si da problemas...... no, parece que no los da.
Vamos a plantear una cuestión: una Bici, al crearse, crea las dos
ruedas. Una moto, al crearse, crea un motor. Pero, ¿Se crean las ruedas al
crearse la moto? Fíjate en el constructor de la clase Moto:
Moto() { / / el constructor
motor = new Motor();
}
Moto() { / / el constructor
delantera = new Rueda();
trasera = new Rueda();
motor = new Motor();
}
Moto() { / / el constructor
super();
motor = new Motor();
}
entonces, cada vez que creemos una moto se creará “la bicicleta
que reside en su interior” (oh! una lágrima resbala por mi mejilla....) y
luego el motor. Es como si
al crear a una persona primero
En definitiva, creas lo
que tiene de su
cuando una clase extiende padre y
luego creas el
a otra, el constructor de la
resto de cosas.
clase hija debe llamar al Una visión
muy peculiar,
constructor de la clase madre,
¿no crees?
y esto se hace mediante Por
cierto, conviene
super() . que super() sea
lo primero que
aparezca en el constructor, antes de
cualquier otra sentencia. ¿Te has preguntado
por qué super() tiene paréntesis? Deberías adivinarlo,
pero por si acaso, te lo digo. super() es el constructor de
la superclase, y recuerda que el constructor no es más que
un método un tanto especialito, pero método al fin y al cabo.
Y si no recuerdas mal, los métodos llevan paréntesis siempre....
nota
Cuando una clase hereda de otra no es necesario que llame al constructor de su
superclase, pero siempre que crees una clase hija, lo más normal es que sí lo haga.
Plantéate la lógica de este hecho: supón un mecánico que sabe que una moto es una
bicicleta con motor. Si le piden fabricar una moto, entonces primero creará una bicicleta
y luego le pondrá un motor. Es decir, primero crea la clase padre y luego la hija.
Supón ahora que defines una motopija , que es una moto con aire acondicionado .
Pues al crearla, primero crearás una moto y luego le pondrás el aire. Esto implica crear
primero una bicicleta, luego ponerle motor para hacer la moto, y luego ponerle el aire
para hacer la motopija. Vaya, dos super() ....
HERENCIA
CLASE PADRE / CLASE HIJO
USO DE extends
REDEFINICIÓN (OVERRIDING) DE MÉTODOS
(que a continuación veremos con más detalle)
USO DE super()
CONCEPTO DE MOTO CON AIRE ACONDICIONADO
class Bicicleta {
Rueda delantera;
Rueda trasera;
Bicicleta(){ / / el constructor
delantera = new Rueda();
trasera = new Rueda();
}
void saludar() {
System.out.println(“Soy una bicicleta”);
}
}
Moto() { / / el constructor
super(); / / llamamos al constructor de Bicicleta
motor = new Motor();
}
void saludar(){
System.out.println(“Soy una amoto”);
}
}
Si hacemos:
Anacleta.saludar();
veremos en pantalla :
Soy una amoto
Como sabemos, una moto es una bicicleta con motor. Eso significa
que una moto tiene una bicicleta dentro de sí. o lo que es lo mismo, que
una moto puede comportarse como una bicicleta. ¿Cómo? Ahora lo
veremos. ¿Para qué sirve? Eso lo veremos luego.
Supón que tenéis una vecina que conoce muy bien a tu madre,
mucho mejor que a ti. Un buen día te ve y te saluda, y te dice “Vaya,
tienes los ojos de tu madre”. ¿Por qué te dice esto? Aparte de porque
realmente puede que tengas los ojos de tu madre, la vecina te lo dice
porque conoce a tu madre . Si no la conociese no podría decirlo, ¿no? Es
decir, que la vecina puede decir lo que has sacado de tu madre si conoce
a tu madre.
refAOtraBicicleta.saludar();
veremos
Vamos a olvidar por ahora los constructores, ¿vale? Bueno, pues ¡te
presento a la señora referencia de tipo Bicicleta!:
¡¡¡TACHAAAAAAN!!!
Espero que ahora haya quedado bien explicado, o mejor dicho, bien
mostrado:
Comparación de referencias
Margarita = = Catalina
Pues no.
Fíjate: las dos mesas son azules, de tres patas y cuadradas. PERO
SON DOS MESAS DIFERENTES, no son la misma mesa. Es como decir que
dos gemelos, por ser idénticos, son la misma persona. Bueno, ten esto
muy presente siempre, ¿vale? Puedes comparar dos númeos con = =, pero
no dos objetos.
class Taller {
void arreglar(Bicicleta bici){
System.out.println(“A arreglar!”);
}
}
elTaller.arreglar(Antonieta);
Bueno, pues fíjate para qué sirve esto de las referencias. ¿Te gusta?
Pues verás ahora.
class Taller {
void arreglar(Bicicleta bici){
System.out.println(“A arreglar!”);
}
elTaller.cambiarAceite(refMoto);
elTaller.arreglar(refBicicleta);
Casting
Bueno, pues existe una manera de hacer esto mismo con una sola
referencia . ¿Cómo? Pues muy fácil: convirtiéndola .
Convertir una referencia de un tipo inicial a un tipo final se hace
así:
(tipo final)referencia
(float)miEntero
(Bicicleta)refMoto
y, por fin....
elTaller.cambiarAceite(Maroto);
elTaller.arreglar( (Bicicleta)Maroto ); / / esto es casting!!!!!!!!!
1. Una moto puede saludar como una bici. Podemos hacer que un
objeto de un tipo se comporte como un objeto de otro tipo.
REFERENCIA
TIPO DE UNA REFERENCIA
CÓMO las referencias apuntan a un objeto
CÓMO dos referencias de diferentes tipos ven contenidos
diferentes de un
mismo objeto
COMPARACIÓN DE REFERENCIAS: = = no funciona como
quisiéramos....
CÓMO un método requiere referencias de determinado tipo (como
parámetros)
SENTIDO DE usar distintas referencias para un objeto
FINALIDAD DEL CASTING
SINTAXIS DEL CASTING
¡Recuerda!
class A {
int getn() {
return 1;
}
}
class B extends A {
int getn() {
return 2;
}
}
class ABMain {
public static void main(String[] args){
A a = new A();
B b = new A();
System.out.println(“numero:”+a.getn());
System.out.println(“numero:”+b.getn());
}
}
(Bicicleta)Maroto
Downcasting: lo contrario:
(Moto)Anacleta
class A {
int getn() {
return 10;
}
}
class B extend s A {
int getm() {
return 20;
}
}
class C {
void pillaUnA ( A j ){
System.out.println("n = "+j.getn());
}
void pillaUnB ( B j ) {
System.out.println("m = "+j.getm());
}
}
c.pillaUnA(a);
c.pillaUnA(b);
c.pillaUnA( (A)b );
c.pillaUnB(b);
c.pillaUnB(a);
A a = new A();
C c = new C();
c.pillaUnB( (B)a );
UPCASTING
DOWNCASTING
CASTING IMPLÍCITO
CASTING EXPLÍCITO
Ejercicio:
c.pillaUnA(a);
c.pillaUnA(b);
c.pillaUnA ( (A)b );
c.pillaUnA ( (B)a );
c.pillaUnB (a);
c.pillaUnB (b);
c.pillaUnB ( (A)b );
c.pillaUnB ( (B)a );
}
Solución:
c.pillaUnA(a); / / normal
c.pillaUnA(b); / / upcasting implícito
La Clase Object
Bien. ¿Qué contenidos tiene la clase Object ? Pues esta clase tiene
unos métodos muy extraños:
clone() , que sirve para hacer clonar objetos,
equals() , para comparar objetos,
getClass() , para obtener la clase de un objeto,
Sin embargo, estos métodos sirven para todo tipo de objetos. Por lo
que no es difícil adivinar que serán todos métodos muy generales. Así
que lo más probable es que, si quieres utilizar uno de estos métodos,
tendrás que redefinirlo (override).
class Florero {
void saludar(){
System.out.println(“Soy un florero”);
}
}
class Foto {
void saludar(){
System.out.println(“Soy una fotografía”);
}
}
class Lampara {
void saludar(){
System.out.println(“Soy una lámpara”);
}
}
Bueno, pues el objetivo de nuestro programa es escribir un método
que meteremos en la clase Mesa (¿te acuerdas de ella?) que sirva para
colocar cosas encima de una mesa. Recuerda la clase Mesa :
class Mesa {
String color;
int numPatas;
String forma;
static int numMesasFabricadas = 0;
String getColor(){
return color;
}
String getForma(){
return forma;
}
int getNumPatas(){
return numPatas;
}
Mesa(String colorInicial,
int numPatasInicial,
String formaInicial){
color = colorInicial;
numPatas = numPatasInicial;
forma = formaInicial;
numMesasFabricadas = numMesasFabricadas + 1;
}
Mesa() {
color = “azul”;
numPatas = 4;
forma = “cuadrada”;
numMesasFabricadas = numMesasFabricadas + 1;
}
int getNumMesasFabricadas() {
return numMesasFabricadas;
}
}
CLASE OBJECT
SU CONTENIDO
SU USO COMO REFERENCIA GLOBAL (para toda clase Java)
Ejercicio:
Interfaces
Vamos a ver.
El objetivo de una interface es definir qué contenidos debe tener
una clase obligatoriamente. Es algo así como un contrato: una clase
puede implem entar una interface si se compro mete a definir
determinados contenidos. Veamos.
Las interfaces, repito, definen qué contenidos debe tener una clase.
Por ejemplo, qué métodos debe tener obligatoriamente, pero no define
esos métodos. Es decir, que una interface sólo es una colección de
cabeceras de métodos. La clase que implemente esa interface debe
implementar esos métodos. Lo vemos con un ejemplo: Si definimos:
interface Trabajador {
void pagarImpuest os();
}
¿Te das cuenta? Tenemos dos personas diferentes, que nada tienen
que ver la una con la otra, excepto una cosa: que ambas son trabajador as.
Así, deben pagar impuestos. Pero fíjate que cada una lleva a cabo ese
pago de forma diferente. La Interface Trabajador no determina cómo
va a llevarse a cabo tal pago, solamente exige que se lleve a cabo .
Bueno, creo que hasta ahora todo va más o menos bien, ¿no? Ahora
vamos a por lo mejor de las interfaces.
class Hacienda {
.
.
.
void quePagueElCurrante(Trabajador currante) {
currante.pagarImpuesto s();
}
}
malditaHacienda.quePagueElCurrante( Fulgencio );
malditaHacienda.quePagueElCurrante( JesusVazque z );
Ya hemos acabado.
Epílogo
"There's not a bite to eat in the whole province," he was told. "Better keep
moving on."
"Oh, I have everything I need," he said. "In fact, I was thinking of making
some stone soup to share with all of you." He pulled an iron cauldron
from his
wagon, filled it with water, and built a fire under it. Then, with great
ceremo ny, he drew an ordinary - looking stone from a velvet bag and
droppe d it
into the water.
By now, hearing the rumor of food, most of the villagers had come to the
square or watched from their windows. As the peddler sniffed the "broth"
and
licked his lips in anticipation, hunger began to overcome their skepticism.
"Ahh," the peddler said to himself rather loudly, "I do like a tasty stone
soup. Of course, stone soup with CABBAGE - - that's hard to beat."