public abstract class Abstrata {
public void metodoNaoAbstrato() {
System.out.println("Este metodo nao é abstrato!");
}
}
extendo isso à uma classe TesteAbstract sem problema nenhum…
Alguém poderia me dizer QUE @!$#)@$* É ISSO? o0o0 Afinal, ali nao tem nenhum método abstrato, mas nem por isso deixou de compilar e executar sem problemas em “public class TesteAbstract extends Abstrata” ;xx
Obrigado pela atenção
ps:
[b]SO: Ubuntu 8.04
$java -version
java version “1.6.0_0”
OpenJDK Runtime Environment (build 1.6.0_0-b11)
OpenJDK Client VM (build 1.6.0_0-b11, mixed mode, sharing)
[/b]
Vocês não estão com os conceitos bem firmados sobre classe abstrata.
Bom, sou iniciante também, mas vou tentar ver se ajudo.
1- Uma classe abstrata não pode ser instanciada.
3- Uma classe abstrata é uma classe definida como tal que PODE ter métodos abstratos e PODE ter métodos já implementados.
4- Se uma classe possui pelo menos um método abstrato, DEVE ser definida como uma classe abstrata explicitamente.
5- Se uma classe extende uma classe abstrata, ela deve OU implementar todos os métodos abstratos que a classe herdada possui OU ser também definida como abstrata.
Bom, resumindo, isso é o básico pra saber de classe abstrata.
Sabendo isso é fácil ver que não tem problema algum com o que você fez.
Você definiu uma classe abstrata e inseriu um método implementado (o que não tem nada de errado) e não definiu nenhum método abstrato (o que também não tem nada de errado).
Quando você herdou essa classe, você teria que implementar os métodos abstratos, já que você não definiu essa classe filha como abstrata, mas como não possui métodos abstratos, o trabalho já está completo.
A única utilidade de ter uma classe abstrata sem métodos abstratos que eu vejo nesse caso é a garantia de que essa classe não pode ser instanciada.
Não entendi muito bem a dúvida, mas a regra é a seguinte, uma classe abstrata pode ter métodos não abstratos, porém, uma classe “não-abstrata” não pode possuir métodos abstratos, exemplificando:
public abstract class Class1 {} //ok
public abstract class Class2 { //ok
public void method1() {}
}
public abstract class Class3 { //ok
public void method1() {}
public abstract void method2();
}
public class Class4 { //nops, a classe tem que ser abstrata
public void method1() {}
public abstract void method2();
}
public class Class5 extends Class3 { //nops, tem que ser abstrata ou implementar os métodos
}
public class Class6 extends Class3 { //ok, implementou o método
public void method2() {}
}
public abstract class Class7 extends Class3 { //ok é uma classe abstrata
}
[quote]Você definiu uma classe abstrata e inseriu um método implementado (o que não tem nada de errado) e não definiu nenhum método abstrato (o que também não tem nada de errado).
[/quote]
O motivo da minha dúvida é que li em algum lugar (nao lembro onde) que uma classe abstrata deve, necessariamente, conter pelo menos 01 (um) método abstrato. Isso não é verdade? Caso falso, minha dúvida está resolvida!
[quote]A única utilidade de ter uma classe abstrata sem métodos abstratos que eu vejo nesse caso é a garantia de que essa classe não pode ser instanciada. [/quote] Por isso, a instrução é que vc só crie classes abstratas se elas realmente te derem o benefício completo que classes abstratas te trazem, mas não é lei…
no livro está assim:
“An abstract class is a class in which one or more methods are declared, but not defined”
Uma classe abstrata é uma classe onde um ou mais métodos são declarados, mas não definidos
Beginning Java - Ivon Hort
Bom, ele fala que é uma classe com um ou mais métodos abstratos, mas o que pode ter acontecido é uma infelicidade na escrita da frase.
=p
Classe abstrata sem métodos ou classe abstrata sem métodos abstratos?
Sem métodos porque pode ser que você, mais tarde, tenha que colocar alguma coisa aí. Por exemplo, se alguma coisa no mundo real mudar e todas as subclasses tiverem que ser mudadas pode ser que você tenha muito trabalho. Em vez de ir uma por uma, você faz em 1 só e todas vão adotar o comportamento.
Sem métodos abstratos porque você quer se cuidar. Vai que depois de um tempo todas aquelas subclasses comecem a fazer algo diferente uma das outras. Com a classe abstrata você terá que mudar o método para abstrato e será obrigado a implementar em todas as subclasses.
É como neste caso. Você não vai usar classe abstrata para obrigar subclasses a herdarem metodos abstratos! Você vai usar classe abstrata, pois no seu contexto ela é uma abstração que deve ser estentida/especializada. Em tese, toda classe que não faz sentido existir que não seja para ser especializada, deve ser abstrata, tendo ou não metodos abstratos.