In java können wir passieren superclass-Objekt-Unterklasse verweisen?
In java, können wir passieren superclass-Objekt-Unterklasse verweisen ?
Ich weiß, es ist eine komische Frage/praktisch nicht lebensfähig,
aber ich will die Logik verstehen, die hinter dieser
Warum ist es nicht erlaubt in java.
class Employee {
public void met1(){
System.out.println("met1");
}
}
class SalesPerson extends Employee
{
@Override
public void met1(){
System.out.println("new met1");
}
public void met2(){
System.out.println("met2");
}
}
public class ReferenceTest {
public static void main(String[] args) {
SalesPerson sales = new Employee(); //line 1
sales.met1(); //line 2
sales.met2(); //line 3
}
}
Was passiert wäre, wenn Java erlaubt Zusammenstellung von Zeile 1?
Wo würde das problem entstehen?
Alle Eingänge/link begrüßt werden.
- Es würde keinen Sinn machen. Wenn es erlaubt würde, könnten Sie Felder/Methoden, die Sie erwarten würden, um dort zu sein, die nicht wirklich da sind. Wenn Sie durften, ich denke, die Sprache Designer könnte gesperrt worden sein, irgendwo, wo Sie konnte nicht mehr tun Schaden.
- was erwartest du, was passieren würde?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr
SalesPerson sales = new Employee();
- Anweisung erlaubt war, zu kompilieren, das würde gebrochen haben, die Grundsätze der Polymorphismus, das ist eine der Funktionen, die Sprache hat.Außerdem sollten Sie damit vertraut werden, dass nicht compile-Zeit-Typ und runtime-Typ bedeuten:
Den compile-Zeit-Typ einer Variablen ist der Typ der es erklärt wird, während die runtime-Typ ist der Typ der das eigentliche Objekt der variable Punkte zu. Zum Beispiel:
Der compile-Zeit-Typ von
sales
istEmployee
und die runtime-Typ wirdSalesPerson
.Der compile-Zeit-Typ bestimmt, welche Methoden aufgerufen werden können, während die runtime-Typ wird definiert, was passiert, während der eigentliche Aufruf.
Nehmen wir an, für einen moment, dass diese Aussage gültig war:
Wie gesagt, die compile-Zeit-Typ bestimmt, welche Methoden aufgerufen werden können, so
met2()
in Betracht kam für den Aufruf. Mittlerweile, dieEmployee
Klasse keinenmet2()
und so den aktuellen call nicht möglich gewesen wäre.Nicht. Es macht null Sinn, damit.
Der Grund ist, weil Unterklassen im Allgemeinen definieren zusätzliche Verhalten. Wenn Sie zuordnen könnte Objekt einer Oberklasse zu einer Unterklasse verweisen, würden Sie in Probleme ausgeführt zur Laufzeit, wenn Sie versuchen, Zugriff auf Klassenmitglieder, die die eigentlich gar nicht existieren.
Beispielsweise, wenn diese durften:
Führen Sie in einige ziemlich arge Probleme. Was passiert, wenn Sie versuchen, rufen Sie ein
String
Methode? Würde die Laufzeit zum Absturz? Oder vielleicht eine nicht-op durchgeführt? Sollte das auch kompilieren?Wenn die Laufzeit waren zu Abstürzen, Sie könnte verwenden-Laufzeit überprüft, um sicherzustellen, dass die Objekte, die Sie von uns erhalten, enthalten die Methoden, die Sie möchten. Aber dann bist du im Grunde der Umsetzung gewährleistet, dass die Java-Typ-system bietet bereits zur compile-Zeit. Also wirklich, dass "feature" kostet Sie nichts, aber ein Bündel von Typ-code überprüfen, dass Sie sollten nicht gehabt haben, um schreiben in den ersten Platz.
Wenn keine-ops ausgeführt wurden anstelle der nicht vorhandenen Methoden, es würde extrem schwierig sein, um sicherzustellen, dass Ihre Programme laufen würde, wie geschrieben, wenn die Mitglieder, die Sie zugreifen möchten, nicht vorhanden ist, als Referenz könnte wirklich ein
Object
an jedem beliebigen Punkt. Dies könnte leicht zu handhaben, wenn Sie an Ihre eigenen arbeiten und Steuern Sie alle Ihre code, aber wenn Sie haben, um mit anderen Codes, diese Garantien im wesentlichen verschwinden.Wenn Sie wollen, dass der compiler die überprüfung, Annahme-compiler Autoren nicht jagen Sie nach unten und geben Sie einem stern zu sprechen-zu -- nun ja, Sie sind wieder "normal" zu Verhalten einmal mehr. Also nochmal, es ist nur viel Arbeit für null nutzen.
Lange Geschichte kurz zu machen: Nein, es ist nicht erlaubt, denn es macht null Sinn, so zu tun, und wenn eine Sprache, die designer versucht, um zu ermöglichen, dass Sie würde eingesperrt werden, bevor Sie tun könnte mehr Schaden.
Wenn Sie von einer Klasse Erben, werden Sie immer spezialisieren, das gemeinsame Verhalten der super-Klasse.
In deinem Beispiel, die
SalesPerson
ist eine spezielleEmployee
. Es erbt alle Verhalten aus der super-Klasse und überschreiben können Verhalten, Sie anders zu gestalten oder neue Verhalten.Wenn Sie, wie es erlaubt ist, initialisieren Sie eine variable mit dem super-Typ mit einer Instanz der sub-Typ, wie
Employee e = new SalesPerson()
, dann können Sie alle gängigen Verhalten auf diese variable.Wenn Sie möglich wäre, zu tun, die andere Weise Runde, gibt es möglicherweise mehrere nicht initialisierte Mitglieder in der Klasse.
Finden Sie diese sehr oft bei Verwendung der Java-Collection-API, wo zum Beispiel können Sie den gemeinsamen
List
Klasse auf Operationen wie das iterieren über es, aber beim initialisieren, verwenden Sie zum Beispiel die sub-KlasseArrayList
.