Qual é a verdadeira vantagem de tornar uma classes abstract?

Qual é a verdadeira vantagem de tornar uma classe abstract se não podemos instânciar, pelo que andei pecebendo, abstract só vale a pena em caso de herança, posso tah errado tb, isso que herença é pouco utilizado, pelo que ouço muito, vale mais a pena a composição em certo casos!!!

Alguém poderia me explicar melhor???

por questões de se ter um baixo acoplamento (grau de dependencia da classe para com outras) é preferível usar interface a classe abstrata.

classe abstrata como vc citou: não permite ser instanciada, vc usa em uma situação q o método não é linear tipo um ex:
imagine q uma pizzaria tenha o método calcularTempoDeEntrega(int tempo, int kilometragem), usa lógica é de multiplicar cada 1km vezes 5 minutos sendo q tem cliente q mora num determinado ponto q é demorado transitar por lá, então, qdo. o entregador tem q ir pra lá a lógica é diferente, é 10 minutos por cada 1 km e somar 3,5 minutos pra pagar o pedágio… ou seja, o método não tem só um comportamento então deixa ele sem corpo…

espero q ajude…
André AS

[quote=andredecotia]por questões de se ter um baixo acoplamento (grau de dependencia da classe para com outras) é preferível usar interface a classe abstrata.

classe abstrata como vc citou: não permite ser instanciada, vc usa em uma situação q o método não é linear tipo um ex:
imagine q uma pizzaria tenha o método calcularTempoDeEntrega(int tempo, int kilometragem), usa lógica é de multiplicar cada 1km vezes 5 minutos sendo q tem cliente q mora num determinado ponto q é demorado transitar por lá, então, qdo. o entregador tem q ir pra lá a lógica é diferente, é 10 minutos por cada 1 km e somar 3,5 minutos pra pagar o pedágio… ou seja, o método não tem só um comportamento então deixa ele sem corpo…

espero q ajude…
André AS[/quote]

bem, se for necessario um classe ter obrigatoriamente um overriding, é melhor criar uma interface neh???

Na verdade a classe abstrata também pode conter métodos com “recheio”, caso que interface não pode…

[quote=alexandref93]Qual é a verdadeira vantagem de tornar uma classe abstract se não podemos instânciar, pelo que andei pecebendo, abstract só vale a pena em caso de herança, posso tah errado tb, isso que herença é pouco utilizado, pelo que ouço muito, vale mais a pena a composição em certo casos!!!
[/quote]

No Java 7, haverá a possibilidade de você poder associar código a métodos de uma interface, e isso irá praticamente eliminar a necessidade de criar classes abstratas (um troço que por enquanto tem o nome humorístico de “public defender methods”, ou seja, “métodos defensores públicos*”, a menos que você queira usar as classes abstratas para engessar seu código de propósito.

  • O criador da proposta dos “métodos defensores públicos”, Brian Goetz, fez uma piada com os “defensores públicos”, que são aqueles advogados que o Governo contrata para defender os réus, se eles não tiverem condições de contratar advogados.

Uma outra grande utilidade de classes abstratas é o uso do padrão Template. A classe não precisa ser necessariamente abstrata, mas em o sendo, deixa que claro um determinado comportamento deve ser implementado. Imagine que você tenha vários e vários trechos de código assim:

   (...)
   iniciaTransacao();

   try {
      gravaRegistro1();
      gravaRegistro2();
      (...)

      salvaTransacao();

   } catch (SQLException e) { 
      cancelaTransacao();
      throw e;
   }
}

Então, você poderia criar uma classe abstrata TransacaoTemplate, por exemplo, assim:

public abstract class TransacaoTemplate {

   public TransacaoTemplate() throws SQLException {
      iniciaTransacao();

      try {
         executaOperacoes();
         salvaTransacao();
      } catch (SQLException e) { 
         cancelaTransacao();
         throw e;
      }
   }

   public abstract executaOperacoes() throws SQLException;
}

E agora, a parte mágica! Sempre que precisar proteger um bloco de código em uma transação, usa assim:

   (...)
   new TransacaoTemplate() {
      public executaOperacoes() throws SQLException {
         gravaRegistro1();
         gravaRegistro2();
      }
   };
   (...)

olha só tenhu um bom exemplo!!!

Classes abstratas (abstract classes) não diferem muito das classes que normalmente criamos, ou seja, elas também podem possuir propriedades e métodos. Porém, não é possível criar instâncias de uma classe abstrata usando o operador new. Veja:

[code]abstract class Pessoa{
public String nome;
public int idade;
}

public class Estudos{
public static void main(String args[]){
// cria um objeto da classe Pessoa
Pessoa p = new Pessoa();
}
}[/code]
Ao tentarmos compilar este exemplo teremos a seguinte mensagem:

Estudos.java:9: Pessoa is abstract; cannot be instantiated Pessoa p = new Pessoa(); ^
1 error

