Static class

5 respostas
andrepestana

Pessoal…

Surgiu uma dúvida quanto a static classes. Pq o resultado desse código abaixo é ‘A b’?

public class staticClassTest {

	static class Test{
		String a = "A ";
		public void go(){
			System.out.print("a");
		}
	}
	static class Test2 extends Test{
		String a = "B ";
		public void go(){
			System.out.print("b");
		}
	}

	public static void main(String[] args) {

		Test test = new Test2();
		System.out.print(test.a);
		test.go();
	}

}

5 Respostas

peczenyj

e se fosse assim?

class Test{
                String a = "A ";
                public void go(){
                        System.out.print("a" + a);
                }
        }
        class Test2 extends Test{
                String a = "B ";
                public void go(){
                        System.out.print("b" + a);
                }
        }

public class nonStaticClassTest {
        public static void main(String[] args) {
                Test test = new Test2();
                System.out.print(test.a);
                test.go();
        }
}

Isso tem haver com a forma como vc acessa o atributo a do objeto test.

Declaraste test como sendo da classe Test, logo se vc acessar o atributo 'a', vais acessar o atributo definido na classe Test.

Faça o seguinte teste

System.out.print(((Test2)test).a);

Terás uma surpresa. Agora usar estas letras dificulta o aprendizado: coloque algo legivel no lugar de 'a' ;-)

andrepestana

Valeu, peczenyj!

Essa prova tá me deixando louco… Na verdade não tem nada a ver com static. Fiz um exemplo melhor que esclareceu minhas dúvidas:

public class MemberTest {

	public static void main(String[] args) {
		Father f1 = new Son1();
		Father f2 = new Son2();

		System.out.println(f1.member);
		System.out.println(f1.getMember());

		System.out.println(f2.member);
		System.out.println(f2.getMember());
	}

}
class Father{
	String member = "father";

	public String getMember(){
		return member;
	}

}
class Son1 extends Father{
	String member = "son1";
	public String getMember(){
		return member;
	}
}
class Son2 extends Father{
	String member = "son2";
	// não implementa getMember!
}

Abraço,

sergiotaborda

andrepestana:
Pessoal…

Surgiu uma dúvida quanto a static classes. Pq o resultado desse código abaixo é ‘A b’?

Na verdade nada têm a haver com static class e sim com o conceito de escopo.
Isso é comum em prova de certificação. O codigo é complicados com detahes superfulos só para desviar a atenção do que realmente importa.

jaboot

André,

Esse assunto é meio complexo mesmo… o pessoal estava conversando sobre isso, neste fórum de certificação esses dias:

http://www.guj.com.br/posts/list/99772.java

Muito bons os posts

andrepestana

Obrigado, balarini!

Eu já até tinha visto o post mas obrigado pela atenção. O problema é que quando vc faz muitos simulados com pegadinhas vc chega num estado que não sabe mais o que é certo e o que é errado.

Quanto aos métodos eu lembrava que o polimorfismo iria chamar o método da classe filha, mas não lembrava mais o comportamento da chamada do membro subscrito pela referência do pai. Já tava pensando que iria chamar o membro subscrito do filho… loucura!

Apesar desta dúvida besta estou tirando entre 70% e 80% nos simulados TestKiller e oficial da Sun. Espero ir bem na prova.

Abraço,

Criado 14 de agosto de 2008
Ultima resposta 14 de ago. de 2008
Respostas 5
Participantes 4