2009-08-28 4 views
12

Ich habe zwei Fragen zu diesem CodeVerwirrend „eine private Methode außer Kraft setzen“

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1) Wie ist Funktion f ist auf der Referenz von Aufschalten po sichtbar;

2) Warum wird ausgegeben "private f()"

+0

Aber wie eine Referenz mit einem Objekt der Unterklasse eine private Methode einer Superklasse aufrufen kann ??? Ist das ein Fehler ??? –

+0

Nein, das ist kein Fehler, das ist genau so, wie es funktionieren sollte. – Jesper

+0

aber ist dies nicht gegen die Regeln der Vererbung und späte Bindung –

Antwort

24
  1. Die main Methode innerhalb der Klasse ist Override, so natürlich es die privaten Mitglieder der Klasse Override sehen können.

  2. Sie sind nicht zwingende Methode f in Klasse Derived, gibt es keinen Polymorphismus. Der Typ der Variablen po ist Override, daher wird die Methode f aus der Klasse Override übernommen.

Beachten Sie, dass Methode f in Klasse Override gar Derived in der Klasse nicht sichtbar ist. Die Methode f in der Klasse Derived ist eine andere Methode, die nichts mit der Methode f in der Oberklasse zu tun hat.

+0

Aber wenn die Bindung zur Laufzeit dann po wird Objekt der abgeleiteten Klasse haben, so wie es in der Lage ist, eine private Methode der Super-Klasse aufrufen. –

+3

Nirgendwo in Ihrem Code gibt es einen Aufruf an eine private Methode einer Superklasse. Wenn Sie po.f() aufrufen, wird f von Override aufgerufen, weil der Kompilierungszeittyp von po Override ist. Da es kein Überschreiben gibt, gibt es keine dynamische Bindung (kein Polymorphismus) - Java betrachtet den Typ zur Laufzeit nicht. – Jesper

2
Override po = new Derived(); 
po.f(); 

Sie sind außer Kraft setzt eigene Methode zugreifen, selbst wenn das Objekt abgeleitet wird, da gemäß Bereichsregeln werden die privaten Mitglieder der Klasse als erstes, und als in Rahmen der Überschreibung geschrieben es die privaten f verweist, und Da seine private Eigenschaft in der Klasse Abgeleitete überhaupt nicht überschrieben wird, werden sie nur überschrieben, wenn die Methodensignatur gleich ist.

Derived po = new Derived(); 
po.f(); 

Thsi ist der richtige Code, der Abgeleitet Anruf wird f

+0

Die Frage bezieht sich auf Java, nicht auf C#. 'virtual' existiert nicht in Java. – Jesper

+0

Danke für den Kommentar, ich reparierte auch die Antwort. –

0

Die Überschreibung der Methode hat drei conditions.child Klasse muss den gleichen Namen und Parameter hat und zurückgegebene Wert als Super class.But, wenn beide der Parameter und Rückgabewert werden variieren, so dass die Überschreibung ist nicht vorhanden, auch wenn die beiden Verfahren unterschiedliche Verfahren sind in Ordnung wie folgt:!

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

Eclipse Fehler nicht sprechen! weil die Methode addV in der Klasse Child mit der Methode addV in der Klasse Parent anders ist. Als Ihre Instanz!

+0

Nur der Name der Methode und die Liste der Argumente müssen identisch sein. Der Rückgabewert von child könnte die Unterklasse des Rückgabewerts von parent sein. Und es gibt zwei weitere Regeln, die Sie weggelassen haben. Die Methode in child muss mindestens so zugänglich sein wie die im übergeordneten Element. Und die Unterklasse kann keine neue oder erweiterte Ausnahme auslösen. – pkkoniec

Verwandte Themen