Explicação de classe abstrata X Interface

Olá pessoal,

alguem poderia me ajudar na definição classe abstrata e interface e por que usar uma classe abstrata e usar interface .

E qual a diferença entre elas ?

Se alguem puder me ajudar agradeceria …

abs

Olá,

Basicamente é assim:

Uma interface, você não implementa os métodos. Um exemplo classico disso é a api de conexão com banco de dados, A SUN criou as interfaces de conexão e a oracle implementou de um jeito, o mysql implementou de outro e assim por diante. Na interface você só define o que vai ser desenvolvido.

Uma classe abstrata, quando extendemos ela, podemos ou não implementar os métodos definidos na superclasse. Onde é muito usado isso é na especificação http. Você implementa o doGet() ou o doPost() ou o doPut() mas não é obrigado a implementar todos.

espero ter ajudado e qualquer coisa pode perguntar :wink:

Ricardo Cabral

obrigado pelo retorno…

Uma duvida no exemplo abaixo quando extend da ClasseA veio todos
os metodos mais só queria implementar o metodo FilhoC() e o outros dois (FilhoA(),FilhoB())não queria que aparecesse tem jeito ou é assim mesmo tem que trazer ele e não implementar ?

quem puder me ajudar agradeceria …

abs


public abstract class ClasseA {

	 abstract String FilhoA();
	 abstract String FilhoB();
	 abstract String FilhoC();
}

public class ClasseB extends ClasseA {

	

	String FilhoC() {
		// TODO Auto-generated method stub
		return "Retorno FilhoC";
	}

	String FilhoA() {
		// TODO Auto-generated method stub
		return null;
	}

	String FilhoB() {
		// TODO Auto-generated method stub
		return null;
	}

}

assim eu posso implementar um metodo em uma classe abstrata e em uma interface ela é 100% abstrata! lembrando que uma interface ele deve ser implementada uma calsse abstrata ela pode ou nao ser implementada dépende da classe que ela extends.

É assim mesmo, quando você extender uma classe abstrata você tem que implementar todos os seus métodos (abstratos, pois uma classe abstrata também pode ter métodos não abstratos), a menos que sua classe também seja abstrata.


public abstract class ClasseA {

                 public ClasseA()
                 {
                         System.out.println("Construtor de A");
                 }

	 abstract String FilhoA();
	 abstract String FilhoB();
	 abstract String FilhoC();
}

public class ClasseB extends ClasseA {

	

	String FilhoC() {
		// TODO Auto-generated method stub
		return "Retorno FilhoC";
	}

	String FilhoA() {
		// TODO Auto-generated method stub
		return null;
	}

	String FilhoB() {
		// TODO Auto-generated method stub
		return null;
	}

}

public class Main
{
                         public static void main(String args[])
                         {
                                    ClasseA a = new ClasseB();
                                    a.FilhoC();
                         }
}

Alguém poderia me fazer o favor de explicar porque quando instancio ClasseB, é chamado o construtor da classe A (ClasseA) ?

[i]"O objetivo de uma interface em Orientação a Objetos é definir um conjunto de comportamentos
(métodos) que devem obrigatoriamente ser implementados pelas classes que utilizam a interface.
Diferente da herança uma classe Java pode implementar n interfaces.

Classe que não produz instância, ou seja, não pode ser instanciada diretamente. Uma classe
abstrata possui características que devem ser implementadas por classes filhas que vão
especializar suas características e comportamento, permitindo instanciar o objeto indiretamente
através de seu filho. Além de não produzir instância, uma classe abstrata permite a declaração de
métodos abstratos. Os métodos abstratos são obrigatoriamente implementados pelas classes
filhas concretas, quando a mesma herda de uma classe abstrata."[/i]

Basicamente é isto.

[quote=ftorres]O objetivo de uma interface em Orientação a Objetos é definir um conjunto de comportamentos
(métodos) que devem obrigatoriamente ser implementados pelas classes que utilizam a interface.
Diferente da herança uma classe Java pode implementar n interfaces.

Classe que não produz instância, ou seja, não pode ser instanciada diretamente. Uma classe
abstrata possui características que devem ser implementadas por classes filhas que vão
especializar suas características e comportamento, permitindo instanciar o objeto indiretamente
através de seu filho. Além de não produzir instância, uma classe abstrata permite a declaração de
métodos abstratos. Os métodos abstratos são obrigatoriamente implementados pelas classes
filhas concretas, quando a mesma herda de uma classe abstrata.

Basicamente é isto.[/quote]

[b]ftorres, então…

