Mais uma

Qual a saída e a explicação?

[code]
package br.com.Gernerics;

public class Base {

int x = 2;

int method(){
	return x;
}

}[/code]

[code]

package br.com.Gernerics;

public class SubClass extends Base{

int x = 3;

int method(){
	return x;
}

}[/code]


public class TestBaseSub {
	
	
	public static void main(String[] args) {
	
		Base b = new SubClass();
		System.out.println(b.x);
		System.out.println(b.method());
	}
			
}
            // A - Nothing. The code fails to compile because the object b is not created in a valid way.
// B -  2 and 3
// C -  2 and 2
// D -  3 and 3
// E -  3 and 2

eu acho que é a Letra D

Supondo que a classe TestSub está no mesmo pacote, seria a letra B.

O x que será visto é o da classe Base, já que não existe sobrecarga de atributos, só de métodos.
No caso dos atributos, existe shadowing, isto é, existem na verdade 2 variáveis x, uma chamada Base.x e outra SubClass.x e como a variável b é do tipo Base, é o x de cima que será visto.

Entretanto, métodos sofrem polimorfismo. E o método invocado será, portanto, da subclasse, que vê o x do seu escopo mais interno, ou seja o de SubClass.

Se a classe TestSub não estiver no mesmo pacote, teremos um problema de restrição de escopo, o método e o atributo são package private. Isso daria uma exceção, que não está entre as respostas.

Letra B, Resposta do Vinny está perfeitaaaaaaaaaaa… show de bola!

Vini, sempre acompanho esses posts de certificação Java. Gostaria de agradecer por suas respostas e explicações. Ajudam muito!!

Muito Obrigado!

Att,

Renan

Letra B

Ah uma sombreamento de variaveis que pode confudir.

b.x -> Chama a variavel da Classe (Base): Imprimindo: 2

Base b = new SubClass(); Quando se faiz esse tipo de chamada o método a ser chamado vai ser o método subscrito
no caso o método da SubClasse. Imprimindo 3

essa eu acertei, to lendo o livro da Kathy… :lol: