Dieser Artikel ist eine Fortsetzung von "Ich habe auf leicht verständliche Weise über den Niedergeschlagenen geschrieben". Daher wird ein Teil des Quellcodes (Cat-Klasse, Dog-Klasse, Life_form-Klasse) usw. im Element "Details der zur Erklärung verwendeten Klasse" unten veröffentlicht.
Der Text beginnt mit "Was ist die Instanz des Operators?".
Dieser Artikel gibt einen kurzen Überblick über Upcasts und Downcasts, aber mehr Wenn Sie mehr wissen möchten, lesen Sie bitte den folgenden Artikel.
Atom : 1.28.0 Electron: 2.0.3 Chrome : 61.0.3163.100 Node : 8.9.3
java version "1.8.0_161" Java(TM) SE Runtime Environment (build 1.8.0_161-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
Die Instanz des Operators ist auch eng mit Upcast und Downcast verbunden. Lassen Sie uns daher einen kleinen Rückblick geben.
Upcasting ist die Initialisierung einer übergeordneten Klasseninstanz mit einer untergeordneten Klasseninstanz. Dies ist ** auch wenn in der Entwurfsphase nicht entschieden wird, wie viele untergeordnete Klassen erstellt werden sollen. Wenn Sie das Argument zu einer übergeordneten Klasseninstanz machen, können Sie jede untergeordnete Klasseninstanz übergeben ** Ist bequem.
Es gibt jedoch Probleme damit. Wie in "Ich habe auf leicht verständliche Weise über Java-Downcast geschrieben erklärt" habe ich neulich geschrieben: ** Funktionen, die nur für untergeordnete Klassen gelten, wenn Upcast verwendet wird Kann nicht ** genannt werden.
Ich werde dort niedergeschlagen ... Das Hauptthema ist von hier.
Schauen Sie sich das Programm unten an und antizipieren Sie, was passieren wird.
Die Details der Klasse werden unter "Details der zur Erklärung verwendeten Klasse" beschrieben.
Main.java
public class Main{
public static void main(String[] args){
Life_form life_form = new Life_form();
java.util.Random r = new java.util.Random();
if( r.nextInt(2) == 0 ){
life_form = new Cat();
}else{
life_form = new Dog();
}
//Proprietärer Funktionsaufruf von Downcast.
Cat lifo = (Cat)life_form;
lifo.catPunch();
}
}
Das Ausführungsergebnis ist wie folgt
Lassen Sie uns das Programm erklären. Es generiert eine Zufallszahl und sendet eine Cat-Instanz, wenn sie 0 ist, und eine Dog-Instanz, wenn sie 1 ist.
Dann versuche ich, auf die Cat-Klasse herunterzuspielen und die eigene Funktion catPunch () der Cat-Klasse aufzurufen.
Wenn ich es ausführe, gibt es zwei Fälle, einen, wenn catPunch () erfolgreich aufgerufen wird, und den anderen, wenn ich einen ClassCastException-Fehler erhalte.
Sie können sehen, dass es nur funktioniert, wenn die generierte Instanz von Cat stammt.
Mit anderen Worten, wenn umgekehrt eine Dog-Instanz erstellt wird, tritt ein Fehler auf.
Natürlich. Wie Sie dem Block der if-Anweisung entnehmen können, kann die Entität der Life_form-Instanz eine Dog-Instanz sein. Selbst wenn Sie versuchen, eine Cat-Instanz gewaltsam herunterzuspielen, können Sie keine Cat-Instanz werden, obwohl die Entität eine Dog-Instanz ist.
** Wenn Sie eine für eine untergeordnete Klasse eindeutige Funktion aufrufen möchten, müssen Sie wissen, was die übergeordnete Klasseninstanz wirklich ist **.
Auf diese Weise kann, selbst wenn die Instanzen der untergeordneten Klasse durch Upcasting umfassend beibehalten werden können, kein ordnungsgemäßes Casting durchgeführt werden, ohne den Inhalt zu kennen, und daher können die für die untergeordnete Klasse eindeutigen Funktionen nicht aufgerufen werden. Dies ist unpraktisch.
** Ich möchte den Inhalt der Instanz herausfinden. Es gibt eine Instanz des Operators, um dies zu erreichen **.
Instanz Instanz des Typnamens
Mit dieser Syntax können Sie herausfinden, was die Entität der Instanz ist. True, wenn die Instanzentität und der Typname übereinstimmen. Wenn sie nicht übereinstimmen, wird natürlich false als Rückgabewert zurückgegeben.
Auf dieser Grundlage wird die geänderte Version des vorherigen Programms unten gezeigt.
Main.java
public class Main{
public static void main(String[] args){
Life_form life_form = new Life_form();
java.util.Random r = new java.util.Random();
if( r.nextInt(2) == 0 ){
life_form = new Cat();
}else{
life_form = new Dog();
}
//Instanz Instanz des Typnamens
if( life_form instanceof Cat ){
Cat cat = (Cat)life_form;
cat.catPunch();
}else{
Dog dog = (Dog)life_form;
dog.dogAttack();
}
}
}
Richtig, ** Verhalten nach Entität wird ausgegeben **. Beachten Sie, dass der Operator instanceof im bedingten Ausdruck der if-Anweisung ein ordnungsgemäßes Downcasting ermöglicht. Stellen Sie außerdem sicher, dass die für die generierte Instanz eindeutige Funktion ordnungsgemäß aufgerufen werden kann.
Auf diese Weise können Sie mit dem Operator ** instanceof ** einen sicheren Downcast erzielen.
-Die Instanz des Operators``` Instanz Instanz des Typnamens
- Mit dem Operator instanceof können Sie das Verhalten jeder Instanz ändern.
- Mit dem Operator instanceof können Sie einen sicheren Downcast erzielen, wenn Sie eine Funktion verwenden möchten, die nur für eine untergeordnete Upcast-Klasseninstanz gilt.
# Details wie die für die Beschreibung verwendete Klasse
#### **`Life_form.java`**
```java
//Übergeordnete Klasse
public class Life_form{
public void makeSound(){
System.out.println("???");
}
}
Cat.java
public class Cat extends Life_form{
@Override
public void makeSound(){
System.out.println("nyaa");
}
public void catPunch(){
System.out.println("Katzenbrot");
}
}
Dog.java
public class Dog extends Life_form {
@Override
public void makeSound(){
System.out.println("Kuhn!");
}
public void dogAttack(){
System.out.println("Beißen");
}
}
Recommended Posts