Eu até entendo o conceito de abstract, mas não entendo o porquê ao instanciar uma classe abstract - a partir das classes filhas - é chamado o construtor da classe pai ao invés da classe filho.

Alguém sabe o porquê?[/b]

Reaproveitamento de codigo…

vc pode criar uma classe abstrata (que não pode ser instanciada) e deixa a implementação de algum ou alguns metodos por conta da classe filha. A instancia será criada a partir da classe filha (não abstrata) e vc ira reaproveitar os metodos implementados na classe mae.

[quote=Lucas Abbatepaolo]Reaproveitamento de codigo…

vc pode criar uma classe abstrata (que não pode ser instanciada) e deixa a implementação de algum ou alguns metodos por conta da classe filha. A instancia será criada a partir da classe filha (não abstrata) e vc ira reaproveitar os metodos implementados na classe mae.

[/quote]

Bem, se eu faço, p. ex:

ClasseA a = new ClasseA();

Considerando que ClasseA não é abstrata, eu estou chamando o construtor da ClasseA. Até aí, Ok!
Porém, se ClasseA é abstrata e recebe uma instância da classe filha, p. ex. , ClasseB, por que então não se chama o construtor da ClasseB ?

Vamos imaginar o seguinte senario:

ClasseA -> Classe Abstrata (possui um metodo concreto fazerAlgo() e um metodo abstrato desfazerAlgo())
ClasseB -> Classe Concreta que extende a ClasseA (possui a implementação obrigatoria do metodo desfazerAlgo());


ClasseA a = new ClasseA(); //isso ira gerar erro ja q ClasseA é abstrata ela não pode ser instanciada

ClasseA b = new ClasseB(); //isso ira executar pereitamente ja q vc esta usando uma referencia a ClasseA porem vc instancia a ClassB
                                          //aqui o construtor executado é o da classe b

b.fazerAlgo(); //sera executado a implementação ja existente na ClasseA
b.desfazerAlgo(); //sera executado a implementação feita na ClasseB

Sobre o construtor:

Quando voce instancia um objeto filho antes de executar o seu prorpio contrutor, sera executado o contrutor da classe mãe:
execute exste codigo que vc entenderá o q eu disse:

/**
 *
 * @author Lucas
 */
class ClasseA {

    public ClasseA() {
        System.out.println("Construindo a classe A");
    }
     public static void main(String[] args) {
        ClasseA a = new ClasseB();
    }
    
}

class ClasseB extends ClasseA {

    public ClasseB() {
        System.out.println("Construindo a classe B");
    }
    
}

[quote=Lucas Abbatepaolo]Vamos imaginar o seguinte senario:

ClasseA -> Classe Abstrata (possui um metodo concreto fazerAlgo() e um metodo abstrato desfazerAlgo())
ClasseB -> Classe Concreta que extende a ClasseA (possui a implementação obrigatoria do metodo desfazerAlgo());


ClasseA a = new ClasseA(); //isso ira gerar erro ja q ClasseA é abstrata ela não pode ser instanciada

ClasseA b = new ClasseB(); //isso ira executar pereitamente ja q vc esta usando uma referencia a ClasseA porem vc instancia a ClassB
                                          //aqui o construtor executado é o da classe b

b.fazerAlgo(); //sera executado a implementação ja existente na ClasseA
b.desfazerAlgo(); //sera executado a implementação feita na ClasseB

Sobre o construtor:

Quando voce instancia um objeto filho antes de executar o seu prorpio contrutor, sera executado o contrutor da classe mãe:
execute exste codigo que vc entenderá o q eu disse:

[code]
/**
*

  • @author Lucas
    */
    class ClasseA {

    public ClasseA() {
    System.out.println(“Construindo a classe A”);
    }
    public static void main(String[] args) {
    ClasseA a = new ClasseB();
    }

}

class ClasseB extends ClasseA {

public ClasseB() {
    System.out.println("Construindo a classe B");
}

}
[/code][/quote]

[b]Olá Lucas!

Eu sei que uma instância de uma classe B, que é filha de uma classe A, abstrata, invocará o construtor de A. Queria saber o porquê, ao invés de chamar o construtor de B.

[/b]

voce executou o codigo q te mandei???

vai ser chamado o construtor da classe B…porem dentro do construtor da classeB será implicitamente chamado o construtor da classeA fazendo que seja executado os 2 construtores primeiro o da classe mae e segundo o da classe filha…

isso ocorre por causa da herança. Quando utilizamos este relacionamento estamos assumindo por exemplo que a ClasseB É UMA ClasseA. Pos isso tambem é executado o construtor da classeA

Jovem,

