Classe Abstrata sem métodos abstratos

Pessoal, vou direto ao problema:

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]

Cara, fui ver pra crer e realmente funciona… Vou pesquisar sobre e depois volto nesse tópico…

Falows :wink:

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.

Bom, espero não ter falado besteira
=)

1 curtida

Verdade nessa_uepa… pior que foi confusão mesmo…

O inverso é que é proibido, vc não pode ter uma classe não-abstrata se ela possuir um método abstrato…

Tópico resolvido… pode fechar…

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

Obrigado de novo

foi como o nessa escreveu…

[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…

Falows

Bom, deixa eu pesquisar num livro aqui
=p

É, realmente,

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

E o nome do cara é Ivon Horton
=p

justamente nessa_uepa! o Deitel fala em “normalmente um ou mais métodos abstratos” …
Ta aí uma pegadinha pra certificação SCJP ^^

Hum, no Deitel fala exatamente assim “Normalmente” ?

Se for então tá explicado tudo.

=p

E é uma mancada do tio Horton
=p
tio Horton safado
=p

ahueuhaeuhauh exatamente. Mas o Deitel em momento algum explicita essa questão. Fica, como se pode dizer, nas entrelinhas, hehehe x)

Obrigado a todos que ajudaram

Vale lembrar também, que uma classe abstrata não pode ser instanciada, mais ela tem construtor

Mas e ai?
Para que vou criar uma classe abstrata que não possua nenhum método?

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.

Existem até interfaces que não declaram métodos, como a Serializable. Ela é usada apenas para definir que o objeto poderá ser serializável…

É 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.