2016-07-07 30 views
2

Ich habe einen Code und ich bin nicht in der Lage zu bekommen, warum die Ausgabe wird "Radial Tire mit lang". Kann mir jemand helfen, diesen Code zu verstehen?Überladen oder außer Kraft setzen?

class Tyre { 
    public void front() throws RuntimeException { 
     System.out.println("Tire"); 
    } 

    public void front(long a) { 
     System.out.println("Radial Tire with long"); 
    } 
} 

class TestSolution extends Tyre { 
    public void front() { 
     System.out.println("Radial Tire"); 
    } 
    public void front(int a) throws RuntimeException { 
     System.out.println("Radial Tire with int"); 
    } 


public static void main(String... args) { 
     Tyre t = new TestSolution(); 
     int a = 10; 
     t.front(a); 

} 

} 
+0

kein überwiegendes hier. – EJP

+3

Wenn Sie der Methode "@ Override" hinzufügen können, ohne dass es sich um einen Compilerfehler handelt, überschreiben Sie die Methode. Beachten Sie, dass es eine gute Idee ist, diese Annotation als eine Selbstverständlichkeit hinzuzufügen. –

+0

Das ist nicht überschreiben :) –

Antwort

0

Es gibt keine überwiegende in Ihrem main statt.

t ‚s statisch (kompilieren Zeit) Typ ist Tyre, so, da -Methodenüberladung Auflösung durch die Kompilierung-Typ der Instanz festgelegt ist, die einzigen front verfügbaren Methoden für den Compiler aus sind solche deklariert zu wählen, in die Basisklasse Tyre:

public void front() 
public void front(long a) 

Nur letztere (public void front(long a)) übereinstimmt, die Argumente des Aufrufs t.front(a), und das Verfahren wird durch die Unterklasse nicht außer Kraft gesetzt. Daher wird Radial Tire with long angezeigt.

Aufruf ((TestSolution)t).front(a); würde die Methode der Unterklasse aufrufen - public void front(int a).

+0

Danke Eran, aber TestSolution enthält eine überschriebene Front (int a), warum geht es dann für die in der Superklasse definierte? – Arzoo

+0

@Arzoo 'void front (int a)' überschreibt keine Methode in der Basisklasse, da die Basisklasse keine Methode mit einer solchen Signatur hat. Daher wird 'void front (int a)' nicht überschrieben. Hätten Sie eine 'void front (int a)' Methode in der Basisklasse, wäre die 'void front (int a)' Methode in TestSolution wegen Überschreibens ausgeführt worden. – Eran

+0

Okay, du hast Recht, ich habe diese winzigen Details verpasst, Danke Eran :-) – Arzoo

4

front nicht überschrieben in TestSolution ist es überlastet.

Sie können eine überladene Funktion als eine völlig andere Funktion betrachten, wie eine mit einem anderen Namen.

So t.front(a) wird die eine in Tyre nennen, mit einem a implizit long umgewandelt.

+0

Danke, aber eine Sache, TestSolution erweitert Tyre auch, dann wird es nicht auch ein Fall des Übersteuerns sein? – Arzoo

+0

Nein. Eine * überschriebene * Funktion muss dieselbe * Signatur * haben. Das bedeutet, dass der Funktionsname und die Parametertypen genau übereinstimmen müssen. Eine gewisse Flexibilität ist für den Rückgabetyp zulässig, aber das ist hier nicht der Fragebereich. – Bathsheba

1

Also, wenn wir mit Definitionen gehen

Overloading bedeutet Methoden mit demselben Namen, aber mit unterschiedlicher Anzahl und Reihenfolge der Parameter.

Zwingende bedeutet Methode mit dem gleichen Namen mit dem gleichen Anzahl von Parametern zusammen mit Regeln erwähnt here

So in Ihrem Fall front Methode Überlastung in beiden Klassen Tyre und TestSolution

Methode front() von Tyre Klasse überschrieben wird in Klasse TestSolution.

kein Überschreiben bei Methode front(long a) und front(int a).

+0

Das machte es mir klar. Vielen Dank ! – Arzoo

0

Allgemeine Regel: Wenn ich eine Variable einer Klasse habe, kann ich nur auf Methoden und Komponenten zugreifen, die in dieser Klasse definiert sind.

Der einzige Fall ist:

  1. Sie haben ein oder Verfahren sowohl in der Superklasse und in der Unterklasse (übergeordnete)
  2. Sie haben eine Variable der Superklasse und ein Ziel der Unterklasse (Ihr Fall)

In diesen Fällen können Sie die folgende Regel folgen:

  1. f oder die Komponenten der Typ der Variablen, die
  2. für die Methoden der Art des Objekts zu verwenden, entscheidet sich (späte Bindung)

In Ihrem Fall wie gesagt, bevor die Methode nicht außer Kraft gesetzt wird, so dass Sie nicht Wende die letzte Regel an.

0

Lässt den Unterschied zwischen overloading verstehen und overriding

Überladen:

Die Programmiersprache Java unterstützt Methoden Überlastung und Java kann zwischen Methoden mit unterschiedlichen Methodensignaturen unterscheiden. Dies bedeutet, dass Methoden innerhalb einer Klasse können den gleichen Namen haben, wenn sie unterschiedliche Parameterlisten haben

Zwingende:

Eine Instanz-Methode in einer Unterklasse mit der gleichen Signatur (Name, plus die Anzahl und die (Typ seiner Parameter) und Rückgabetyp als Instanzmethode in der Oberklasse überschreibt die Methode der Oberklasse.

Tyre erklärt front() Methode mit long als Parameter.

TyreSolution deklariert front() Methode mit int als Parameter.

Da die Methode Signatur unterscheidet, TyreSolution Überlastungen Tyre ‚s front() Methode

Wenn Sie Signatur von front() in TyreSolution ändern long Wert als Eingabeparameter statt int, dann TyreSolution Überschreibungen Tyre'sfront() Methode zu akzeptieren.

z.B. TestSolution Klassendefinition front() Methode

public void front(long a) throws RuntimeException { 
    System.out.println("Radial Tire with long in TestSolution"); 
} 

Ausgang:

Radial Tire with long in TestSolution 
Verwandte Themen