class X{
public X(int n){
x = n;
}
private int x;
public int getX(){
return x;
}
}
class Y extends X{
public Y(int n){
super(n * 2);
x = n;
}
private int x;
}
class Z{
public static void main(String args[]){
System.out.println(new Y(1).getX());
}
}
Acho que compila e imprime 2, e não 1. Isso porque variáveis não são sobrescritas (overwrite), então ao declarar novamente uma variável de instância x na classe Y, essa não toma o lugar da variável x da classe X. Dessa forma, uma atribuição para a variável x da classe Y não afeta o valor retornado por getX().
exatamente, se uma subclasse sobreescreve uma variavel de uma superclasse (no exemplo as variaveis eram private, mas o mesmo acontece com qquer encapsulamento), eh como se as duas variaveis tivessem nomes distintos…