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

Exercício 4 - acessar super da classe mãe

Pessoal,

Não consegui entender porque nos exercícios 3 e 4 o código não compila. A classe A é filha de B, logo, entendo que eu poderia sim acessar uma variável da classe mãe. É por que estou no println ou método estático (no caso o próprio método main)? Ou é porque a variável é default?

Obrigado pela atenção.

4 respostas

Rodrigo, blz ?

Como eu não me matriculei nesse curso não tenho acesso aos exercícios. Você poderia postar o código mencionado para eu tentar lhe ajudar?

Até mais amigo.

solução!

Porque é método static. Você não pode chamar atributos ou métodos não-static diretamente usando super ou this para dentro de métodos static.

Pessoal, obrigado pelo apoio. Rodolfo, apenas pra satisfazer a curiosidade, o código do exercício:

class B {
    int x = 1;
}
class A extends B {
    static int x = 2;
    public static void main(String[] args) {
        System.out.println(new A().super.x);
    }
}

Tive a mesma dúvida que você Rodrigo, mas pelo que eu entendi a chamada super e this só serve para se chamar a si próprio ou seja, super.x de mim mesmo é 1. Já new A().super.x é um novo objeto, chamar new A().super.x. Seria algo como chamar super.x de si próprio, mas em outro objeto.

Sendo assim este tipo de chamada no Java nunca é permitida.

Alguém sabe me dizer se estou certo na minha compreensão?

E quanto a chamada de atributos ou métodos não-static diretamente usando super ou this para dentro de métodos static eu testei da seguinte forma:

class B { int x = 1; } class A extends B { static int x = 2; public static void main(String[] args) {

new A().doIt();

}

public void doIt() {

System.out.println(new A().super.x);

}

}

E também não funcionou. Não precisaria de new A() já que super.x é super de A.

Porém acessando desta forma:

public void doIt() {

System.out.println(super.x);

}

Funciona normalmente...

E quando o método é static realmente não funciona acessar como foi feito acima por que a variável membro em B não é static, porém se acessá-la como está no exercício mesmo que a variável seja static não compila como testei no código abaixo:

class B { static int x = 1; } class A extends B { static int x = 2; public static void main(String[] args) {

new A().doIt();

System.out.println("Acesso de main: " + new A().super.x);

}

public void doIt() {

System.out.println(super.x);

}

}

Me levando a entender que nunca é permitido acessar super ou this desta forma new A().this ou new A().super.