Clases abstractas e interfaces

Clase abstracta:

package com.trifulcas.clases;


// Clase abstracta. Es una clase que puede tener de todo como un clase normal
// Pero no puede ser instanciada
// Con frecuencia las clases abstractas incorporan métodos abstractos
abstract public class Animal {
	String nombre;
	// Esto es un método abstracto
	// Significa que sólo definimos parámetros de entrada y salida
	// No especificamos funcionalidad en código
	// Obligar a todas las clases derivadas a implementar este método
	abstract void sonido();
	// Esto es un método normal y corriente
	public void saludo() {
		System.out.println("Me llamo "+nombre);
	}
	
}

class Perro extends Animal{
	public void sonido() {
		System.out.println("Guau");
	}
	public void aullido() {
		System.out.println("Auuuuuu");
	}

}
class Gato extends Animal{
	public void sonido() {
		System.out.println("Miau");
	}
	public void ronroneo() {
		System.out.println("Rrrrrr");
	}
}
class Pato extends Animal{
	public void sonido() {
		System.out.println("CuaCua");
	}
}
class Ornitorrinco extends Animal{

	public void sonido() {
		System.out.println("Bidiji");
	}
}

class Caballo extends Animal{

	@Override
	public void sonido() {
		System.out.println("Brrr");
		
	}
	
}

Interfaces:

package com.trifulcas.clases;


// Definiendo un interface con un método
interface Audio {
	// Este método es como un método abstracto de una clase abstracta
	// Las clases que implementen este interfaz deben implementar el método
	void sonido();
}

interface Movimiento{
	void acelerar();
	void frenar();
}


class Automovil implements Audio,Movimiento {

	@Override
	public void sonido() {
		System.out.println("brum brum");
	}

	@Override
	public void acelerar() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void frenar() {
		// TODO Auto-generated method stub
		
	}

}

class Monociclo  implements Audio  {

	@Override
	public void sonido() {
		System.out.println("Dring dring");

	}

}

class Avion implements Audio{

	@Override
	public void sonido() {
		// TODO Auto-generated method stub
		
	}
	
}
package com.trifulcas.clases;

public class Instrumento implements Audio {

	public Instrumento() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void sonido() {
		System.out.println("Tarán");
	}

}

Un interfaz suelto con herencia:

package com.trifulcas.clases;

public interface Financiero {
	// Métodos que se tienen que implementar en aquellas clases
	// que implementen este interfaz
	// Y con los mismos parámetros de entrada y salida
	double interes();
	double irpf(int importe);
}

interface Bolsa extends Financiero{
	void compra();
}

Clases que implementan ese interfaz:

package com.trifulcas.clases;

// Al implementar 'Financiero' estoy obligado a definir los métodos
// incluídos en el interfaz: interes e irpf
public class Banco implements Financiero {
	private int saldo;

	public Banco() {
		saldo = 9000;
	}

	@Override
	public double interes() {
		if (saldo < 500) {
			return 0.5;
		} else {
			return 0.3;
		}
	}

	@Override
	public double irpf(int importe) {

		return 0.12;
	}

}

package com.trifulcas.clases;


// Lo mismo que en Banco. Pero 'Sueldo' y 'Banco' son dos clases que
// no están relacionadas por herencia
public class Sueldo implements Financiero {

	public Sueldo() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public double interes() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public double irpf(int importe) {
		// TODO Auto-generated method stub
		return 0.15;
	}

}

package com.trifulcas.clases;

abstract public class Broker implements Bolsa {

	public Broker() {
	}
	abstract void comision();
}


// Esta clase hereda:
// 1.- El contrato de el método abstracto comision de su clase madre
// 2.- El contrato del interfaz Bolsa que ha adquirido la madre
// 3.- El contrato del interfaz Financiero que ha adquirido Bolsa por extenderlo
class WallStreet extends Broker{

	@Override
	public void compra() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public double interes() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public double irpf(int importe) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	void comision() {
		// TODO Auto-generated method stub
		
	}
	
}



Uso en el programa:

package com.trifulcas.clases;

import com.trifulcas.ejercitos.Ejercito;

public class ProbarClases {

	public static void main(String[] args) {
		
		Animal[] granja= {new Perro(),new Gato(),new Pato()};
		Audio[] parque= {new Automovil(), new Monociclo(),new Instrumento()};
		
		Financiero[] empresa= {new Banco(),new Sueldo(),new Banco()};
		
		Perro p=new Perro();
		
		
		
		for(Financiero f:empresa) {
			System.out.println(f.interes());
		}
		
		Banco b=new Banco();
		Sueldo s=new Sueldo();
		
		System.out.println(importe(b,1000));
		System.out.println(importe(s,2000));
		
		Movimiento miCarro=new Automovil();
		
		for(Animal animal:granja) {
			animal.sonido();
		}
		for(Audio vehiculo:parque) {
			vehiculo.sonido();
		}
		
		Automovil auto=new Automovil();
		Instrumento violin=new Instrumento();
		
		repetir(auto,3);
		repetir(violin,8);
	}
	
	// El parámetro 'elemento' debe ser de una clase que implemente el
	// interfaz 'Financiero' obligatoriamente yo sé que ese parámetro
	// tendrá definidos los métodos 'interes' y 'irpf'
	public static double importe(Financiero elemento, double importe) {
		return elemento.interes()*importe;
	}
	
	public static void repetir(Audio elemento, int veces) {
		for(int i=0;i<veces;i++) {
			elemento.sonido();
		}
	}
}