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();
		}
	}
}