Ultimamente estou vendo diversos questionamentos inaceitaveis e dúvidas infames. Prezados companheiros do forum, esperamos que, no mínimo, para postarmos dúvidas, os requisitos necessários seja “conhecer” a linguagem Java. Desta forma, espera-se que o forum nao seja um mecanismo de aprendizado inicial e sim, uma ferramenta confiável se solução de dúvidas pertinentes em nosso mundo.

Para os iniciantes, sugiro que procurem livros e cursos, o objetivo do forum é de auxilio e não de iniciação a carreira.

Basta!!! Cansei de ver “Hello Word”.

Espero que isso não volte a se repetir.

abs,

Obrigado Lucas…

[quote=ECO2004][quote=Lucas Abbatepaolo]Vamos imaginar o seguinte senario:

ClasseA -> Classe Abstrata (possui um metodo concreto fazerAlgo() e um metodo abstrato desfazerAlgo())
ClasseB -> Classe Concreta que extende a ClasseA (possui a implementação obrigatoria do metodo desfazerAlgo());


ClasseA a = new ClasseA(); //isso ira gerar erro ja q ClasseA é abstrata ela não pode ser instanciada

ClasseA b = new ClasseB(); //isso ira executar pereitamente ja q vc esta usando uma referencia a ClasseA porem vc instancia a ClassB
                                          //aqui o construtor executado é o da classe b

b.fazerAlgo(); //sera executado a implementação ja existente na ClasseA
b.desfazerAlgo(); //sera executado a implementação feita na ClasseB

Sobre o construtor:

Quando voce instancia um objeto filho antes de executar o seu prorpio contrutor, sera executado o contrutor da classe mãe:
execute exste codigo que vc entenderá o q eu disse:

[code]
/**
*

  • @author Lucas
    */
    class ClasseA {

    public ClasseA() {
    System.out.println(“Construindo a classe A”);
    }
    public static void main(String[] args) {
    ClasseA a = new ClasseB();
    }

}

class ClasseB extends ClasseA {

public ClasseB() {
    System.out.println("Construindo a classe B");
}

}
[/code][/quote]

[b]Olá Lucas!

Eu sei que uma instância de uma classe B, que é filha de uma classe A, abstrata, invocará o construtor de A. Queria saber o porquê, ao invés de chamar o construtor de B.

[/b][/quote]

Lucas, vou tentar te explicar o porque não chamar o construtor de B. Pense em uma situação que você tenha que tocar instrumentos e você crie:

public abstract class Instrumento { abstract void Tocar(); }

Agora pense que no seu programa quem vai criar os objetos instrumentos não será você. Então como você vai fazer para tocar os instrumentos ?
Você precisaria apenas saber que ele é filho de Instrumento então você vai ter certeza que ele vai tocar. Agora o porque instanciar o construtor pai. Na verdade classe abstrata e interface possuem construtores para as classes filhas porém não são instanciáveis. O que você faz é chamar o pai com uma instacia de filho isto possibilita que você trate o filho com os metodos que estão no pai porem os filhos podem responder a estes metodos de uma forma diferente. Exemplo:.

Instrumento violao = new Violão();

O objeto violao so tem os metodos declarados em instrumento porém irá responder ao método como se fosse um violão ou seja ele vai tocar como violão.

Caro colega…

Referente as classes abstratas e sua afirmação de que elas não possuem construtor, acho q vc esta equivocado…

as classes abstratas podem possuir construtores, que serão executados toda vez que uma classe filha for instanciada…

Uma interface é diferente a classe não extende a interface e sim implementa.

Eu entendo o seu exemplo, mais vc pensou em um caso especifico. no seu caso vc nao precisaria criar um contrutor na sua casa abstrata. porem vamos supor q vc tem uma classe abstrata carro. Ela possue um construtor (mesmo não podendo ser instanciada)

Depois temos uma classe CarroPopular e CarroLuxo. Vc concorda que ate um certo ponto a construção dos carros da mesma forma, e em um determinado momento vc ira criar as particularidades de cada um.

Se vc nao implementar o que tem de comum na construção das duas classe filhas no construtor da classe abstrata, vc tera q duplicar seu codio…colocando um em cada classe filha.

O que vc mencionou no tocar violão chama polimorfismo…

executar metodo de classes filhas a partir de uma referencia da classe pai de acordo com a instancia.

Isso nao diz respeito a construtores…

Concordo Lucas porem a pergunta dele condiz com polimorfismo pois as classes abstratas e as interfaces nada mais são do que padroes a serem seguidos ou contratos a serem seguidos para que se torne mais facil a aplicabilidade do polimorfismo. As classes abstratas tem metodos implementados que os filhos herdaram ou metodos a serem implementados pelos filhos.