2017-11-02 14 views
0

Ich habe mit Vererbung und Polymorphismus herumgespielt. Der Ausdruck des folgenden Codes ist: Student 1 Person 1 Undergrad 2. So habe ich zwei Fragen:wie man eine Methode aufruft, ohne ihre Unterklasse aufzurufen

Warum fügt Java automatisch ein This ein, wenn ich method2() in der Student-Klasse aufrufen? Was wäre, wenn statt des ursprünglichen Ausdrucks ich Student 1 Person 1 Student 2 ausdrucken wollte. Wie würde ich method2 der Student-Klasse explizit aufrufen?

Ich habe 3 Klassen, die Klasse Person:

public class Person { 
    public static void main(String[] args) { 
    Person u = new Undergrad(); 
    u.method1(); 
    } 
    public void method1() { 
    System.out.print("Person 1 "); 
    } 
    public void method2(){ 
    System.out.print("Person 2 "); 
    } 
} 

Der Student Klasse

public class Student extends Person { 
    public void method1(){ 
    System.out.print("Student 1 "); 
    super.method1(); 
    method2(); 
    } 
    public void method2(){ 
    System.out.print("Student 2"); 
    } 
} 

Und die Nichtgraduiertentwurf Klasse:

public class Undergrad extends Student{ 
    public void method2(){ 
    System.out.print("Undergrad 2 "); 
    } 
} 
+0

Sie haben die 'method2' in' Undergrad' überschrieben und auf ein Objekt der 'Undergrad' Klasse geklickt. Also heißt die überschriebene 'Methode2', weil das der springende Punkt der Polymorphie ist. Wenn Sie möchten, dass die überschriebene Methode Methoden ihrer Oberklassen aufruft, müssen Sie sie in die Methode einprogrammieren. –

Antwort

2

Dies ist, wie der Code funktioniert:

  1. Sie erstellen eine Undergrad namens u.
  2. Sie rufen u.method1()
  3. Undergrad nicht method2 nicht definiert, so sieht es an seinen Eltern.
  4. Student definiert method2, so heißt es.
  5. "Student 1 " wird
  6. gedruckt
  7. Student::method1super.method1 Anrufe, die gedruckt wird bei Person
  8. "Person 1 " aussieht; die Funktion kehrt zum Stapelpunkt bei 6
  9. Student::method1 Anrufe method2
  10. Beachten Sie, dass dies technisch auf dem Undergrad Objekt bezieht. Da Undergradmethod2 überschreibt, druckt es Undergrad 2.
  11. method2 kehrt zurück zu main

Wenn Sie method2 eines Student-Klasse aufrufen wollen, werden Sie ein Student Objekt finden müssen, die nicht method2 enthebt; das heißt, ein normaler Student, kein Student.

0

Versuchen Sie, alle Schlüsselwörter wie public, final, private, static zu untersuchen. Dann gibt es die Themen "Method Hiding" und "Method Overriding". Sehen Sie sich auch die @override Annotation an. Versuchen Sie zu verstehen, wie Sie Klassen umwandeln können. Neben den anderen Antworten in diesem Thema, in Ihrem Beispiel können Sie auch tun:

Student u = new Undergrad(); 

weil jede Instanz von Nichtgraduiertentwurf auch ein Student. Nun haben Sie jedoch Zugriff auf die Methoden von Student. Also schlage ich vor, method2 in Student private zu bringen, so dass u.method2() "Student 2" ausgibt.

Verwandte Themen