Interface e Class abstrata

Pessoal… Estou estudando Java e como muitos aqui com aquela dificuldade de empregar os conceitos de Interface e Class abstrata …

Quando usa um quando usa o outro ???
Um exemplo com caso real please…

Ja sei que o exemplo do aviao e do passaro com a interface VOAR … Mas por aqui nao usamos muito este tipo de class. e to com dificuldade de empregar este conceito num caso real

Se alguem tiver um programinha que use estes conceitos e quiser postar agradeço…

Segue exemplo que estou tentando implementar se alguem poder me ajudar valeu :D…

Livro.java

class Livro{

	private int 	isbn;
	private String 	nome,autor;	
	
	//Construtor
	public Livro (int i, String n, String a ){
		this.isbn  = i;
		this.nome  = n;
		this.autor = a;
	}
	
	public int getIsbn() {
		return isbn;
	}
	
	public String getNome() {
		return nome;
	}
	
	public String getAutor() {
		return autor;
	}
}

Cds.java

class Cds {

	private int 	codigo;
	private String 	album,cantor;
	private boolean duplo;
	
	//Construtor
	public Cds (int c, String a, String ca, boolean d ){
		this.codigo  = c;
		this.album   = a;
		this.cantor  = ca;
		this.duplo   = d;
	}
	
	public int getCodigo() {
		return codigo;
	}
	
	public String getAlbum() {
		return album;
	}
	
	public String getCantor() {
		return cantor;
	}

}

Reserva.java

public interface Reserva {
	public void Reserva(int codigo);
}

Loja.java

class Loja {
	public static void main(String args[]){

		Livro l1 = new Livro(123456,"Core Java","Nao sei");	
		Cds   c1 = new Cds(00000,"Let Love In","Goo Goo Dolls",true);
		
				
		System.out.println(l1.getNome());
		
	}
	
	class ReservaCD extends Cds implements Reserva{	
		public ReservaCD(int c, String a, String ca, boolean d){
			super(c,a,ca,d);
			
		}
		public void Reserva(int codigo) {
		
		}
	}	
	
	class ReservaLivro extends Livro implements Reserva{	
		Livro (int i, String n, String a ){
			super(i,n,a);
			
		}
		public void Reserva(int codigo) {
		
		}
	}		
}

Gostaria de saber se o raciocinio está correto ?
O Loja.java estou apanhando pra implementar… :assusta:
Se alguem puder ajudar agradeço!!!

No exemplo que eu postei nau uso class abstrata porem pelo que eu li caso eu queira implementar uma class onde exista alguns metodos já definidos e outros para implementar deve se usar uma classe abstrata.

Podem alterar o quanto achar necessário… Certamente isto não ira ajudar apenas eu :smiley:

Em uma interface vc define assinaturas de métodos como regras. Toda classe q implementar esta interface deverá obrigatóriamente implementar estes métodos.

public void exec();

Já na classe abstrata, vc declara as assinaturas como na interface, acrescentando abstract na assinatura do método :
Ex.:

public abstract void exec();

… e pode também acrescentar o código do método, permitindo as classes que herdarem esta abstrata receber estes métodos por herança ou simplesmente reescrevê-los. Neste caso, não se deve assinar o método como abstract.

Em curtas palavras, vc define regras de implementação em ambas (interface e classe abstrata) diferenciando somente que a classe abstrata permite que vc implemente métodos para que suas classes filhas herdem.

[]'s

Dá uma lida nesse post aqui. Eu gastei um bom tempo explicando interfaces para o pessoal e, mais para o final, falei um pouco das classes abstratas.

Existem alguns exemplos nesse tópico, como nessa resposta um pouco mais abaixo.

Bom li tudo dexa eu ver se intendi.

1 - Interface
Uso isso quando quero que alguem implemente os metodos.
Herança multipla

2- Abstração
Uso quando quero definir alguns metodos porém dexar outros para alguem implementar.

No exemplo que coloquei a Reserva é uma interface… entao quem quiser reservar alguma coisa tem que definir como esta reserva será feita. Se é em caixa ou unidade, se da pra reservar um lote ou nao, se é livro, revista ou cd… sei la o desenvolvedor loko que vai definir isso … porem obrigatoriamente ele deve implementar o método Reserva()

Se no exemplo eu quiser que em toda reserva uma consulta no estoque, validar o código do produto , alguma informação do vendedor etc…

teria que fazer uma class abstrata, porque apesar de querer que o cara implemente o metodo reserva() da forma que ele bem entender, defini regras específicas como consultar estoque ou validacao do vendedor na classe…

É issu ??

Ou to viajando d+ ???

Obrigado!!! :smiley:

Conceitualmente:
implementação de várias interfaces != herança múltipla.

Herança define uma relação de tipos.
Interface uma relação de resposabilidades.

Não pense numa interface como uma herança. Se tentar fazer isso, nunca vai entender o conceito.

A interface é um um contrato de quem implementa uma funcionalidade com quem a usa. Ela não diz o que o objeto que a implementa é, mas o que ele é capaz de fazer.

Uma classe abstrata, por outro lado é uma especificação de um tipo de objeto. Ela define o que o objeto é. As implementações dessa classe serão objetos desse tipo, terão um vínculo forte com a classe pai e terão seu comportamento geralmente similar aos objetivos do pai.

No exemplo que dei no link que passei, Colorivel apenas restringia a uma classe a obrigação de ter um método para saber sua cor. A classe pode ser encarada como um objeto colorido, mas é uma relação muito mais fraca, por exemplo, de você dizer que o Cavalo é um Animal.

Por exemplo, a interface que você criou. Ela tem um bom nome de superclasse. Reserva. Ou seja, filhas dela serão tipos de reserva.

Agora, se você quer definir uma interface, esse não seria um bom nome. Um bom nome seria Reservavel. Ou seja, qualquer coisa que implemente a interface será reservável, mas você não especifica exatamente o que essa coisa é.