Questao

esse codigo compila? qual o resultado?

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

eu concordo, acho que imprimirá 2.

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…