Construtor em classe abstrata

Pessoal, estou com uma dúvida na pág. 201 (como sempre, do livro da Kathy e Bert - pois ele também é autor), onde está escrito que toda classe abstrata tem que ter um construtor, mas as classes abstratas nem podem ser instanciadas…
Alguém poderia me explicar isso?

Kra… as classes abstratas não precisam ter construtores, mas elas podem ter. Realmente não vai ser possível instanciar as classes abstratar, mas as classes que herdarem essa primeira terão que chamar algum dos contrutores da classe abstrata. Esse construtor pode inicializar as variáveis da classes ou executar algumas operações, exemplo:

abstract class ClasseAbs {
    private String s;

    protected ClasseAbs(String s) {
        this.s = s;
        metodoAbstrato();
    }

    protected String getS() {
        return s;
    }

    protected abstract void metodoAbstrato();
}

class Implementacao extends ClasseAbs {
    public Implementacao() {
        super("Testando"); // Chamada ao construtor da classe abstrata
    }

    protected void metodoAbstrato() {
        System.out.println("O parametro passado ao construtor foi: " + getS());
    }

    public static void main(String[] args) {
        new Implementacao();
    }
}

Espero que você tenha entendido…
Flw…

Lembre-se que TODA CLASSE TEM CONSTRUTOR. Se você não declara, ele cria o construtor sem parâmetros, que chama super, também sem parâmetros.

Mais um lembrete.
Quando uma classe é herdada automaticamente seu Construtor é chamado no construtor da classe filha mesmo que não descrito explicitamente. E ainda se descrito explicitamente deverá ser a primeira coisa a aparecer dentro do método construtor da classe filha!

:wink:

Cya!

Pois é.

A primeira linha de cada construtor é SEMPRE uma chamada a super ou this.

Se isso não for explícito, super() -> sem argumentos.

Qualquer chamada a super() ou this() que não seja na primeira linha do construtor gera erro de compilação, ou seja, a primeira linha é uma chamada a super OU (^) this.

Acho que fiquei meio redundante, mas é pra frisar bem :wink:

Só não entendi essa parte: quando eu chamo o “metodoAbstrato()” é executado o “metodoAbstrato()” da minha subclasse concreta e não da superclasse abstrata.

Como que essa parte funciona?[/quote]

Depende de como foi chamado…
Só você postando o exemplo inteiro pra poder entender direito.

abstract class ClasseAbs { 
    private String s; 

    protected ClasseAbs(String s) { 
        this.s = s; 
        metodoAbstrato(); 
    } 

    protected String getS() { 
        return s; 
    } 

    protected abstract void metodoAbstrato(); 
} 

class Implementacao extends ClasseAbs { 
    public Implementacao() { 
        super("Testando"); // Chamada ao construtor da classe abstrata 
    } 

    protected void metodoAbstrato() { 
        System.out.println("O parametro passado ao construtor foi: " + getS()); 
    } 

    public static void main(String[] args) { 
        new Implementacao(); 
    } 
} 

Só não entendi a parte lá de cima

 protected ClasseAbs(String s) { 
        this.s = s; 
        metodoAbstrato(); 
    } 

: quando eu chamo o “metodoAbstrato()” é executado o “metodoAbstrato()” da minha subclasse concreta e não da superclasse abstrata.

Como que essa parte funciona?

[size=“11”][color=“red”]* Editado: Lembre-se de utilizar BBCode em seus códigos[/color][/size] :joia:

Quando vc chama o “metodoAbstrato()” é executado o metodo da classe filha, já que ele foi sobrescrito nela.

Isso também aconteceria se o método não fosse abstrato. O fato dele ser abstrato faz com que vc tenha que sobrescrevê-lo, logo se vc chamá-lo será executado o método da classe filha.

Só isso que não entendi, porque se eu chamasse um método(não abstrato) na sua própria classe(não abstrata), seria executado o método da própria classe e não o método da classe filha…