2016-05-15 7 views
-1

Also habe ich den folgenden Code haben:Aufruf Super Methode aus einer Unterklasse Instanz

class Super { 
    private String name="super"; 
    public String name(){ 
     return this.name; 
    } 
} 
class Sub extends Super { 
    private String name = "sub"; 
} 
public class Main { 
    public static void main(String[] args) { 
     System.out.println(new Sub().name()); 
    } 
} 

, was ich bekommen ist als Ergebnis ist: super. Ich wusste nicht warum?! Ist nicht die Methode name() soll this des Objekts aufrufen, das von aufgerufen wurde und seit Sub erweitert Super dann sollte es in der Lage sein, es auf seine Mitglieder zu verwenden?!

+0

Eine einfache Regel zu erinnern: ** Felder sind nicht polymorph **, nur Methoden sind (es sei denn, sie sind privat, endgültig oder statisch). – Pshemo

Antwort

1

Sie denken vermutlich, dass das name Mitglied Feld in Sub in Superzwingenden die name Mitglied Feld sein sollte. Das tut es nicht: Felder können in Java nicht überschrieben werden. Darüber hinaus haben Sie beide Felder als private definiert, was bedeutet, dass Mitglied nur für andere Mitglieder dieser Klasse sichtbar ist (und nicht Mitglieder abgeleiteter Klassen oder anderer Klassen). In Ihrem Code hat Super seine eigene private Definition des name Felds und Sub hat seine eigene völlig andere private Definition. Keiner ist sich der Existenz des anderen bewusst.

Standard in Java ist die Verwendung Getter und Setter für den Zugriff auf interne Daten. Bei Bedarf können Sie diese in abgeleiteten Klassen überschreiben.

+2

Es gibt kein virtuelles Schlüsselwort in Java. – SamTebbs33

+0

@ SamTebbs33 Sorry, Gehirn Furz. Ich benutze täglich Java, C++, C# und ein paar andere Sprachen und es ist manchmal schwierig, sie aufrecht zu erhalten! ;) – TypeIA

+0

Ich erwartete das war das Problem! :) – SamTebbs33