2017-12-07 7 views
0

Ich habe diese Schnittstelle und Klassen:Interface, abstract class und inherhering subclass mit gleicher Methode, die unterschiedliche type argumente bekommt, welche benutzt wird?

public interface AlternateLight { 

    public String change(long time); 
} 

public abstract class AbstractLight { 

    public String change(int time) { 
     return "AbstractLight Method was used"; 
    } 
} 

public class DistinctAlternateLight extends AbstractLight implements AlternateLight { 

    public String change(long time) { 
     return "DistinctAlternateLight Method was used"; 
    } 
} 

Jetzt nenne ich die Methode ändern() mit folgenden Haupt-Methode:

public class WhatUsedTest { 

    public static void main(String[] args) { 
     AlternateLight al = new DistinctAlternateLight(); 
     System.out.println(al.change(100)); 
    } 
} 

Es druckt "DistinctAlternateLight Methode verwendet wurde", aber warum? Ich dachte, da ich kein "L" hinter das 100 als Argument gesetzt habe, würde es die Methode der abstrakten Klasse nennen, weil ihre Methode ganze Zahlen annimmt. Mit dem Fehlen von "L" vermutete ich, dass der Compiler die 100 nicht als Long-Wert behandeln und die Methode Longs aufrufen würde, aber das tut es. Warum ist das so?

Antwort

0

Es ist aufgrund des Polymorphismus, wenn Sie Ihre Variable mit AlternateLight Klasse deklarieren und diese Art hat acces nur (sich ändern lange Zeit).

seien Sie vorsichtig. Wenn Sie die Schnittstelle als Referenztyp verwenden und ihr ein Objekt der implementierenden Klasse zuweisen, können Sie nur die Methoden aufrufen, die innerhalb der Schnittstelle deklariert sind. Dies ist ziemlich offensichtlich, da die implementierende Klasse eigene Methoden definieren kann, die nicht Teil des Vertrags zwischen der Schnittstelle und der Klasse sind. Um diese Methoden aufzurufen, müssen Sie die Klasse als Referenztyp wie folgt verwenden:

DistinctAlternateLight al =new DistinctAlternateLight(); 
0

Die Methode, die Ihren Typargumenten am nächsten kommt, wird verwendet. Aber für kompatible numerische, die tiefste erklärt.

0

Sie können auch sehen, dass der Typ des "al" -Objekts ein Schnittstellentyp ist. Sie können die Methode also nicht ohne Casting von einer Superklasse aufrufen. Sie können auch keine Methode von AbstractLight ohne Casting aufrufen. Sie können nur Methoden aufrufen, die in der Interface-Klasse deklariert wurden. In diesem Fall favorisiert der Compiler die Methode aus der Interface-Klasse. Sie können den Compiler zwingen, eine Methode von der abstrakten Klasse zu nennen, wenn man so etwas schreiben:

System.out.println(((AbstractLight)al).change(100)); 
Verwandte Themen