método static

eu fiz uma bagunça aqui, mas da para passar a idéia :wink:

o que imprime?

public class C
{
	public static void main(String[] args)
	{
		A.a();
		B.a();
		
		A a = new A();
		B b = new B();
		A c = new B();
		a.a();
		b.a();
		c.a();
	}
}

class A
{
	static void a(){System.out.println("a");}
}
class B extends A
{
	static void a(){System.out.println("b");}
}

quanto mais “bagunçado” melhor :wink:

A.a();// a //chamada direta

B.a();//b //chamada direta

a.a();//a //tipo a,instancia a

b.a(); //b //tipo b,instancia b

c.a(); //a //tipo a,método da superclasse é chamado primeiro

Tô certo?

imprime:

a b a b a…

a
b
a
b
a

Bom, mas isso só ocorre pq é static né?!?!?
Pq com instâncias da classe ele chama o método de B no final.

exato, métodos static pertencem a classe e não a instância.

Esse é o tipo de coisa que se esquece depois que se faz a prova de certificação.

Hoje, no Sun Tech Days, teve o Programming Puzzle em Java, as famosas pegadinhas da linguagem.

Só acertei uma, de 8 mostradas.

What a shame!

Realmente a certificação muitas vezes só serve para dizer q vc conhece a linguagem…tem coisas incríveis…

Uma simples e fácil(só para reforçar):

public class Java{ static { System.exit(1); } }

Compila?Não Compila?Reclamará a ausência do método main()?Diga o PORQUE da resposta.

pra mim esse codigo compila…
e reclamara a ausencia do metodo main se vc tentar executar a classe , pois o compilador procura a assinatura do main quando é executado…

Compila e roda :slight_smile:

O compilador nao procura nenhum metodo main na sua classe - quem faz isso eh a jvm, leo… mas o que acontece eh que antes de procurar um metodo main, a vm precisa carregar a classe: tcharam! quando ela carrega a classe, o metodo estatico eh executado, e a vm eh convenientemente informada de que ela tem que morrer antes mesmo de levantar da cama :smiley:

Exato,cv o bloco estático é executado primeiro pelo carregador de classe,e antes q ele possa chegar a presença do método Main a chamada
a System.exit termina a execução de forma abrupta…Qdo alguém quiser
ver direito o q ocorre troque esse System.exit por System.out.println… aí,reclamará a ausência do main()… :wink: