dziedzicezenie i nadpisywanie atrybutow

0

Cześć.

package pkg1;

public class Cl1 {
    protected int x = 123456;
}
package pkg2;

import pkg1.Cl1;

public class Cl2 extends Cl1 {
    public void m() {
	System.out.println(x);
    }
}
package pkg3;

import pkg2.Cl2;

public class Cl3 extends Cl2 {
    public int x = 3456789;
    
    public void m2() {
	System.out.println(x);
    }
    
    public static void main(String args[]) {
	Cl3 c = new Cl3();
	c.m();
	c.m2();
    }
}

java pkg3.Cl3

123456
3456789

Jak to "naukowe" a nie "improwizowane" wytłumaczenie tego, że najpierw jest wypisywane "123456"?
Chodzi o to, że na poziomie kompilacji Cl2 nie znamy jeszcze czegoś takiego jak Cl3?
Dzięki za pomoc.

0

Zmienne się nie override'ują, metody tak. Dlatego Cl2 zawsze wypisze zmienną X będącą najwyżej w hierarchii.

0

@up, chyba prawisz głupoty. Po zmianie definicji klasy Cl2

public class Cl2 extends Cl1 
{
    protected int x=55;
    public void m() {
        System.out.println(x);
    }
}

program wypisze

55
3456789
0

Tak dziala dziedziczenie (oraz polimorfizm) w Java. JVM w sposob dynamiczny "wybiera", ktora z przedefiniowanych (overrided) metod ma byc wywolana, na podstawie rzeczywistego typu obiektu, wskazywanego przez dana referencje.
W przypadku atrybutow lub metod statycznych, decyzja zapada w czasie kompilacji programu i zalezy od typu danej referencji a nie typu obiektu wskazywanego przez te referencje.

Przyklad:
dwa mieszkania, M1 i Apartament (oba mieszkania klasy Mieszkanie). W obu jest telewizor. W M1 jest 21" Rubin, w Apartament 48" LED. W obu domach mozna obejrzec film, ale w M1 nie zrobisz tego na 48" plaszczce.

0
bogdans_niezalogowany napisał(a)

@up, chyba prawisz głupoty. Po zmianie definicji klasy Cl2

public class Cl2 extends Cl1 
{
    protected int x=55;
    public void m() {
        System.out.println(x);
    }
}

program wypisze

55
3456789

No, teraz najwyżej w hierarchii jest zmienna 'x' z klasy Cl2, wiec ona zostanie wypisana. Autorowi chodzi o to, czemu wywolujac new Cl3().m() nie zostanie wypisana wartosc x z klasy Cl3 tylko z klasy Cl1

0

@LukasStrz, nie rozumiem Twoiej hierarchii:
Cl2 extends Cl1
Cl3 extends Cl2.
x z klasy Cl2 jest wyżej w hierarchii niż x z klasy Cl1
x z klasy Cl3 jest niżej w hierarchii niż x z klasy Cl1
Wtf?

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