Der von JAVA bereitgestellte „“-Operator, wie z. B. Iteger String, aus C-Perspektive, ich möchte immer herausfinden, wie JAVA diesen „“-Operator überlastet, also bin ich in die String-Klasse gegangen, um nachzusehen, aber ich habe nichts gefunden. Sie denken also darüber nach, wie JAVA das macht? Lassen Sie uns Schritt für Schritt analysieren, wie JAVA die „Operatorüberladung“ implementiert.
Beispiel
public class Example { public static void main(String[] args) { Integer a = null; String b = a + "456"; System.out.println(b); } }
Dieses Programm ist sehr einfach und ist ein „ “-Operationsausdruck von Integer und String. Laufergebnis: null456
Beispielprogramm dekompilieren
Befehl:
javap -c Example
Das dekompilierte Ergebnis lautet wie folgt:
Compiled from "Example.java" public class com.boyu.budmw.test.Example extends java.lang.Object{ public com.boyu.budmw.test.Example(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: aconst_null 1: astore_1 2: new #2; //class java/lang/StringBuilder 5: dup 6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 9: aload_1 10: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; 13: ldc #5; //String 456 15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 21: astore_2 22: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; 25: aload_2 26: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 29: return }
Lassen Sie es uns analysieren Hauptfunktionsteil:
0: Schiebe die Konstante null in den Operandenstapel
1: Entferne die Null aus dem Operandenstapel und speichere sie in der lokalen Variablen a mit Index 1
2: neuer StringBuilder
5: Kopieren Sie den zuvor von new erstellten Platz und schieben Sie ihn in den Operandenstapel
6: Aufruf zur Initialisierung
9: Speichern Sie den Ergebnis an den Operandenstapel
10: StringBuilder.append(java/lang/Object) aufrufen
13: „456“ an die Spitze des Stapels schieben
15: StringBuilder .append(java/lang/String)
18: toString-Funktion ausführen
Aus der obigen Analyse können wir erkennen, dass schließlich zuerst ein StringBuilder-Objekt und dann der Operator „ “ generiert wird Alles wird durch den Aufruf von StringBuilder.append() erledigt. Dies kann erklären, warum das obige Beispielprogramm nach der Ausführung null456 ist. Beim Anhängen des Objekts wird
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
aufgerufen, um das Objekt in einen String zu konvertieren.
Warum unterstützt JAVA keine Operatorüberladung?
Klassen wie C-Überladungsoperatoren Ich persönlich denke, dass es ein schwieriges Problem für Betrieb und Wartung sein wird, da es keinen Standard gibt, der die Operatorüberladung einschränkt und jeder kann davon ausgehen, dass eine Überladung einen großen Unterschied in der Semantik verursacht und die Lesbarkeit erheblich beeinträchtigt. Daher steht die Funktion zum Entfernen der Operatorüberladung in Java im Einklang mit seiner fortgeschrittenen objektorientierten Natur. Verweilen Sie also nicht bei diesem Thema.
Postscript
Dies sind einige Dinge, die während des Entwicklungsprozesses häufig verwendet werden. Wir gehen jedoch möglicherweise nicht so tief in die Materie ein. Sie können es versuchen Untersuchen Sie diese verschiedenen Dinge später weiter. Ein kleiner Fall wurde entdeckt.