Classes abstratas geralmente contém métodos abstratos (ainda que métodos não abstratos sejam também permitidos). Um método abstrato é um método que possui apenas a assinatura. Não há implementação. Esta implementação deverá ser fornecida pela subclasse ou classe derivada. Uma classe que contém métodos abstratos deverá, obrigatoriamente, ser declarada abstrata. Veja um exemplo de um método abstrato:

public abstract class Pessoa{ public abstract String getNome(); }
Se a classe não fosse declarada com o modificador abstract, teríamos a seguinte mensagem de erro de compilação:

Pessoa.java:1: Pessoa is not abstract and does not override abstract method getNome() in Pessoa public class Pessoa{ ^1 error

Classes abstratas são um dos tópicos mais complicados da linguagem Java e uma dor de cabeça enorme para aqueles que estão estudando para a certificação Java. Mostramos abaixo algumas dicas resultantes de nossas pesquisas sobre o assunto.

1)Uma classe não abstrata não pode conter métodos abstratos. Se uma classe concreta (não abstrata) herda de uma classe abstrata e não implementa todos os métodos abstratos, a classe derivada deve ser declarada abstract. Além disso, métodos abstratos não podem ser marcados como static. Insistir nisso pode gerar a seguinte mensagem de erro de compilação:

Pessoa.java:2: illegal combination of modifiers: abstract and static public static abstract String getNome(); ^

  1. Embora uma classe abstrata não possa ser instanciada usando o operador new, ela pode conter construtores. Tais construtores serão invocados nos construtores das classes derivadas.

  2. Uma subclasse pode ser abstrata até mesmo se sua superclasse for concreta. E isso é fácil de notar, uma vez que todas as classes Java herdam de Object, que é concreta.

  3. Uma classe derivada pode sobrescrever um método de sua superclasse e declará-lo abstract. Isso faz sentido quando a classe derivada for abstract e quiser tornar o método herdado inválido.

  4. Embora uma classe abstrata não possa ser instanciada usando o operador new, ela pode ser usada como um tipo de dados. Esta técnica é útil quando parte do time de desenvolvedores precisa adiantar códigos que dependem de classes que ainda não foram implementadas (e, portanto, herdarão das classes abstratas usadas como tipos de dados) por outra parte do mesmo time.

[quote=alexandref93][quote=andredecotia]por questões de se ter um baixo acoplamento (grau de dependencia da classe para com outras) é preferível usar interface a classe abstrata.

classe abstrata como vc citou: não permite ser instanciada, vc usa em uma situação q o método não é linear tipo um ex:
imagine q uma pizzaria tenha o método calcularTempoDeEntrega(int tempo, int kilometragem), usa lógica é de multiplicar cada 1km vezes 5 minutos sendo q tem cliente q mora num determinado ponto q é demorado transitar por lá, então, qdo. o entregador tem q ir pra lá a lógica é diferente, é 10 minutos por cada 1 km e somar 3,5 minutos pra pagar o pedágio… ou seja, o método não tem só um comportamento então deixa ele sem corpo…

espero q ajude…
André AS[/quote]

bem, se for necessario um classe ter obrigatoriamente um overriding, é melhor criar uma interface neh???[/quote]

Cara… tudo vai depender do teu projeto… Eh preferivel que voce entenda o que sao classes abstratas… e que ao extende-las voce nao pode extender mais nada, ja as Interfaces nao… pode implementar quantas quiser… mas, e se algum dos teus metodos possuir o mesmo comportamento, independente da subclasse ??? Podes colocar em uma classe abstrata um metodo nao abstrato… mas nao em uma interface… Tudo depende do Projeto. O recurso esta disponivel, usa quem quer e como for melhor ao Projeto.

Flws :wink:

[quote=entanglement][quote=alexandref93]Qual é a verdadeira vantagem de tornar uma classe abstract se não podemos instânciar, pelo que andei pecebendo, abstract só vale a pena em caso de herança, posso tah errado tb, isso que herença é pouco utilizado, pelo que ouço muito, vale mais a pena a composição em certo casos!!!
[/quote]

No Java 7, haverá a possibilidade de você poder associar código a métodos de uma interface, e isso irá praticamente eliminar a necessidade de criar classes abstratas (um troço que por enquanto tem o nome humorístico de “public defender methods”, ou seja, “métodos defensores públicos*”, a menos que você queira usar as classes abstratas para engessar seu código de propósito.

  • O criador da proposta dos “métodos defensores públicos”, Brian Goetz, fez uma piada com os “defensores públicos”, que são aqueles advogados que o Governo contrata para defender os réus, se eles não tiverem condições de contratar advogados.

[/quote]

Poutz cara… isso vai ser porrada… no aguardo desde ja…

vlw galera, jah deu pra entender um pouco!!!

Obrigado pela atenção!!!