JShell ist ein Befehlszeilentool zum Ausführen von Codeschnipseln in einer Shell-Umgebung, ohne dass eine vollständige Anwendung kompiliert und ausgeführt werden muss. JShell ist eine neue Funktion in Java 9. JShell könnte zum Testen und Debuggen von Codeschnipseln bei der Entwicklung einer Anwendung verwendet werden. Die JShell-Eingabe sollte in Form eines vollständigen Codeausschnitts erfolgen. Wir haben JShell mit zwei Artikeln eingeführt, „Using JShell in Java 9 in NetBeans 9.0, Part 1“ und „Using JShell in Java 9 in NetBeans 9.0, Part 2“, in denen wir die Ausführung des Imports besprochen haben -Anweisung, Variablen deklarieren und verwenden, String vergleichen s und laufende Anweisungen. In diesem Folgeartikel führen wir Snippets für Java-Methoden aus. Dieser Artikel hat die folgenden Abschnitte:
- Einstellung der Umgebung
- Methoden verwenden
- Ändern einer Methodendefinition
- Methodenüberladung
- Einen Vorwärtsverweis auf eine Methode erstellen
- Auflistungsmethoden
- Modifikatoren sind in Methodendeklarationen der obersten Ebene nicht zulässig
- Schlussfolgerung
Einstellung der Umgebung
Laden Sie NetBeans herunter und installieren Sie es, wie in einem früheren Artikel beschrieben. Starten Sie JShell, indem Sie Extras>Java Platform Shell öffnen auswählen , wie in Abbildung 1 gezeigt.
Abbildung 1: Extras>Java Platform Shell öffnen
Methoden verwenden
Eine Methode wird in JShell genau wie in einer Java-Anwendung deklariert, mit einigen Unterschieden, die ebenfalls in diesem Abschnitt behandelt werden. Deklarieren Sie als Beispiel eine Methode triple(int) das braucht ein int Argument und gibt ein int zurück Wert.
int triple(int i) { return i*3; }
Führen Sie das Code-Snippet in JShell aus und eine Methode wird erstellt.
[10]-> int triple(int i) { return i*3; } | created method triple(int)
Rufen Sie die Methode triple auf mit einem int Wert als Argument.
triple(1)
Der Argumentwert wird verdreifacht und zurückgegeben.
[11]-> triple(1) | $13 ==> 3 [12]->
Die Methode hat einen Rückgabetyp und Parameter, aber keinen Zugriffsmodifikator wie public , privat , oder geschützt . Dies liegt daran, dass eine Methodendeklaration der obersten Ebene, wie alle Deklarationen der obersten Ebene, implizit öffentlich ist. Jeder Zugriffsmodifizierer in einer Methodendeklaration der obersten Ebene wird ignoriert. Alle folgenden Methodendeklarationen entsprechen der vorhergehenden Methodendeklaration.
[1]-> private int triple(int i){ return 3*i; } | created method triple(int) [2]-> protected int triple(int i){ return 3*1; } | replaced method triple(int) [3]-> public int triple(int i){ return 3*i; } | replaced method triple(int) [4]->
JShell zeigt ggf. Kompilierungsfehler an. Machen Sie als Beispiel den Rückgabetyp der Methode triple als String und eine Fehlermeldung wird angezeigt.
[10]-> String triple(int i) { return i*3; } | Error: | incompatible types: int cannot be converted to java.lang.String | return i*3; | ^-^
Ändern einer Methodendefinition
Eine Ausgabenachricht, die nicht von einer Java-Anwendung generiert würde und in diesem Abschnitt bereits zweimal aufgeführt ist, ist „replaced method…“. Die Meldung zeigt an, dass eine Methodendefinition geändert wurde. Die Bestimmung zum Ersetzen/Ändern einer Methodendeklaration und anderer Deklarationen soll das Testen erleichtern.
Um eine Methode zu ändern oder zu ersetzen, ohne eine neue Methode zu definieren, darf die Methodensignatur, die durch den Methodennamen und die Methodenparameter einschließlich der Anzahl der Parameter und ihres Typs und ihrer Reihenfolge festgelegt wird, nicht geändert werden. Deklarieren Sie als Beispiel eine Methode hello mit Rückgabetyp void und einen String Typparameter.
[4]-> void hello(String s){ } | created method hello(String)
Deklarieren Sie als Nächstes dieselbe Methode hello mit Rückgabetyp String , ein String type-Parameter und eine return-Anweisung. Die vorherige Methodendeklaration für hello wird ersetzt.
[5]-> String hello(String s){ return "Hello " + s; } | replaced method hello(String) [6]->
Rufen Sie die Methode hello(String) auf und die zweite Methodendefinition wird aufgerufen, um eine „Hello John“-Nachricht auszugeben.
[6]-> hello("John") | $5 ==> "Hello John" [7]->
Die Methodenargumente werden bei Bedarf im Methodenaufruf verkettet, wie im folgenden Ausschnitt.
[7]-> hello("John"+" & "+"Johnny") | $22 ==> "Hello John & Johnny" [8]->
Im vorherigen Beispiel zum Modifizieren einer Methode haben wir den Rückgabetyp void ersetzt mit String . Return muss nicht geändert werden, um eine Methode zu ersetzen. Definieren Sie als Beispiel eine Methode hello wie folgt.
[15]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Ändern Sie als Nächstes nur die Rückgabe Erklärung. Die Methode hello(String,String) wird ersetzt.
[16]-> String hello(String str1, String str2){ return "Hello"+str1+str2; } | replaced method hello(String,String)
Als weiteres Beispiel für die Ausführung eines Methodencode-Snippets definieren Sie eine Methode hello(String str1, String str2) mit Rückgabetyp String[] .
[17]-> String[] hello(String str1, String str2){ return new String[]{str1,str2}; } | created method hello(String,String)
Rufen Sie die Methode mit zwei Argumenten auf, um ein Array zurückzugeben.
[18]-> hello("John","Michael") | $39 ==> String[2] { "John", "Michael" }
Methodenüberladung
Eine Methode kann genau wie in einer Java-Anwendung überladen werden. Deklarieren Sie eine Methode hello(String s) .
[1]-> String hello(String s){ return "Hello " + s; } | created method hello(String)
Rufen Sie die Methode auf, um eine Nachricht auszugeben.
[2]-> hello("John") | $1 ==> "Hello John"
Deklarieren Sie eine andere Methode hello(String,String) .
[3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Rufen Sie die Methode auf, um eine Nachricht auszugeben.
[5]-> hello("Hello"," John") | $16 ==> "Hello John"
Einen Vorwärtsverweis auf eine Methode erstellen
JShell unterstützt Vorwärtsverweise auf eine Methode. Eine Weiterleitungsreferenz ruft eine noch nicht definierte Methode auf. Deklarieren Sie eine Methode main(String) das macht einen Verweis auf eine Methode hello(String) , die noch nicht definiert ist. Die Methode main(String) wird zwar erstellt, kann aber erst mit der Methode hello(String) aufgerufen werden ist definiert.
[1]-> String main(String str){ return "Hello "+hello(str); } | created method main(String), however, it cannot be invoked until | method hello(java.lang.String) is declared
Rufen Sie die Methode main(String) auf und es wird eine Meldung ausgegeben, die anzeigt, dass es nicht aufgerufen werden kann.
[2]-> main("Michael") | attempted to call method main(String) which cannot be invoked | until method hello(java.lang.String) is declared
Deklarieren Sie die Methode hello(String) die von main(String) referenziert wird .
[3]-> String hello(String name){ return name; } | created method hello(String)
Rufen Sie anschließend die Methode main(String) auf erneut und es wird aufgerufen.
[4]-> main("Michael") | $1 ==> "Hello Michael"
Das ";" wird implizit hinzugefügt, wenn es nicht in Variablendeklarationen der obersten Ebene und Methodendeklarationen hinzugefügt wird, die einmal pro Zeile hinzugefügt werden. Aber die ";" ist nicht in Anweisungen innerhalb einer Methode enthalten. Als Beispiel deklarieren Sie die folgende Methode und es wird ein Fehler ausgegeben.
[1]-> int average(int i,int j){ return (i+j)/2 } | Error: | ';' expected
Auflistungsmethoden
Methoden, die in einer bestimmten JShell-Sitzung definiert sind, werden mit /methods aufgelistet Befehl. Definieren Sie zur Demonstration einige Methoden.
[1]-> int triple(int i) { return i*3; } | created method triple(int) [2]-> String hello(String s){ return "Hello" + s; } | created method hello(String) [3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String) [4]-> int average(int i,int j){ return (i+j)/0; } | created method average(int,int)
Führen Sie /methods aus Befehl, und alle hinzugefügten Methoden werden aufgelistet.
[5]-> /methods | printf (String,Object...)void | triple (int)int | hello (String)String | hello (String,String)String | average (int,int)int [5]->
Modifikatoren sind in Methodendeklarationen der obersten Ebene nicht zulässig
Während Modifikatoren public , privat , und geschützt in Methodendeklarationen der obersten Ebene ignoriert werden und eine Methodendefinition implizit mit öffentlichem Zugriff erstellt wird, werden bestimmte andere Modifikatoren nicht ignoriert und sind in einer Methodendeklaration der obersten Ebene nicht zulässig. Diese Modifikatoren sind auf oberster Ebene nicht zulässig, da sie in einem bestimmten Kontext von Bedeutung sind und im Kontext von JShell, das Codeschnipsel testen soll, nicht geeignet sind.
Der Modifikator statisch hat Bedeutung, wenn es mit einer Methode im Kontext einer Klasse oder einer Schnittstelle verwendet wird, jedoch nicht auf der obersten Ebene. Führen Sie als Beispiel die folgende Methodendeklaration aus, die static enthält .
[1]-> static String hello(String name){ return "Hello "+name; } | Warning: | Modifier 'static' not permitted in top-level declarations, | ignored | static String hello(String name){ | ^----^ | created method hello(String)
Die statische modifier wird ignoriert, es wird eine Warnung ausgegeben, aber es wird eine Methode erstellt. Die Methode kann aufgerufen werden.
[2]-> hello("John") | $1 ==> "Hello John" [3]->
Ebenso der Modifikator final hat auf der obersten Ebene keine Bedeutung, weder in einer Methodendeklaration noch in einer anderen Deklaration, da JShell darauf ausgelegt ist, Codeschnipsel dynamisch auszuführen und eine Methode (oder Variable oder Klasse) final zu deklarieren würde das Snippet unveränderbar machen. Fügen Sie als Beispiel das finale hinzu Modifikator einer Methode. Das Finale Modifikator ignoriert, eine Warnung generiert und die Methodendefinition ohne final erstellt .
[2]-> final int triple(int i){ return 3*i; } | Warning: | Modifier 'final' not permitted in top-level declarations, | ignored | final int triple(int i){ | ^---^ | created method triple(int)
Rufen Sie die Methode auf und sie gibt ein Ergebnis aus.
[3]-> triple(5) | $1 ==> 15 [4]->
Einige andere Modifikatoren sind auf der obersten Ebene ebenfalls nicht zulässig, weder in einer Methode noch in einer anderen Deklaration. Während Modifikatoren statisch und final werden ignoriert und eine Methodendefinition erstellt, Modifikatoren abstract und nativ in einer Top-Level-Methode erzeugen einen Fehler und eine Methode wird nicht erstellt.
[1]-> abstract String hello(String s){ return "Hello "+s; } | Error: | Modifier 'abstract' not permitted in top-level declarations | abstract String hello(String s){ | ^------^ [1]-> [1]-> native String hello(String s){ return "Hello "+s; } | Error: | Modifier 'native' not permitted in top-level declarations | native String hello(String s){ | ^----^
Modifikatoren Standard und synchronisiert in einer Methodendeklaration der obersten Ebene oder einer anderen Deklaration sind ebenfalls nicht zulässig und erzeugen einen Fehler.
Schlussfolgerung
In diesem Artikel haben wir das Ausführen von Codeausschnitten für Java-Methoden in JShell besprochen. In einem späteren Artikel werden wir das Ausführen von Codeschnipseln für Java-Klassen, -Schnittstellen und -Arrays besprechen.