Qual a diferença ? Dúvida sobre herança [RESOLVIDO]

11 respostas
71C4700

Qual a diferença entre os codigos abaixo ?

public  class Pessoa{
// metodos
}

public class Aluno extends Pessoa{
// Métodos
}

Agora :

public abstract class Pessoa{
// métodos
abstract void fazAlgo();
}
public class Aluno extends Pessoa{

void fazAlgo(){}
}
A dúvida é o seguinte quando estanciar no primeiro caso, estamos herdando não só os comportamentos, certo? Quando e qual a melhor situação de usar uma classe abstrata ? Neste caso, qual seria a melhor solução?

Já procurei e não encontrei uma explicação plauzível.

Help me !

11 Respostas

renzonuccitelli

Dê uma olhada nesse tópico: http://www.guj.com.br/posts/list/104554.java#565274
Acho que vai dar uma esclarecida…

71C4700

Esclareceu bastante coisa, mas continuo com algumas dúvidas …

Quando eu herdo de outra classe mesmo sem ser abstrata, esta subclasse é do tipo da super classe ?
Quando eu não possuo métodos que serão implementados pela subclasse, eu utilizaria a super simplismente para refatora um comportamento (uma estrutura ) comum entre todas as subclasses. Qual a melhor maneira ? Em termos de desempenho, qual delas possuem melhor desempenho ?

Desde já agradeço !!!

Andre_Brito

Acho que sim.

Implementar o comportamento comum a todas as classes na super classe.

Eu não sei responder ao certo, mas acredito que o desempenho não seja tão prejudicado. Você pode ver isso quando utiliza o método equals de Object. Por mais que existe uma hierarquia grande, acredito que o desempenho continue praticamente o mesmo. Mas eu não acreditaria concretamente nisso.

71C4700

A dúvida continua.
Qual seria a melhro maneira ?
E em relação aos niveis de hirarquia, o problema é que tenho que trabalhar com ‘interfaces’(neste caso ou a classe abstrata ou a outra), está é a duvida, pois quanto maior for o nivel, maior o desempenho necessario.

E quanto for recupera do banco ? Que temos que recuperar uma quantidade maior de objetos vindos do banco.

Quando a interface é implementada, seria bem mais facil, mas qual seria a melhor maneira ?

Veneno

Olá…

não entendi muito bem esse pergunta, mas quando uma classe herda de uma classe concreta ela é uma subclasse.

A melhor maneira ao meu ver é ter uma classe abstrata contendo esse metodo comum para as classes concretas utilizarem.

desempenho? o que quer dizer com isso?

mas prefira depender de abstrações do que de classe concreta.

não sei se era isso.

flw[]s.

sergiotaborda

71C4700:
Esclareceu bastante coisa, mas continuo com algumas dúvidas …

Quando eu herdo de outra classe mesmo sem ser abstrata, esta subclasse é do tipo da super classe ?
Quando eu não possuo métodos que serão implementados pela subclasse, eu utilizaria a super simplismente para refatora um comportamento (uma estrutura ) comum entre todas as subclasses. Qual a melhor maneira ? Em termos de desempenho, qual delas possuem melhor desempenho ?

Herança não serve para reaproveitar codigo! serve para categorizar. Logo, desempenho não é uma preocupação quando fala de herança. A herança traz um ganho muito superior ao problema do desempenho e portanto vale o sacrifico.

Tlv seja melhor vc trabalhar com interfaces (sem aspas) mesmo. Depois vc implementa a interface que mais lhe importar.

Não. Quando vc instanciar A que herda de B apenas existe um único objeto. Não dois. O nivel de hirarquia não tem relação com o numero de objetos.

A melhor maneira é que que for mais compreensivel. A que se aproximar mais da realidade do seu modelo.
A que for mais fácil de alterar e a que seguir mais de perto os principios de OO como Separação de Responsabilidade e Encapsulamento.

71C4700

sergiotaborda:

A melhor maneira é que que for mais compreensivel. A que se aproximar mais da realidade do seu modelo.
A que for mais fácil de alterar e a que seguir mais de perto os principios de OO como Separação de Responsabilidade e Encapsulamento.

Então neste âmbito seria melhor utilizar classe abstrata, pois ela ‘impõem’ uma interface a ser seguida pelas subclasses?
E a separação ficaria não pelo codigo, mas pela implementação propria de cada classe concreta.

adriano_si

71c4… acho que vc ainda não entendeu bem os conceitos de classes abstratas e interfaces (interface JAVA não GUI)… Acredito que uma estudada mais a fundo nos conceitos ajudariam… É muito relativo essa questão de qual é melhor… isso vai depender de cada caso e pra qual uso… A interface nada mais é que um contrato do que precisa ter a sua classe concreta… já a classe abstrata pode lhe dar essa flexibilidade também, mas só é válido usar uma classe abstrata quando vc tiver pelo menos um método que não precise ser abstrato… vou tentar exemplificar de um modo bem grosseiro…

interface InstrumentoMusical { void emitirSom(); }

abstract class InstrumentoDeCorda implements InstrumentoMusical {
   public void inserirCordas(){
      // colocar o método que montará as cordas no instrumento
   }
}
class Violao extends InstrumentoDeCorda {
   public void emitirSom() {
      // Para cada instrumento criado, vc irá implementar a emissão de som de uma forma diferente...
      // Provavelmente o inserirCordas() tbm entrasse aqui, mas eu tava com preguiça e não achei um
      // exemplo melhor pra implementação na class abstrata
   }
}

Agora eu pergunto pra você:
1 - Das 3 qual é a classe concreta ?
2 - Porque a classe InstrumentoDeCorda precisou ser Abstrata e não de cara uma interface ?
3 - Porque a interface instrumento é uma (desculpa a redundância) uma interface ?

Ao conseguir responder essa pergunta, todos seus problemas estarão solucionados (Brincadeira hehehe)…

Cara espero ter dado um exemplo legal… qualquer coisa estamos aí…

Falows :wink:

71C4700

Novamente, agradeço pela resposta, mas a duvida continua.

O que queria saber é qual a melhor maneira de utilizar as duas situações.

Primeiro: Tenho uma classe A (super), que será herdada por outra classe B (subclasse).
Segundo:Tenho uma classe A(super, mas abstrata), que será herdada por outra classe B (subclasse).

Quando devo utilizar um caso e não outro?
Seria quando devo reaproveitar não apenas compotamentos, mas também estados dos objetos?

E em relação ao uso de uma classe abstrata, não seria uma interface com metodos ja implementados, pois ela tambem estabelece um contrato(tipo) de classe que será ‘tipada’ pelas suas subclasses?

sergiotaborda

71C4700:
Novamente, agradeço pela resposta, mas a duvida continua.

O que queria saber é qual a melhor maneira de utilizar as duas situações.

Primeiro: Tenho uma classe A (super), que será herdada por outra classe B (subclasse).
Segundo:Tenho uma classe A(super, mas abstrata), que será herdada por outra classe B (subclasse).

Quando devo utilizar um caso e não outro?

Se vc pdoe instanciar A por si mesmo, então A não pode ser abstracta , logo, use o primeiro. Se A pode ser instanciada por si mesma então ela não é asbtracta.

Por exemplo A = Animal, B = Cao. Animal é abstrato porque vc não o pode instanciar. ( se instanciar Animal que animal ele seria ? todos ? nenhum ?)

Agora, como passo suplementa, se A é abstrata e todos os seus métodos são abstratos , então use uma interface em vez de classe.

Se vc tem alguma implementação default para algum método a classe tem que ser abstrata e não pode ser um interface.
Os métodos comuns podem ser implementados e os especiais deixados abstratos. Por exemplo, Todos os animais pertencem a uma especie. Logo animal tem um get/setEspecie. Como isso é comum a todos posso implementar isso direto na classe abstrata.
inclusive o atributo (que deverá ser private).

Se a propriedade não é comum a todos os filhos da classe ela não pode estar na classe pai.

A classe abstrata sim estabelece um contrato, mas tb estabelece um comportamento padrão.
Essa é a diferença para interface (que só define um contrato).

Eu costume criar todas os tipos abstratos ( os que são a raiz da hierarquia) como interfaces. Depois crio uma classe implementando a essa interface. Se em algum ponto em deteto que existem coisas comuns a vários objetos da interface eu crio uma classe abstrata intermediária de onde os outros herdam que implementa a interface e implementa alguns métodos com comportamentos comuns a todas as sub classes. às vezes essas comportamentos seguem o mesmo algoritmo geral, mas mudam alguns detalhes. Nesse caso é hora de usar o padrão Template.

71C4700

Grato a Todos!
Problema resolvido.
Obrigado.

Criado 1 de outubro de 2008
Ultima resposta 2 de out. de 2008
Respostas 11
Participantes 6