Heim  >  Artikel  >  类库下载  >  JAVA-Operator für syntaktischen Zucker „ '

JAVA-Operator für syntaktischen Zucker „ '

高洛峰
高洛峰Original
2016-10-15 09:50:201899Durchsuche

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.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn