Dziedziczenie, dostęp do właściwości obiektu

0

Witam wszystkich!
Programuję w Javie od niedawna, stąd może moje pytanie będzie dla niektórych naiwne, ale chciałbym zrozumieć dlaczego pewne rzeczy działają tak jak działają. Otóż mamy następujący kod:

public class A {
    protected String name = "klasa A";
    public String getName(){
        return name;
    }
}

public class B extends A {
    protected String name = "klasa B";
}

A a = new A();
System.out.println(a.getName()); //zwraca "klasa A"

B b = new B();
System.out.println(b.getName()); //również zwraca "klasa A" - dlaczego?

No i właśnie chciałbym zrozumieć dlaczego to drugie wywołanie (b.getName()) zwraca "klasa A"? Dla mnie logiczne by było gdybym dostawał "klasa B" - w końcu właściwość name jest nadpisana w rozszerzającej klasie B.
Czy ktoś mógłby mi to wytłumaczyć?

Pozdrawiam

0

Ponieważ nie przesłoniłeś metody getName(). B nie ma metody getName(), zatem jest wywoływana metoda z nadklasy. Metoda z nadklasy korzysta z "najbliższej definicji pola", czyli tej w nadklasie.

0

Porównaj następujące przypadki:

public class B extends A {
	protected String name;
	
	B(){
		name = "klasa B";
	}
}

b.getName() da "klasa A"

public class B extends A {
	protected String name;
	
	B(){
		super.name = "klasa B";
	}
}

b.getName() da "klasa B"

public class B extends A {
	B(){
		name = "klasa B";
	}
}

b.getName() da "klasa B"

public class B extends A {
	protected String name;
	
	B(){
		name = "klasa B";
	}

       public String getName(){
                return name;
       }
}

b.getName() da "klasa B"

Przy okazji mała zagadka.
Co się wypisze?

class A {
	protected static String name = "klasa A";
}

public class B extends A {
	public static void main(String[] args) {
		B.name = "klasa B";
		System.out.println(A.name);
	}
}
0

Dzięki za odpowiedzi. Punkty 3. i 4., odpowiedzi Krzyśka, bardzo mi to rozjaśniły.

A zagadka jest interesująca i pouczająca...

miłego dnia

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