Tenho algumas dúvidas sobre classes abstratas, já estudei sobre o assunto, mas não custumo usar classes
abstratas prefiro usar interfaces, minhas dúvidas são as seguintes:
Uma classe abstrata sempre será uma superclasse ?
Penso assim porque uma classe abstrata tem métodos a serem implementados.
Toda classe abstrata deve ter métodos a serem implementados ?
Se uma classe abstrata não tiver métodos para serem implementados haverá algum problema ?
Se uma classe abstrata não tiver métodos a serem implementados ela pode deixar de ser uma superclasse ?
Penso assim porque se uma classe não tiver métodos a serem implementados, não tem sentido ela ser
obrigatóriamente uma superclasse.
sim. Ja que mais cedo ou mais tarde ela tera uma filha.
2)Não. uma classe abstract pode ter metodos com o modificador abstract ou nao.
Se vc declara uma classe com abstract é por que ela tera alguns metodos que vc vai deixar a responsabilidade para a primeira classe concreta implementar. Não tem sentido vc declarar uma classe abstract e nao definir nenhum metodo abstract. Não vejo funcionalidade nesse caso. Apensar que como falei no item 2. tanto faz ter metodos abstract ou nao, em uma class abstract.
Uma classe abstrata sempre será uma superclasse ?
Nem sempre, ela tambem podera ser uma subclasse e a primeira classe concreta (nao abstrata) tera que implementar todos os metodos de ambas (superclasse e subclasse abstratas).
Toda classe abstrata deve ter métodos a serem implementados ?
Não. ela mesma podera implementar seus proprios metodos.
Se uma classe abstrata não tiver métodos a serem implementados ela pode deixar de ser uma superclasse ?
Uma classe abstrata nao pode ser instanciada, assim vc precisa que alguem herde dela.
O inverso eh verdade. se uma classe tiver um unico metodo abstrato, obrigatoriamente ele deve ser declarada como abstrata. do contrario vc tera um erro de compilacao.
Uma classe abstrata sempre será uma superclasse ?
Penso assim porque uma classe abstrata tem métodos a serem implementados.
Sim, ela sempre será super classe.
Toda classe abstrata deve ter métodos a serem implementados ?
Se uma classe abstrata não tiver métodos para serem implementados haverá algum problema ?
Não, sua classe abstrata não tem a nescessidade de ter metodos a serem implementados(abstratos).
não ha nem um problema em não tem nem um metodo abstrato.
Essa é a diferença de Interface e Classe Abstrata.
Na interface vc não pode implementar, todos são abstratos. Vc nem precisa declaralos como abstratos.
ja na classe abstrata, vc pode ter metodos abstratos ou implementados. aki vc prescisa declarar a abstração.
Se uma classe abstrata não tiver métodos a serem implementados ela pode deixar de ser uma superclasse ?
Penso assim porque se uma classe não tiver métodos a serem implementados, não tem sentido ela ser
obrigatóriamente uma superclasse.
Se ela estiver declarada como abstrata não, ela sempre será super classe. Mas se não tiver metodos abstratos vc pode deixa-la como classe comum.
[quote]
Classes abstratas:
Classes que são demasiadamente gerais para criar objetos reais.
Utilizadas somente como superclasses abstratas para subclasses concretas e para declarar variáveis de referência.
Muitas hierarquias de herança têm superclasses abstratas que ocupam os poucos níveis superiores.
Palavra-chave abstract:
Utilize para declarar uma classe abstract.
Também utilize para declarar um método abstract:
As classes abstratas normalmente contêm um ou mais métodos abstratos.
Todas as subclasses concretas devem sobrescrever todos os métodos abstratos herdados.[/quote]
Fonte: Slides do livro Java como programar da Deitel e Deitel (sei lá se é assim que escreve)
Olá pessoal.
Lendo os posts, me surgiu uma dúvida.
Para acessar um método não-abstract de uma classe abstract, eu necessariamente precisaria estender esta classe abstract?
Essa dúvida sugiu em relação ao código que o Gilberto colocou.
1. //Classe abstrata Gilberto
2. public abstract class Gilberto
3. {
4. public static void exibeMensagem()
5. {
6. System.out.println("Hello World abstract ^^");
7. }
8. }
1. //Classe que utiliza a classe abstrata Gilberto
2. public class TestaAbstrata
3. {
4. public static void main(String args[])
5. {
6. Gilberto.exibeMensagem();
7. }
8. }
Neste caso, ele apenas acessou o método não abstract da classe abstract, isso tá correto?
Valeu.
Provavelmente. Se ela só tiver métodos estáticos, não precisaria. Mas isso é uma gambi, e das grossas.
Não obrigatoriamente, como o LPJava te disse. Só para deixar um exemplo, a classe KeyAdapter tem todos os métodos implementados e é abstrata. A diferença é que não você não pode instanciar diretamente um KeyAdapter, só um filho dele.
[quote=Puppets]3) Se uma classe abstrata não tiver métodos a serem implementados ela pode deixar de ser uma superclasse ?
Penso assim porque se uma classe não tiver métodos a serem implementados, não tem sentido ela ser
obrigatóriamente uma superclasse.
[/quote]
Veja novamente o caso do KeyAdapter. Ele simplesmente tem todas as implementações do KeyListener em branco. Faria sentido existir um KeyAdapter não abstrato? Seria um objeto que poderia ser registrado como listener, mas não faria nada. Meio estúpido não? Portanto, no caso do nosso amigo KeyAdapter, não faz sentido ele deixar de ser abstrato, mesmo tendo todos os métodos implementados.
Outro exemplo. Você pode ter uma classe Abstrata com vários métodos protected implementados e nenhum método público. Faria sentido ela deixar de ser abstract? Acho que não.
[quote=rmalati]Para acessar um método não-abstract de uma classe abstract, eu necessariamente precisaria estender esta classe abstract?
Essa dúvida sugiu em relação ao código que o Gilberto colocou. [/quote]
No caso de um método estático, tanto faz. No caso de um método não estático, sim, só através de um filho da classe abstract vc poderá criar um objeto e acessar o método.