2017-01-18 8 views
4

Ich habe einen bestimmten Code von Java-Zertifizierung Frage und seine Ausgabe Art von mir verwirrt. Hier ist der CodeUnerwartete Ausgabe in Vererbung

class Baap { 
    public int h = 4; 
    public int getH() { 
     System.out.println("Baap " + h); 
     return h; 
    } 
} 

class Beta extends Baap { 
    public int h = 44; 
    public int getH() { 
     System.out.println("Beta " + h); 
     return h; 
    } 
    public static void main(String[] args) { 
     Baap b = new Beta(); 
     System.out.println(b.h + " " + b.getH()); 
    } 
} 

Der Ausgang ist:

Beta 44 
4 44 

Ich hatte erwartet, es zu sein:

4 Beta 44 
44 

Warum es diese Ausgabe erzeugen?

+2

Wenn Sie die Zeile 'System.out.println (bh +" "+ b.getH()); ausführen', übergeben Sie einen einzelnen 'String' an' System.out.println' und den 'getH'-Aufruf muss zuerst vervollständigt werden, sonst gibt es keine 'Zeichenfolge', die an' System.out.println' übergeben werden kann. –

Antwort

3

Die Ausgabe besteht aus zwei Teilen:

  1. Eine Linie innerhalb getH() gedruckten
  2. Eine Linie innerhalb main() gedruckten

Die Linie durch getH() produziert wird vor der Zeile von main() hergestellt gedruckt weil getH() muss beendet werden, bevor main fertig baut seinen Ausgang.

Nun sollte der Ausgang klar sein: Auch wenn 4 ausgewertet ist, bevor der Anruf an getH innen main gemacht wird, wird es gedruckt nachgetH() zurückgekehrt ist.

3

Bevor System.out.println(b.h + " " + b.getH()) kann nichts drucken, muss b.h + " " + b.getH() ausgewertet werden.

b.getH() Aufrufe Beta 's Methode (da es die Basisklasse Methode überschreibt), die Beta 44 druckt.

Dann b.h (4) 4 44 das Ergebnis der b.getH() (44) und println Drucke angehängt.

b.h gibt den Wert der Variable h der Basisklasse (4), da die Kompilierung Typ bBaap ist (die Basisklasse), und Variablen können nicht überschrieben werden. Auf der anderen Seite gibt b.getH() den Wert der h Variable der Unterklasse (44) zurück, da Methoden überschrieben werden können.

0
public static void main(String[] args) { 
     Baap b = new Beta(); 
     System.out.print(b.h + " "); 
     System.out.print(b.getH()); 
    } 
+0

Sie müssen den Prozess des Funktionsaufrufs verstehen. – vonzhou

+0

Darf ich Sie bitten, bitte etwas mehr Kontext um Ihre Antwort hinzuzufügen. Nur-Code-Antworten sind schwer zu verstehen. Es wird sowohl dem Fragesteller als auch zukünftigen Lesern helfen, wenn Sie in Ihrem Beitrag weitere Informationen hinzufügen können. – RBT

1

Die Antwort ist hier im JLS:

15.7.2. Operanden vor der Operation auswerten Die Programmiersprache Java garantiert, dass jeder Operand eines Operators (mit Ausnahme der bedingten Operatoren & &, || und? :) vollständig ausgewertet zu sein scheint, bevor ein Teil der Operation ausgeführt wird.

Ihre Methode getH() eine Nebenwirkung hat, und daß man beobachtet, bevor der Ausdruck vollständig bewertet wird, dass sein Verfahren aufgerufen wird.

Da es zwei Teile:

String baapBetaStr = b.h + " " + b.getH(); 

A) eine Verkettung von Strings

B) ein Methodenaufruf

Und natürlich, um die Zeichenfolge zu verketten, sind alle Teile dieses Ausdrucks müssen zuerst ausgewertet ("ran") werden!