240418 - Herencia
Clase
Strings
- Recordamos que los tipos primitivos son pseudo-objetos
- Las
String
s son:- Literales
- Inmutables (de sólo lectura)
- Reasignar una variable que contiene un String sólo cambia la dirección a la que dirige el puntero, y mantiene ambas Strings en memoria
- El método polimórfico de facto que vamos a ver es el
Object.toString()
- Java ofrece clases Wrapper para añadir funciones a los tipos primitivos
- Estas son las clases
Ingeter, Float, Boolean, String
que añaden funciones a los respectivos tipos primitivos - Algunas funciones son
Parse{Int,Float,etc}
,toString()
- Por ejemplo,
String
es una clase con métodos (comolength()
,charAt(index)
,concat()
,equals(str)
)
- Estas son las clases
- Para poder "estirar" o ampliar una String, usamos la clase
StringBuffer
- Esta clase tiene el método
.append(str)
, que no existe para los Strings primitivos - PERO, no es tan eficiente ni rápido como usar Strings simples
- Esta clase tiene el método
RegEx
- En Java, para usar una expresión regular necesitamos
- Un
Pattern
- & Ej.:
Pattern p = Pattern.compile("a*b")
- & Ej.:
- Un
Matcher
- ~ No llegué a ver cómo se matchea la expresión
p
- ~ No llegué a ver cómo se matchea la expresión
- Un
Serialización de objetos
No lo vamos a usar mucho en clase, pero sirve saberlo
- Es un mecanismo de persistencia
- Para poder serializar un objeto, este debe implementar la interfaz
Java.io.Serializable
- Y puede seleccionar que alguno de los atributos no se guarden con el modificador
transient
- Y puede seleccionar que alguno de los atributos no se guarden con el modificador
- Luego, el objeto se escribe con
java.io.ObjectOutputStream
y se lee conjava.io.ObjectInputStream
Ejemplo:
import java.io.Serializable
public class Member implements Serializable {
private int id;
private String name;
private transient String password;
}
Herencia y polimorfismo
No hay mucho que no hayamos visto ya
Constructores
- La firma de la función constructora no incluye el tipo de retorno
- Lo primero que hace, por defecto, es que debe llamar al constructor de la clase padre
- Puede haber más de un constructor
- Esto se llama "sobrecargar" la función del constructor
- Permite que la función trabaje con varias combinaciones de argumentos (sólo marca, ó marca+año, ó marca+año+color+patente)
Ejemplo:
/*** Archivo: Auto.java ***/
public class Auto {
//Este es un constructor de la clase Auto, pueden haber varios que tomen distintos números de argumentos
public Auto(String marca, int año) {
super(); //Ejecuta el constructor Object() de la clase java.lang.Object
self.marca = marca;
self.año = año;
}
//Al contrario que la anterior, esta firma tiene el tipo de retorno String
public String tocarBocina() {
return "pip pip";
}
}
/*** Archivo: Main.java ***/
//Esto nos permite crear un objeto más rápidamente, en lugar de ir llamando a los setters uno por uno
public class Main {
public static void main(String[] args) {
Auto renault12 = new Auto("Renault", 1996);
// No hizo falta llamar a renault12.setMarca, renault12.setAño
}
}
Herencia
- Para hacer una subclase de otra clase, decimos que "La subclase extiende a la superclase"
- Esto en Java es:
public class subclase extends superclase
- Esto en Java es:
Annotations
Override
@Override
indica que el método está sobrescribiendo el método (de igual nombre) de la clase padre- Esto sirve para que Java se encargue de verificar que el método que se está queriendo sobrescribir de hecho existe y tiene la misma firma tanto en la superclase como en la subclase
- Con esto, el IDE nos avisa si pifiamos al intentar redefinir un método y escribimos mal el tipo de retorno, el nombre o los parámetros
Ejercicios / Ejemplos
Práctica - Qué hizo el profe
- Extendió la clase Auto con una subclase Taxi
- Atributos:
chapa
- Métodos:
toString
(autogenerado por Eclipse)
- Atributos: