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

Qual a diferença entre os codigos abaixo ?

[code]public class Pessoa{
// metodos
}

public class Aluno extends Pessoa{
// Métodos
}[/code]

Agora :

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

void fazAlgo(){}
}[/code]
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 !

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

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 !!!

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.

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 ?

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.

[quote=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 ?
[/quote]

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.

[quote=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.[/quote]

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.

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:

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?

[quote=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?
[/quote]

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.

Grato a Todos!
Problema resolvido.
Obrigado.