Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 1 da Aula 4 - Diferença entre o construtor padrão e construtores definidos pelo usuário

Olá pessoal.

class A {
    final String n;
    A() {
        a();
        n = "aprendendo";
    }
    void a() {
        System.out.println("testa");
    }
}
class B extends A {
    void a() {
        System.out.println(n.length());
    }
    public static void main(String[] args) {
        new B();
    }
}

Neste exemplo, o erro acontece pois ao inicializar B e tentar acessar n em seu construtor acontece um NullPointer, pois a variável não existe. A partir daí entende-se que herança não herda as variáveis membro da classe herdada, somente o construtor.

Minha dúvida é, em herança, o que é herdado?

2 respostas
solução!

O problema no seu código é: 1º problema:

Quando se estende uma classe de outra classe e tem um método de mesmo nome e retorno o método ele no caso o void a() ele é sobreposto.

Então quando você faz isso e chama o a() antes de atribuir o valor de n, logo seria +/- isso

    public static void main(String[] args) {
            new B();
    }
    //new B(); vai chmar os métodos
        System.out.println(n.length()); // método void a(){} sobreposto 
        n = "aprendendo"; //seguido da atribuição.

logo não irá funcionar o código já que n não tem valor.

Você pode modificar o nome do método void a da classe A ou classe B, assim fará com que o método possa ser executado corretamente.

Uma alternativa é colocar a chamada a() logo abaixo do n = "aprendendo" ficando:

class A {
    final String n;

    A() {
        n = "aprendendo";
        a();
    }

    void a() {
        System.out.println("testa");
    }
}
class B extends A {
    void a() {
        System.out.println(n.length());
    }
    public static void main(String[] args) {
        new B();
    }
}

resultado:

10

Ai sim você verá o método ser sobreposto.

Ou então mudar o nome do método no caso de B ficando:

class A {
    final String n;

    A() {
        a();
        n = "aprendendo";
    }

    void a() {
        System.out.println("testa");
    }
}
class B extends A {
    void c(){
        System.out.println(n.length());
    }

    public static void main(String[] args) {
        new B().c();

    }
}

Resultado

testa
10

Ah! quando fica chamando no primeiro caso o :

System.out.println(n.length());

ele dará NullPointer devido que o atributo n não ter recebido nenhum valor, logo gera uma exceção, já que null.legth() não existe valor.