Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
.java .class
Compilador
Interprete
.java .class JVM
Fuente Bytecode
Java
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 4 / 98
Programa 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.
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 pero sólo una podrá ser
pública.
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.
Una clase pública debe estar definida en un fichero .java con su mismo
nombre.
La definición de una clase consta de los siguientes elementos:
Especificación del paquete al que pertenece la clase. Si no se especifica,
entonces pertenece al paquete por defecto (anónimo).
Especificación del nombre de la clase, de la relación de herencia e
implementación de interfaces.
Especificación de los atributos, tanto variables de instancia como variables de
clase, especificando su nombre, tipo, y cualificadores necesarios (static,
final), así como de su control de visibilidad (public, protected y private).
Definición de los constructores, diferenciados por los parámetros que reciben,
especificando su control de visibilidad (public, protected y private).
Definición de los métodos, tanto métodos de instancia como métodos de
clase, especificando su nombre, tipo, parámetros, y cualificadores necesarios
(static, final), así como de su control de visibilidad (public, protected y
private).
// Punto.java
public class Punto {
// Atributos
private double x, y;
// Constructores
public Punto() { x = 0; y = 0; }
public Punto(double a, double b) { x = a; y = b; }
// Métodos
public double abscisa() { return x; }
public double ordenada() { return y; }
public void abscisa(double a) { x = a; }
public void ordenada(double b) { y = b; }
public void desplazar(double a, double b) { x += a; y += b; }
public double distancia(Punto pto) {
return Math.sqrt(Math.pow(this.x - pto.x, 2) + Math.pow(this.y - pto.y, 2));
}
}
// Particula.java
public class Particula extends Punto {
// Atributos
final static double G = 6.67e-11;
private double masa; // ( + los atributos heredados de Punto )
// Constructores
public Particula(double m) {
this(0, 0, m); // Se refiere a Particula(double, double, double)
}
public Particula(double a, double b, double m) {
super(a, b); // Se refiere a Punto(double, double)
masa = m;
}
// Métodos ( + los métodos heredados de Punto )
public void masa(double m) { masa = m; }
public double masa() { return masa; }
public double atraccion(Particula part) {
// Nótese la invocación al método distancia heredado de Punto
return G * this.masa * part.masa / Math.pow(this.distancia(part), 2);
}
}
• ▸ 1 2 • ▸ 2 1
// Libro.java
public class Libro {
private static double IVA = 16.0; // Variable de Clase
private String titulo; // Variable de instancia
private double precio; // Variable de instancia
// Constructor
public Libro(String tit, double p) {
titulo = tit;
precio = p;
}
public double calcPrecio() {
return precio + precio * IVA / 100;
}
@Override
public String toString() {
return "(" + titulo + ", " + calcPrecio() + ")";
}
// Método de Clase
private static void cambiarIVA(double iva) {
IVA = iva;
}
}
// Libro.java
public class Libro {
private static int refCnt = 1; // Variable de Clase
private String titulo; // Variable de instancia
private int referencia; // Variable de instancia
// Constructor
public Libro(String tit) {
titulo = tit;
referencia = refCnt;
++refCnt;
}
@Override
public String toString() {
return "(" + titulo + ", " + referencia + ")";
}
}
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.
pto1 Punto pto2 pto3 Punto pto4 Punto pto1 = new Punto(1,2);
Punto pto2 = pto1;
• ▸ 1 2 ◂ • • ▸ 3 4 / Punto pto3 = new Punto(3,4);
Punto pto4 = null;
• ▸ 0 0 0 0 • ▸ / / / /
mat
▸ 0 0 0
• ▸ •
• ▸ 0 0 0
• ▸ 1 2 3 4 • ▸ • / / •
mat
▸ 3 4 5 ▾ ▾
• ▸ • Punto Punto
• ▸ 6 7 8 1 2 3 4
• ▸ 1 2 3 4 • ▸ • / / •
mat
▸ 3 4 5 ▾ ▾
• ▸ • Punto Punto
• ▸ 6 7 8 1 2 3 4
• ▸ 1 2 • ▸ 2 1
• ▸ Punto 3
pto2 ▸ 1 2 y
• 3
• ▸ 1 3 ◂ • • ◂ •
pt2 Punto
• ▸ 2 5 ◂
• ▸ 1 3 • ▸ • • ▸ 1 3
Punto
pt2 Punto
▸ 2 5
• ▸ 2 5
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.
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.
De igual modo sucede en el caso de los arrays.
Variables
Las variables almacenan valores de tipos primitivos, referencias a objetos y
referencias a arrays.
Las variables deben ser declaradas antes de su utilización:
int contador, maximo;
Constantes
Una variable se puede declarar como constante precediendo su declaración
con la etiqueta final:
final int MAXIMO = 100;
while ( <exp_lógica> ) {
// <sentencias>
}
do {
// <sentencias>
} while ( <exp_lógica> );
Forma simplificada:
String str = "¡Hola!";
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.
Conversiones
String.valueOf(v): devuelve un nuevo objeto String con la representación
del valor especificado en v.
Integer.parseInt(c1): devuelve el resultado de obtener el valor del número
entero representado en c1.
Double.parseDouble(c1): devuelve el resultado de obtener el valor del
número real representado en c1.
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 61 / 98
Arrays
Los Arrays representan objetos que contienen una colección (de longitud fija)
de elementos (componentes) de un mismo tipo o clase.
La longitud se puede consultar en la variable de instancia length.
Declaración de dos arrays, uno con elementos de tipo entero y otro de tipo
Punto:
int[] listaEnteros;
Punto[] listaPuntos;
Se pueden crear especificando cuantos elementos tienen (los elementos se
inicializan con los valores por defecto):
int[] listaEnteros = new int[4];
Punto[] listaPuntos = new Punto[t];
listaEnteros listaPuntos
• ▸ 0 0 0 0 • ▸ / / /
listaEnteros listaPuntos
▾ ▾
Punto Punto
1 2 3 4
El array destino debe existir y tener tantos elementos como sea necesario.
Ejemplo de utilización:
public static void main(String[] args) {
char[] arrayOrigen = {
'd','e','s','c','a','f','e','i','n','a','d','o'
};
char[] arrayDestino = new char[7];
System.arraycopy(arrayOrigen, 3, arrayDestino, 0, 7);
// arrayDestino ahora contendrá: { 'c','a','f','e','i','n','a' }
}
Si la posición hasta es mayor que los elementos del array original, entonces
añade al final valores por defecto.
Ejemplo de utilización:
import java.util.Arrays;
public static void main(String[] args) {
int[] arrayOrigen = { 12, 4, 8, 3, 5, 203, 28 };
int[] arrayDestino1 = Arrays.copyOfRange(arrayOrigen, 2, 5);
// arrayDestino1 contendrá: { 8, 3, 5 }
int[] arrayDestino2 = Arrays.copyOfRange(arrayOrigen, 5, 9);
// arrayDestino2 contendrá: { 203, 28, 0, 0 }
}
Los elementos de un array también pueden ser arrays, dando lugar a a los
arrays multi-dimensionales.
int[][] a = new int[2][3];
int[][] b = new int[][] { { 3, 4, 5 }, { 6, 7, 8 } };
int[][] c = { { 3, 4, 5 }, { 6, 7, 8 } };
double[][][] d = new double[3][5][4];
a b
▸ 0 0 0 ▸ 3 4 5
• ▸ • • ▸ •
• ▸ 0 0 0 • ▸ 6 7 8
public static enum Dia { Lun, Mar, Mie, Jue, Vie, Sab, Dom }
^ ^ ^
Java sólo permite herencia simple, por lo que pueden establecerse jerarquías
de clases (una clase sólo puede heredar de una única clase, pero puede tener
varias clases herederas).
La relación de herencia es transitiva, si C hereda de B y B hereda de A,
entonces C también hereda de A.
Todas las jerarquías de clases confluyen en la clase Object de java.lang
que define los comportamientos básicos que debe presentar cualquier clase.
Object
^
Punto Persona
^ ^
// Punto.java
public class Punto {
// Atributos
private double x, y;
// Constructores
public Punto() {
this(0, 0); // invocación a Punto(double, double)
}
public Punto(double a, double b) {
x = a; y = b;
}
// Métodos
public double abscisa() { return x; }
public double ordenada() { return y; }
public void abscisa(double a) { x = a; }
public void ordenada(double b) { y = b; }
public void desplazar(double a, double b) { x += a; y += b; }
public double distancia(Punto pto) {
return Math.sqrt(Math.pow(this.x - pto.x, 2) + Math.pow(this.y - pto.y, 2));
}
}
// Particula.java
public class Particula extends Punto {
// Atributos
final static double G = 6.67e-11;
private double masa; // ( + los atributos heredados de Punto )
// Constructores
public Particula(double m) {
this(0, 0, m); // invocación a Particula(double, double, double)
}
public Particula(double a, double b, double m) {
super(a, b); // invocación a Punto(double, double)
masa = m;
}
// Métodos ( + los métodos heredados de Punto )
public void masa(double m) { masa = m; }
public double masa() { return masa; }
public double atraccion(Particula part) {
// Nótese la invocación al método distancia heredado de Punto
return G * this.masa * part.masa / Math.pow(this.distancia(part), 2);
}
}
A veces, una clase puede modelar una abstracción, aunque no le sea posible
proporcionar una implementación adecuada o suficiente, pero sin embargo, sí es
capaz de proporcionar una definición abstracta del comportamiento esperado.
Las clases descendientes serán las encargadas de proporcionar (implementar)
los comportamientos adecuadamente, según la abstración que modelen.
Estas clases se etiquetan como abstract y pueden tener métodos sin
definición, también etiquetados como abstract.
Se utilizan para formar jerarquías, proporcionando definiciones de
comportamientos abstractos.
No es posible crear instancias de clases abstractas. Se deben definir
subclases que no sean abstractas para poder crear objetos.
*
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 88 / 98
Ejemplo de Interfaces
public interface IVehiculo {
void mover(double tiempo) ;
double velocidad() ;
default double distanciaRecorrida(double tiempo) { return tiempo * velocidad(); }
}
public class Bicicleta implements IVehiculo {
private Punto posicion;
public Bicicleta() { posicion = new Punto(); }
@Override
public void mover(double tiempo) { posicion.desplazar(distanciaRecorrida(tiempo), 0); }
@Override
public double velocidad() { return 20; } // Km/h
}
public class Automovil implements IVehiculo {
private static final double CONSUMO = 7.5; // litros a los 100 Km
private Punto posicion; private double deposito;
public Automovil() { posicion = new Punto(); deposito = 50; }
@Override
public void mover(double tiempo) {
double dist = distanciaRecorrida(tiempo);
if (deposito >= CONSUMO * dist / 100) {
posicion.desplazar(dist, 0);
deposito -= CONSUMO * dist / 100;
}
}
@Override
public double velocidad() { return 120; } // Km/h
}
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 89 / 98
Uso de interfaces