questão difícil e chata

a - não compila
b - compila e lança runtime exception
c - roda e imprime Teste02, Base, Sub, MetodoSub, nada
d - roda e imprime Base, Sub, MetodoBase, nada
e - roda e imprime Teste02, Sub, Base, MetodoBase
f - roda e imprime Teste02, Base, Sub, MetodoBase
g - roda e imprime Teste02, Base, Sub, MetodoBase, nada
h - roda e imprime Teste02, Base, Sub, MetodoSub

class Base {
	public Base() {
		System.out.println("Base");
	}
}

class Sub extends Base {
	public Sub() {
		System.out.println("Sub");
	}
}

public class Teste02 {
	boolean b;
	final int i = 10;

	public Teste02 () {
		super();
		System.out.println("Teste02");
	}

	public void metodo(Base b) {
		System.out.println ("MetodoBase");
	}
	public void metodo(Sub s) {
		System.out.println ("MetodoSub");
	}

	public boolean getB() {
		return b;
	}
	public int getI() {
		return i;
	}
	static public void main (String [] args) {
		Teste02 t = new Teste02();
		Base b = new Sub();
		if (t.getB());
		switch (t.getI()) {
			case 10:
				t.metodo(b);
			default:
				System.out.println ("nada");
		}
	}
}

a correta é a “g”

interessante o método dentro de um switch, nunca tinha visto :slight_smile:

G

Primeiro: Ao se instanciar o Teste02 ele chama seu construtor e imprime

Segundo: Ao se instanciar sub ele chama o seu construtor. Mas Sub estende Base, então o construtor de superclasse é chamado imprime sub depois volta o controle para Base e imprime.

Terceiro: O valor boolean retorna false pois todos os valores que não foram explicitamente inicializados são configurados como 0 ou seus respectivos valores ( null para referências, false boolean e 0 numéricos.) MAS o if não está condicionando o switch logo ele retorna false e no final tem um ;.

Quarto: O método retorna um valor do tipo inteiro (10) e a primeira condição é de valor 10 entao o método com referência B (MétodoBase) é impresso e como não tem um break no switch ele continua com o caso default e imprime “nada”.

oops… esqueci… se tiver alguma coisa errada, me desculpe e faça a devida correção :oops:

por gentileza :lol: hehe

Acredito que seja a opção g tambem. :slight_smile:

[]'s

[quote=“JBoy__”]G

Primeiro: Ao se instanciar o Teste02 ele chama seu construtor e imprime

Segundo: Ao se instanciar sub ele chama o seu construtor. Mas Sub estende Base, então o construtor de superclasse é chamado imprime sub depois volta o controle para Base e imprime.

Terceiro: O valor boolean retorna false pois todos os valores que não foram explicitamente inicializados são configurados como 0 ou seus respectivos valores ( null para referências, false boolean e 0 numéricos.) MAS o if não está condicionando o switch logo ele retorna false e no final tem um ;.

Quarto: O método retorna um valor do tipo inteiro (10) e a primeira condição é de valor 10 entao o método com referência B (MétodoBase) é impresso e como não tem um break no switch ele continua com o caso default e imprime “nada”.[/quote]

perfeito! todos acertaram

Acho que a maior “pegadinha” aqui é o fato de MetodoBase ser executado e não MetodoSub, já que em runtime o tipo do objeto passado para o método é Sub. Mas no caso de métodos overloaded o tipo da referência é usado para decidir qual método será chamado (em tempo de compilação), ao contrário de métodos overriden onde o tipo do objeto em runtime é usado para verificar qual método será chamado.

[quote=“marciolx”]

perfeito! todos acertaram

Acho que a maior “pegadinha” aqui é o fato de MetodoBase ser executado e não MetodoSub, já que em runtime o tipo do objeto passado para o método é Sub. Mas no caso de métodos overloaded o <b>tipo da referência</b> é usado para decidir qual método será chamado (em tempo de compilação), ao contrário de métodos overriden onde o <b>tipo do objeto em runtime</b> é usado para verificar qual método será chamado.[/quote]

Valew, era essa dica q eu precisava. :smiley: