Iniciación a la Programación
@acmupm
2ᵃ Sesión
1. Clases e instancias.
2. Tipos primitivos y referencia. Memoria: stack y heap. Garbage Collector.
4. Herencia y polimorfismo.
6. Interfaces y clases abstractas.
5. Igualdad entre instancias.
@acmupm
Clases e instancias
Clase
Instancia
Coche
Marca
Modelo
Color
Matrícula
Combustible
Kilometraje
Tipo de aceite



@acmupm
Clases e instancias
Clase
Instancia
public class Coche {
private String marca;
private String matricula;
private String color;
private int kilometros;
public Coche(String marca, String matricula,
String color) {
this.marca = marca;
this.matricula = matricula;
this.color = color;
kilometros = 0;
}
public String getMarca() {
return marca;
}
public String getMatricula() {
return matricula;
}
public String getColor() {
return color;
}
public int getKilometros() {
return kilometros;
}
public int sumarKilometros(int delta) {
kilometros += delta;
return kilometros;
}
public void resetKilometros() {
kilometros = 0;
}
}Coche c1 = new Coche("Ford", "8086GPL",
"azul");
Coche c2 = new Coche("Volkswagen",
"1989GHC", "rojo");
System.out.println(c1.getMatricula());
System.out.println(c2.getMarca());@acmupm
Clases e instancias
public class Coche {
private String marca;
private String matricula;
private String color;
private int kilometros;
public Coche(String marca, String matricula,
String color) {
this.marca = marca;
this.matricula = matricula;
this.color = color;
kilometros = 0;
}
public String getMarca() {
return marca;
}
public String getMatricula() {
return matricula;
}
public String getColor() {
return color;
}
public int getKilometros() {
return kilometros;
}
public int sumarKilometros(int delta) {
kilometros += delta;
return kilometros;
}
public void resetKilometros() {
kilometros = 0;
}
}Declaración de la clase
Atributos de instancia
Constructor
Getters y setters (encapsulación)
Otros métodos
@acmupm
Clases e instancias
Constructor:
- Método que es llamado cuando se crea una nueva instancia de una clase.
- Permite dar un primer valor a los atributos del objeto o realizar cualquier otra acción.
- En su declaración, no se pone ningún valor devuelto, y su nombre es el de la clase en la que está.
public class Coche {
private String marca;
private String matricula;
private String color;
private int kilometros;
public Coche(String marca, String matricula,
String color) {
this.marca = marca;
this.matricula = matricula;
this.color = color;
kilometros = 0;
}
//El resto de la clase
}public class USB {
private int capacidad;
private int usado;
public USB(int capacidad, int usado) {
this.capacidad = capacidad;
this.usado = usado;
}
//El resto de la clase
}@acmupm
Clases e instancias
Modificadores de acceso:
Determinan desde qué puntos del código se puede tener o no acceso a ciertas clases, métodos o atributos.
| Modificador | Clase | Paquete | Herencia | Otros ámbitos |
|---|---|---|---|---|
| private | ✓ | ✗ | ✗ | ✗ |
| (sin modificador) | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
@acmupm
Clases e instancias
Encapsulación:
Es un patrón de diseño que consiste en poner todos los atributos private, y obtener y/o establecer su valor a través de métodos llamados getters y setters.
Obligatorio su uso!! (bajo pena de suspenso)
public class Whatever {
private boolean a;
private int b;
public boolean isA() {
return a;
}
public void setA(boolean a) {
this.a = a;
}
public int getB() {
return this.b;
}
public void setB(int b) {
if (b > 1000) {
this.b = 1000;
} else {
this.b = b;
}
}
}(Aprendéroslo para los exámenes pero escribir esto una y otra vez es un p*** coñazo. Cualquier editor de Java que se precie te los puede generar automáticamente :P)
@acmupm
Clases e instancias
Sobrecarga de métodos:
Consiste en declarar más de un método con el mismo nombre, diferenciándose las diferentes definiciones por el tipo y el número de los parámetros.
public int sumar(int a, int b) {
return a + b;
}
public double sumar(double a, double b) {
return a + b;
}Los constructores también pueden tener sobrecargas:
public class Coche {
// [...]
public Coche(String marca, String matricula,
String color, int kilometros) {
this.marca = marca;
this.matricula = matricula;
this.color = color;
this.kilometros = kilometros;
}
public Coche(String marca, String matricula,
String color) {
this(marca, matricula, color, 0);
}
}@acmupm
Clases e instancias
Valor null:
El valor null es la "referencia vacía". Indica una ausencia de instancia.
//Esta variable no apunta a ningún objeto.
Coche c1 = null;
c1.getMarca(); //NullPointerException@acmupm
Tipos primitivos y referencia
Tipos primitivos
boolean, byte, short,
char, int, long,
float, doubleshort num2 = 9;
int num1 = 5;
| 0 | 0 | 0 | 5 | 0 | 9 |
|---|
num1
num2
Tipos referencia
Coche c1 = new Coche("7511BXW", "azul");
Coche c2 = new Coche("0912PJK", "verde");
Coche c3 = c1;
"7511BXW"
"azul"
"0912PJK"
"verde"
c1
c2
c3
@acmupm
Stack y Heap
public void loquesea() {
int a = 6;
int b = a * 5;
if (a == 6) {
int c = 7;
Coche coche = new Coche("1234BCD", "rojo");
Coche elmismo = coche;
Coche otro = new Coche("1234BCD", "rojo");
}
int d = 6;
}Stack
Heap
@acmupm
Stack y Heap
public void loquesea() {
int a = 6;
int b = a * 5;
if (a == 6) {
int c = 7;
Coche coche = new Coche("1234BCD", "rojo");
Coche elmismo = coche;
Coche otro = new Coche("1234BCD", "rojo");
}
int d = 6;
}| 7 |
| 30 |
| 6 |
Stack
Heap
a
b
c
@acmupm
Stack y Heap
public void loquesea() {
int a = 6;
int b = a * 5;
if (a == 6) {
int c = 7;
Coche coche = new Coche("1234BCD", "rojo");
Coche elmismo = coche;
Coche otro = new Coche("1234BCD", "rojo");
}
int d = 6;
}| 0x7ffff9a |
| 7 |
| 30 |
| 6 |
Stack
Heap
a
b
c
coche
"1234BCD"
"rojo"
@acmupm
Stack y Heap
public void loquesea() {
int a = 6;
int b = a * 5;
if (a == 6) {
int c = 7;
Coche coche = new Coche("1234BCD", "rojo");
Coche elmismo = coche;
Coche otro = new Coche("1234BCD", "rojo");
}
int d = 6;
}| 0x7ffff9a |
| 0x7ffff9a |
| 7 |
| 30 |
| 6 |
Stack
Heap
a
b
c
coche
"1234BCD"
"rojo"
elmismo
@acmupm
Stack y Heap
public void loquesea() {
int a = 6;
int b = a * 5;
if (a == 6) {
int c = 7;
Coche coche = new Coche("1234BCD", "rojo");
Coche elmismo = coche;
Coche otro = new Coche("1234BCD", "rojo");
}
int d = 6;
}| 0x7ffffab |
| 0x7ffff9a |
| 0x7ffff9a |
| 7 |
| 30 |
| 6 |
Stack
Heap
a
b
c
coche
"1234BCD"
"rojo"
elmismo
"1234BCD"
"rojo"
otro
@acmupm
Stack y Heap
public void loquesea() {
int a = 6;
int b = a * 5;
if (a == 6) {
int c = 7;
Coche coche = new Coche("1234BCD", "rojo");
Coche elmismo = coche;
Coche otro = new Coche("1234BCD", "rojo");
}
int d = 6;
}| 6 |
Stack
Heap
d
"1234BCD"
"rojo"
"1234BCD"
"rojo"
Garbage Collector al rescate!
@acmupm
Herencia y polimorfismo
class A {
}
class B extends A {
}
class C extends B {
}
class D extends B {
}@acmupm
Herencia y polimorfismo
public class A {
public int metodo() {
return 3;
}
}
public class B extends A {
public int metodo() {
return 9;
}
}new A().metodo(); //Devuelve 3;
new B().metodo(); //Devuelve 9;
A objeto = new A();
objeto.metodo(); //Devuelve 3;
A otro = new B();
objeto.metodo(); //Devuelve 9;@acmupm
Herencia y polimorfismo
Upcasting y downcasting
Se hace un upcasting de un tipo a otro cuando tenemos la certeza de que un tipo se puede interpretar como otro.
Se hace un downcasting de un tipo a otro cuando no estamos seguros de que un tipo puede ser interpretado como otro.
Vehiculo obj1 = new Coche();
Vehiculo obj2 = new Camion();
Coche c1 = (Coche) obj1;
Camion cam1 = (Camion) obj2;
Coche c2 = (Coche) obj2;@acmupm
Herencia y polimorfismo
Overriding vs. Shadowing
public class A {
public int metodo() {
return otro();
}
public int otro() {
return 5;
}
}
public class B extends A {
public int otro() {
return 9;
}
}new A().metodo(); //5
new B().metodo(); //9public class A {
public int metodo() {
return otro();
}
private int otro() {
return 5;
}
}
public class B extends A {
public int otro() {
return 9;
}
}new A().metodo(); //5
new B().metodo(); //5public class A {
public int valor = 5;
public int metodo() {
return otro();
}
public int otro() {
return valor;
}
}
public class B extends A {
public int valor = 9;
}new A().metodo(); //5
new B().metodo(); //5Overriding
Shadowing
Shadowing
@acmupm
Herencia y polimorfismo
Constructores en clases heredadas.
public class A {
public A(int a, int b) {
//Whatever
}
}
public class B extends A {
public B(int a, int b) {
super(a, b);
}
}Siempre hay que llamar a los constructores de las clases superiores. Si la clase padre tiene algún constructor sin parámetros, la llamada es implícita. Si no, se llama a través de super(parámetros)
@acmupm
Herencia y polimorfismo
Operador instanceof
Vehiculo v1 = new Coche();
Vehiculo v2 = new Camion();
v1 instanceof Coche; // true
v2 instanceof Camion; // true
v2 instanceof Coche; // falseEs un operador que, a la izquierda toma una instancia, y a la derecha un tipo, y devuelve true si el tipo del objeto de la izquierda es hijo, o implementa el tipo de la derecha.
@acmupm
Interfaces y clases abstractas
interface A {
int b();
int c();
}
class B implements {
public int b() {
return 6;
}
public int c() {
return 1;
}
}
class C implements {
public int b() {
return 3;
}
public int c() {
return 9;
}
}Interfaz
Una interfaz es una estructura que define unos métodos, pero no define su cuerpo (el código). Las interfaces se usan para definir la forma que tienen todas las clases que la heredan.
@acmupm
Interfaces y clases abstractas
public interface Figura {
int nCaras();
int nVertices();
}public interface Figura2D extends Figura {
int area();
}public interface Figura3D extends Figura {
int volumen();
}@acmupm
Interfaces y clases abstractas
public class Rectangulo implements Figura2D {
private int base;
private int altura;
public Rectangulo(int base, int altura) {
this.base = base;
this.altura = altura;
}
public int area() {
return base * altura;
}
public int nCaras() { return 1; }
public int nVertices() { return 4; }
}public class PoligonoRegular implements Figura2D {
private static final ANGULO_TOTAL = 2 * Math.PI;
private double nLados;
private double apotema;
private double lado;
public PoligonoRegular(double nLados, double apotema) {
this.nLados = nLados;
this.apotema = apotema;
this.lado = 2 * apotema *
Math.tan(ANGULO_TOTAL / ( 2 * nLados ));
}
public int area() {
int areaTriangulo = lado * apotema / 2.0;
return areaTriangulo * nLados;
}
public int nCaras() { return 1; }
public int nVertices() { return this.nLados; }
}public class Cubo implements Figura3D {
private double lado;
public Cubo(double lado) {
this.lado = lado;
}
public double volumen() {
return lado * lado * lado;
}
public int nCaras() { return 6; }
public int nVertices() { return 8; }
}public class Tetraedro implements Figura3D {
private double arista;
public Tetraedro(double arista) {
this.arista = arista;
}
public double volumen() {
return (Math.sqrt(2) / 12.0) *
arista * arista * arista;
}
public int nCaras() { return 4; }
public int nVertices() { return 4; }
}@acmupm
Interfaces y clases abstractas
public abstract class Multiplicador {
public double multiplicar(double numero) {
return base * altura;
}
public abstract double factor();
}Clase abstracta
Una clase abstracta es una clase parcialmente implementada. Es decir, puede definir funciones con cuerpo y sin él, que tendrán que completar las clases hijas. No se puede construir directamente.
public class Duplicador extends Multiplicador {
public double multiplicar(double numero) {
return base * altura;
}
public double factor() {
return 2.0;
}
}public abstract class Figura2D
implements Figura {
public int nCaras() { return 1; }
}@acmupm
Igualdad entre instancias
Coche c1 = new Coche("1234BCD", "rojo");
Coche c2 = c1;
c1 == c2; //true
Coche c3 = new Coche("1234BCD", "rojo");
c1 == c3; //falseIdentidad vs. Estado
La identidad es algo propio y único de cada instancia. Dos instancias que se encuentran en la misma región de memoria son, a todos los efectos iguales y se dicen que tienen la misma identidad. La identidad compara con el operador ==
@acmupm
Igualdad entre instancias
Coche c1 = new Coche("1234BCD", "rojo");
Coche c2 = new Coche("1234BCD", "rojo");
c1.equals(c2); // falseIdentidad vs. Estado
Llamamos estado al conjunto de todos los valores de los atributos de una instancia en un momento determinado. Podemos comparar dos instancias a través de su estado pero solo si antes hemos sobreescrito el método equals() de Object para ello.
Tal como está ahora mismo esto es equivalente al ==
Coche c1 = new Coche("1234BCD", "rojo");
Coche c2 = new Coche("1234BCD", "rojo");
c1.equals(c2); // truepublic class Coche {
private String matricula;
private String color;
//[...]
public boolean equals(Object o) {
if (this == o) return true;
if (!(this instanceof Coche)) return false;
Coche cother = (Coche) o;
return matricula.equals(cother.matricula) &&
color.equals(cother.color);
}
}@acmupm
ESTO ES TODO

@acmupm
intr_prog_acm-2
By devcexx
intr_prog_acm-2
- 565