Dlaczego nie występuje przysłanianie?

0
public class wtf
{
  public static void main (String[] args)
  {
    Podklasa Obiekt = new Podklasa();
    System.out.println(Obiekt.geti());
  }
}

class Nadklasa
{
  protected int i = 2;
  int geti()
  {
    return this.i;
  }
}


class Podklasa extends Nadklasa
{
  protected int i = 5;
}

Wypluwa 2 a nie 5, dlaczego? PRzecież jeśli się nie mylę, to atrybut i zdefiniowany w Podklasie powinien przysłonić ten z Nadklasy?

0

Przesłanianie dotyczy tylko metod, a nie pól. Możesz w konstruktorze Podklasa ustawić wartość pola i na 5 (ponieważ jest ono protected)

0

Wszystkie pola w obiektach javowych są niewirtualne, w sensie dostęp do nich jest statycznie rozwiązywany. Wirtualne wywołania dotyczą tylko i wyłącznie metod instancji.

Inaczej mówiąc - obiekty Javowe zachowują się podobnie do obiektów w C++ tylko mają domyślnie virtuala przy metodach.

Przesłanianie to co innego niż nadpisywanie i wywołania wirtualne - przesłanianie dotyczy widoczności zmiennych w danym zakresie kodu, natomiast nadpisywanie metod połączone z wywołaniami wirtualnymi zmienia zachowanie obiektów z każdego miejsca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1