Pessoal,
Estou estudando java, e confesso que não entendi a aplicação dos métodos abstract. Quero dizer, se os “corpos” dos métodos não são definidos, e precisarei defini-los dentro da classe onde será a utilizada, qual a vantagem? :?:
Pessoal,
Estou estudando java, e confesso que não entendi a aplicação dos métodos abstract. Quero dizer, se os “corpos” dos métodos não são definidos, e precisarei defini-los dentro da classe onde será a utilizada, qual a vantagem? :?:
Boa tarde!
Veja bem, você entendeu errado. Um método abstract precisa obrigatoriamente estar contido em uma classe abstrata, mas o inverso não é verdadeiro!
Ou seja, uma classe abstrata pode não ter nenhum método abstrato! Mas como assim?
Vamos supor que você queira uma classe que contenha em seu corpo apenas métodos estáticos mas que a classe não possa ser instanciada!
Bom, basta criar uma classe abstrata! Ela aceita tranquilamente método estáticos.
Pode ser utilizada para adiquirir instancias via reflection, cujas implementações você não sabe ao certo qual classe provê, sabe apenas que ela existe!
Como pode ser em casos em que queira buscar uma conexão ao banco de dados entre outros.
Um outro exemplo é que ela pode ser utilizada igual uma interface, declarar todos os métodos dela como abstratc e obrigar que um filho implemente esses métodos (caso não seja abstrato). Porém, diferentemente de uma interface, ela ainda pode prover métodos estaticos, para alguma peculiaridade.
Há outras vantagens e dependem diretamente da sua necessidade!
Abraços.
Fala nel,
Valeu mesmo pela força! Com relação a classe não poder ser instanciada, estava ciente mas esqueci de mencionar isso na minha dúvida… falha minha. Mas confesso que ainda estou confuso coma relação ao benefício de abstracts. Pelo que entendi até agora, classes abstratact seriam como “classes genéricas”, cuja funcionalidade dos métodos podem variar conforme as caracteristicas do objeto instanciado. Assim vou postar um exemplo simples para deixar mais claro minha dúvida:
public abstract class Car
{
public abstract String getColor();
}
public class Oficina extends Car
{
public String getColor() {
return “red”;
}
Oficina()
{
System.out.println(getColor());
}
public static void main (String[] args)
{
new Oficina();
}
}
Qual a vantagem utilizar o método getColor como abstrato se terei que reproduzir todo ele na classe Oficina?
Antes de mais nada, sempre que postar código, poste-o dentro das tag code, fica 100% mais legível.
A análise da necessidade de uma classe abstrata ou não é referente ao contexto em que ela será empregada.
Não se trata somente de uma classe genérica, não é isso. Calendar é abstrato, perfeito? 
Porque se utiliza o getCalendar() para “pegar” uma instancia dela? Porque existe toda uma regra pré-definida que deve ser aplicada.
Imagine você com a mesma necessidade, entende? 
A vantagem é clara, você pode definir n tipos de implementações para as classes filhas, todas elas terão a mesma assinatura mas podem possuir suas implementações diferenciadas, de acordo com a sua necessidade.
Se você tiver uma única classe que extende, provavél que não compense, mas é questão de analisar, entende?
Eu criei uma classe que simplesmente você configura ela em um arquivo properties e ela retorna a implementação da classe.
Ou seja, você indica a classe, adiciona um JAR ao contexto dela e tens uma nova implementação em mãos.
É por ai o caminho.
Abraços.
Oi
Eu entendi o que quis dizer e sei que isso é só um exemplo, mas tenho que falar: uma oficina não é um carro no mundo real… não faça modelagens assim 
Mas então… a vantagem de se ter um método abstrato é você ter a certeza que uma sub-classe vai implementar um método, e a super-classe não tem a necessidade de implementa-lo… o exemplo clássico é o da forma geométrica:
Um quadrado, um triângulo e um círculo, todos são formas geométricas e tem uma área e um perímetro específicos, mas uma forma geométrica não consegue calcular a área, pois não sabe de que tipo ela é ( ou seja, não faz sentido calcular a área na classe FormaGeometrica
)
FormaGeometrica.java:
public abstract class FormaGeometrica{
public abstract Double calculaArea();
public abstract Double calculaPerimetro();
}
Quadrado.java:
[code]public class Quadrado extends FormaGeometrica{
private int lado;
public Quadrado(int l){
lado = l;
}
public Double calculaArea(){
return lado * lado;
}
public Double calculaPerimetro(){
return lado * 4;
}
}
[/code]
Triangulo.java:
public class Triangulo extends FormaGeometrica{
private int a;
private int b;
private int c;
public Double calculaAltura(){
// esqueci como calcula a altura do triângulo mas isso também não é tão importante agora rsrsr
}
public Double calculaArea(){
return a * calculaAltura() / 2;
}
public Double calculaPerimetro(){
return a + b + c;
}
}
E por aí vai… o que importa aqui é que quando você for usar uma figura geométrica e não se importar de qual figura ela seja você tem certeza que essa figura tem um método calculaArea() sem parâmetros e que retorna um Double 
Update³: [size=18]<[/size]Corrindo assinatura do método claculaPerimetro… faltou os parêntesis xD[size=18]>[/size]