2016-04-01 5 views
-2

erklären, wie seine Ausgabe kommen wird? Ich habe Zweifel Objekt für welche Klasse in beiden Fällen erstellt wird. Ich bin neu in Java, also bitte erläutern Sie kurz den Objekt Instanziierungsprozess. In diesem Programm erwarte ich die Ausgabe als 150, aber ans = s 90. Wie Methoden und Datenvariablen auf den Unterschied zugreifen?Können Sie bitte den Unterschied zwischen dem Code unter

Programm 1:

class Bike 
{ 
    int speedlimit=90; 
} 
class Honda3 extends Bike 
{ 
    int speedlimit=150; 
    public static void main(String args[]) 
    { 
     Bike obj=new Honda3(); 
     System.out.println(obj.speedlimit);//90 
    } 
} 

Programm 2:

class Bike 
{ 
    int speedlimit=90; 
    void display() 
    { 
     System.out.println(speedlimit); 
    } 
} 
class Honda3 extends Bike 
{ 
    int speedlimit=150; 
    void display() 
    { 
     System.out.println(speedlimit); 
    } 
    public static void main(String args[]) 
    { 
     Bike obj=new Honda3(); 
     obj.display(); 
    } 
} 

Erklären diff zwischen diesen beiden Codes. In Programm 1 wird das Objekt für Honda3 erstellt und ist dem Objekt Bike zugeordnet. Ich habe nicht verstanden, wie Super-Klasse-Methode ausgeführt wird?

+2

Felder sind nicht polymorph. Wenn Sie auf "obj.speedlimit" auf einen Bezug zu einem 'Bike' zugreifen, erhalten Sie' Bike.speedlimit', unabhängig davon, ob es ein Feld namens 'speedlimit' in der konkreten Unterklasse von' Bike' gibt. –

Antwort

1

Wenn eine Unterklasse, ein Verfahren mit den gleichen Signatur (Methodenname + Parametertypen) als eine Methode in der Klasse Basis erklärt, ist die Basisklasse Methode außer Kraft gesetzt.

Dies bedeutet, dass die Unterklassenmethode immer für Objekte der Unterklasse aufgerufen wird, auch wenn die zum Aufruf verwendete Variable als Basisklasse deklariert ist.


Wenn eine Unterklasse als ein Feld in der Basisklasse, das Basisklasse-Feld ist versteckt, aber sie beide noch vorhanden und können unterschiedliche Werte haben ein Feld mit dem gleichen Namen erklärt.

Der Code in der Basisklasse greift auf das Feld in der Basisklasse zu.

Der Code in der Unterklasse greift auf das Feld in der Unterklasse zu. Das Feld in der Basisklasse wurde ausgeblendet, aber Sie können darauf zugreifen, indem Sie sich mit super. qualifizieren.

Code außerhalb der Klassen wird auf das Feld zugreifen, das für den Compiler sichtbar ist, d. H. Das Feld aus der Klasse der Variablen, die für den Zugriff auf das Feld verwendet wird.


Also, wenn Bike obj = new Honda3() verwendet wird, erhalten Sie:

  • obj.display() die Honda3.display() Methode nennen.
  • obj.speedlimit wird auf das Feld Bike.speedlimit zugreifen.

Aus diesen Gründen Feld versteckt ist ein großes NEIN, NEIN!
Tun Sie es nicht. Der Code wird undurchsichtig und verhält sich möglicherweise nicht so, wie Sie es für richtig halten sollten.

Jede gute IDE wird Sie warnen, wenn Sie es tun.

Methoden, die überschreiben Basisklassenmethoden sollten immer mit @Override kommentiert werden. Der Compiler überprüft, ob die Methode tatsächlich eine Basisklassenmethode überschreibt, um sicherzustellen, dass Sie die Methodensignatur nicht durcheinander gebracht haben.

Jede gute IDE warnt Sie, wenn Sie nicht kommentieren, um sicherzustellen, dass Sie eine Basisklassenmethode nicht versehentlich außer Kraft setzen, wenn Sie dies nicht beabsichtigt haben.

0

Ich habe nicht verstanden, wie Super-Klasse-Methode ausgeführt wird ??

Sie können die Superklassen-Implementierung einer überschriebenen Methode nicht aufrufen. Das ist Absicht. Sie sollten nicht zwei Methoden den gleichen Namen geben und eine überschreiben die andere, wenn sie unterschiedliche Zwecke haben.

class Bike { 
    int speedlimit=90; 
    void display() { 
     System.out.println(speedlimit); 
    } 
} 

class Honda3 extends Bike { 
    int overdriveSpeedlimit=150; 
    void displayOverdrive() { 
      System.out.println(overdriveSpeedlimit); 
    } 
} 

public static void main(String[] args) { 
    Honda3 honda= new Honda3(); 
    honda.displayOverdrive(); 
    Bike obj = honda; 
    obj.display(); 
} 
Verwandte Themen