Poo 2 Java
Poo 2 Java
Introducción a Java
Esta obra se encuentra bajo una licencia Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0) de Creative Commons.
Fiable y seguro:
Memoria dinámica automática (no punteros explícitos).
comprobación automática de tamaño de variables.
.java .class
Compilador
Interprete
.java .class JVM
Fuente Bytecode
Java
Un programa Java está formado por una o varias clases Java diseñadas para
colaborar en la realización de una tarea.
De entre todas las clases que forman el programa, existe una clase pública
distinguida que contiene un método de clase (estático) que es el punto de
entrada inicial para la ejecución del programa:
public static void main(String[] args) { ... }
Las demás clases, unas pueden estar definidas explícitamente para este
programa, y otras pueden pertenecer a una biblioteca de clases.
Eclipse
proyecto−2 votacion Urna.java
datos Opcion.java
...
Principal.java
// File: paquete1/Segmento.java
package paquete1;
public class Segmento {
private Punto origen, extremo; // utilización directa de Punto
public Segmento(double x1, double y1, double x2, double y2) {
origen = new Punto(x1, y1); // utilización directa de Punto
extremo = new Punto(x2, y2); // utilización directa de Punto
}
// ...
}
// File: paquete2/Segmento.java
package paquete2;
public class Segmento {
private paquete1.Punto origen, extremo; // utilización cualificada de Punto
public Segmento(double x1, double y1, double x2, double y2) {
origen = new paquete1.Punto(x1, y1); // utilización cualificada de Punto
extremo = new paquete1.Punto(x2, y2); // utilización cualificada de Punto
}
// ...
}
// File: paquete2/Segmento.java
package paquete2;
import paquete1.*; // importación de todas las clases del paquete paquete1
import paquete1.Punto; // importación explícita de la clase Punto de paquete1
public class Segmento {
private Punto origen, extremo; // utilización importada de Punto
public Segmento(double x1, double y1, double x2, double y2) {
origen = new Punto(x1, y1); // utilización importada de Punto
extremo = new Punto(x2, y2); // utilización importada de Punto
}
// ...
}
javax
java
util lang
io
Cada clase declarada como pública debe de estar en un fichero .java con su
mismo nombre.
Cada fichero .java puede contener varias clases e interfaces pero sólo una
podrá ser pública, el resto tendrá visibilidad dentro del propio paquete.
En caso de que la clase pertenezca a un determinado paquete, entonces el
fichero residirá en la jerarquía de directorios (carpetas) especificada por la
ruta del nombre del paquete.
Cada fichero .java debe compilarse, generando un fichero .class (en
bytecodes) por cada clase contenida en él.
El programa se ejecuta pasando el fichero .class de la clase distinguida al
intérprete de la Máquina Virtual de Java.
Nivel de Acceso
□ - private SÍ NO NO NO
▵▴ ~ package SÍ SÍ NO NO
⋄ ⬩ # protected SÍ SÍ SÍ NO
◦ • + public SÍ SÍ SÍ SÍ
Las clases e interfaces de nivel externo sólo pueden tener visibilidad pública o paquete.
Dpto. Lenguajes y Ciencias de la Computación. E.T.S.I. Informática.
Tema
Universidad
2. Introducción
de Málaga
a Java Programación Orientada a Objetos 17 / 104
Símbolos en Eclipse para Diagramas de Clases UML
A
C Clase C ClaseAbstracta E Enumerado
S F
varInstanciaPrivada: int C
ClaseAbstracta() Rojo: Enumerado
S F
varInstanciaProtegida: int metodoInstanciaPublico(): int Verde: Enumerado
S F
varInstanciaPaquete: int A
metodoAbstractoPublico(): int Azul: Enumerado
varInstanciaPublica: int S
S
varClasePrivada: int values(): Enumerado[]
S
S F
CONST_CLASE_PRIVADA: int valueOf(String): Enumerado
ordinal(): int
C
Clase() toString(): String
metodoInstanciaPrivado(): int hashCode(): int
metodoInstanciaProtegido(): int I Interfaz equals(Object): boolean
metodoInstanciaPaquete(): int S F
CONST_CLASE_PUBLICA: int compareTo(Enumerado): int
metodoInstanciaPublico(): int
S A
metodoClasePrivado(): int metodoAbstractoPublico(): int
Sentencias de expresión:
Asignaciones, Incrementos y decrementos.
Creaciones de objetos.
Invocaciones a métodos (Mensajes).
En el caso del switch con una expresión de tipo String, la comparación con
los valores de los case se realiza utilizando el metodo equals().
while ( <exp_lógica> ) {
// <sentencias>
}
do {
// <sentencias>
} while ( <exp_lógica> );
Ejemplos
int x1 = (int) 3.7 * 2; // x1 = 6
int x2 = (int) (3.7 * 2); // x1 = 7
double x3 = (double) 1 / 2; // x2 = 0.5
double x4 = (double) ( 1 / 2 ); // x3 = 0.0
▸ 0 0 0
mat • ▸ •
• ▸ 0 0 0
▸ 3 4 5 ▾ ▾
mat • ▸ • Punto Punto
• ▸ 6 7 8 1 2 3 4
▸ 3 4 5 ▾ ▾
mat • ▸ • Punto Punto
• ▸ 6 7 8 1 2 3 4
Por convenio:
Nombres de variables y métodos en minúsculas. Si son compuestos, las
palabras no se separan y comienzan con mayúscula.
long valorMaximo;
• (3,3) • (6,3)
• (2,1) • (7,1)
package geometria;
public class Segmento { // fichero Segmento.java
private Punto extremo1, extremo2; // Atributos, variables de instancia
//public Segmento(double x1, double y1, double x2, double y2) {
// extremo1 = new Punto(x1, y1);
// extremo2 = new Punto(x2, y2);
//}
public Segmento(double x1, double y1, double x2, double y2) {
this( new Punto(x1, y1), new Punto(x2, y2) ); // invoca al siguiente constructor
}
public Segmento(Punto p1, Punto p2) {
extremo1 = p1;
extremo2 = p2;
}
public void desplazar(double a, double b) {
extremo1.desplazar(a, b); // invocación a métodos de la clase Punto
extremo2.desplazar(a, b); // invocación a métodos de la clase Punto
}
public double longitud() {
return extremo1.distancia(extremo2); // invocación a métodos de la clase Punto
}
}
El paso de parámetros en Java es Por Valor, esto es, se realiza una copia del
valor del parámetro real en el parámetro formal correspondiente. No existe el
paso por referencia.
El paso de parámetros de tipos primitivos implica una copia independiente
del valor almacenado.
Cualquier modificación en el parámetro formal dentro del método no afecta al
valor almacenado en el parámetro actual.
El paso de parámetros de objetos implica una copia de la referencia, en
cuyo caso el mismo objeto referenciado es compartido entre el método
invocante y el invocado.
Cualquier modificación en el objeto referenciado por el parámetro formal dentro
del método sí afecta al estado del objeto referenciado por el parámetro actual.
• ▸ 1 2 • ▸ 2 1
▸ 1 2 1 2
pto2 • y 3
• ▸ 1 3 ◂ • • ◂ •
pt2 Punto
• ▸ 2 5 ◂
• ▸ 1 3 • ▸ • • ▸ 1 3
Punto
pt2 Punto
▸ 2 5
• ▸ 2 5
En el caso de objetos:
Punto p = new Punto(3, 4);
System.out.println("p es " + p); // muestra: p es Punto@119c0982
Comparación de cadenas
c1.equals(c2): devuelve true si c1 y c2 son iguales y false en otro caso.
c1.equalsIgnoreCase(c2): igual que la anterior, pero sin tener en cuenta
las diferencias por mayúsculas y minúsculas.
c1.compareTo(c2): devuelve un entero menor, igual o mayor que cero
cuando c1 es menor, igual o mayor que c2.
c1.compareToIgnoreCase(c2): igual que la anterior, pero sin tener en
cuenta las diferencias por mayúsculas y minúsculas.
ATENCIÓN c1 == c2 compara las referencias, es decir, si ambas variables
referencian al mismo objeto.
Otros métodos
c1.indexOf(c2): devuelve la primera posición de c2 (carácter o cadena).
c1.lastIndexOf(c2): devuelve la última posición de c2 (carácter o cadena).
c1.toLowerCase(): devuelve un nuevo objeto String con todo minúsculas.
c1.toUpperCase(): devuelve un nuevo objeto String con todo mayúsculas.
c1.substring(desde, hasta): devuelve un nuevo objeto String con los
caracteres a partir de la posición desde y hasta la posición hasta (sin
incluirla).
Conversiones
String.valueOf(v): devuelve un nuevo objeto String con la representación
del valor especificado en v (de tipo boolean, char, int, double).
Integer.parseInt(s): devuelve el resultado de obtener el valor del número
entero representado en s (de tipo String).
Integer.toString(v): devuelve un nuevo objeto String con la
representación del valor especificado en v (de tipo int).
Double.parseDouble(s): devuelve el resultado de obtener el valor del
número real representado en s (de tipo String).
Double.toString(v): devuelve un nuevo objeto String con la
representación del valor especificado en v (de tipo double).
Los arrays se pueden crear especificando cuantos elementos tienen (valor por defecto):
int[] lista3 = new int[4]; Punto[] lista4 = new Punto[t];
• ▸ 0 0 0 0 • ▸ / / / • ▸ 0 1 2 3 • ▸ • / •
1 2 3 4
a b
▸ 0 0 0 ▸ 3 4 5
• ▸ • • ▸ •
• ▸ 0 0 0 • ▸ 6 7 8
La subclase hereda tanto los atributos como los métodos definidos por la
superclase (reusabilidad del código).
La subclase puede definir nuevos atributos y nuevos métodos (extensión), así
como redefinir métodos de la superclase (especialización).
^ ^ ^ ^
Object
^
Ctor. además del modelo y su precio base, se debe especificar el color del coche,
tanto en String como con el valor del tipo enumerado Color.
Consultar y modificar el color del coche.
Ahora, el nombre del modelo lleva añadido el color del coche.
El valor del precio base será incrementado con el precio del color del coche.
Consultar los colores disponibles.
Una subclase puede redefinir algún método heredado (no deben ser ni
private ni final ni static).
En la subclase, el método redefinido de la superclase queda oculto por el nuevo
método. Se puede invocar al método oculto de la superclase:
super.nombreDelMétodo(argumentos)
La anotación @Override ayuda a detectar errores al redefinir el método, tales
como errores en el nombre o en la lista de parámetros del método que está
siendo redefinido.
public class CocheColor extends Coche {
// ...
@Override // redefinición del método getModelo() de Coche
public String getModelo() {
return super.getModelo() + " " + this.getColor().toString();
}
@Override // redefinición del método getPrecioBase() de Coche
protected double getPrecioBase() {
// Precio del Color: Negro: 0, Rojo: 10, Verde: 20, Azul: 30,
// Amarillo: 40, Magenta: 50, Cian: 60, Blanco: 70
return super.getPrecioBase() + this.getColor().ordinal() * PRECIO_COLOR;
}
}
Una clase puede implementar a varias interfaces, además de heredar de una única
clase. Deberá implementar los métodos abstractos especificados por la interfaz.
Cuando una clase implementa una interfaz:
Hereda todas las constantes definidas en la interfaz y en sus superinterfaces.
Debe implementar todos los métodos definidos por la interfaz y sus
superinterfaces. Salvo que sea una clase sea abstracta, en cuyo caso los
métodos no implementados son abstract.
Un objeto, de una clase que implementa una interfaz, puede ser utilizado
(polimórficamente) en cualquier sitio donde sea necesario un objeto que
implemente la interfaz especificada.
public class Datos extends SuperClase implements Conjunto, Estadisticas, ... {
// Debe implementar los métodos especificados en la interfaz Conjunto
public void anyadir(int val) { /* ... */ }
public void eliminar(int val) { /* ... */ }
public boolean pertenece(int val) { /* ... */ }
public int consultar(int pos) { /* ... */ }
public int size() { /* ... */ }
// Debe implementar los métodos especificados en la interfaz Estadisticas
public double media() { /* ... */ }
// Otras variables y métodos adicionales de la clase ...
}