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
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.
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