JShell je nástroj příkazového řádku pro spouštění úryvků kódu v prostředí shellu, aniž byste museli kompilovat a spouštět kompletní aplikaci. JShell je nová funkce v Javě 9. JShell lze použít k testování a ladění úryvků kódu při vývoji aplikace. Vstup JShell by měl být ve formě úplného fragmentu kódu. JShell jsme představili dvěma články, „Using JShell in Java 9 in NetBeans 9.0, Part 1“ a „Using JShell in Java 9 in NetBeans 9.0, Part 2“, ve kterých jsme diskutovali o spuštění importu příkaz, deklarování a používání proměnných, porovnávání String s a průběžné výpisy. V tomto pokračování článku budeme spouštět úryvky pro metody Java. Tento článek má následující sekce:
- Nastavení prostředí
- Použití metod
- Úprava definice metody
- Přetížení metody
- Předchozí odkaz na metodu
- Metody výpisů
- Modifikátory nejsou povoleny v deklaracích metod nejvyšší úrovně
- Závěr
Nastavení prostředí
Stáhněte a nainstalujte NetBeans, jak je popsáno v dřívějším článku. Spusťte JShell výběrem Tools>Open Java Platform Shell , jak je znázorněno na obrázku 1.
Obrázek 1: Nástroje>Otevřít prostředí Java Platform Shell
Použití metod
metoda je deklarován v JShell stejně jako v aplikaci Java, s několika rozdíly, které jsou také popsány v této části. Jako příklad deklarujte metodu triple(int) to trvá int argument a vrátí int hodnotu.
int triple(int i) { return i*3; }
Spusťte fragment kódu v JShell a vytvoří se metoda.
[10]-> int triple(int i) { return i*3; } | created method triple(int)
Vyvolejte metodu triple s int hodnotu jako argument.
triple(1)
Hodnota argumentu se ztrojnásobí a vrátí.
[11]-> triple(1) | $13 ==> 3 [12]->
Metoda má návratový typ a parametry, ale žádný modifikátor přístupu, jako je public , soukromé nebo chráněno . Je to proto, že deklarace metody nejvyšší úrovně, stejně jako všechny deklarace nejvyšší úrovně, je implicitně veřejná. Jakýkoli modifikátor přístupu v deklaraci metody nejvyšší úrovně je ignorován. Všechny následující deklarace metody jsou ekvivalentní předchozí deklaraci metody.
[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 zobrazuje chyby při kompilaci, pokud existují. Jako příklad udělejte návratový typ metody triple jako String a zobrazí se chybová zpráva.
[10]-> String triple(int i) { return i*3; } | Error: | incompatible types: int cannot be converted to java.lang.String | return i*3; | ^-^
Úprava definice metody
Výstupní zpráva, která by nebyla generována aplikací Java a která je v této části již uvedena dvakrát, je „nahrazená metoda…“. Zpráva označuje, že definice metody byla změněna. Ustanovení o nahrazení/úpravě prohlášení o metodě a dalších prohlášení má usnadnit testování.
Pro úpravu nebo nahrazení metody bez definování nové metody se nesmí měnit signatura metody, která je nastavena názvem metody a parametry metody včetně počtu parametrů a jejich typu a pořadí. Jako příklad deklarujte metodu hello s návratovým typem void a řetězec zadejte parametr.
[4]-> void hello(String s){ } | created method hello(String)
Dále deklarujte stejnou metodu ahoj s návratovým typem String , řetězec typ parametru a příkaz return. Předchozí deklarace metody pro hello bude nahrazen.
[5]-> String hello(String s){ return "Hello " + s; } | replaced method hello(String) [6]->
Vyvolejte metodu hello(String) a druhá definice metody je vyvolána pro výstup zprávy „Ahoj Johne“.
[6]-> hello("John") | $5 ==> "Hello John" [7]->
Argumenty metody jsou v případě potřeby zřetězeny při vyvolání metody, jako v následujícím úryvku.
[7]-> hello("John"+" & "+"Johnny") | $22 ==> "Hello John & Johnny" [8]->
V předchozím příkladu úpravy metody jsme nahradili návratový typ void pomocí řetězce . Návrat nemusí být upraven, aby nahradil metodu. Jako příklad definujte metodu hello následovně.
[15]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Dále upravte pouze return prohlášení. Metoda hello(String,String) bude nahrazen.
[16]-> String hello(String str1, String str2){ return "Hello"+str1+str2; } | replaced method hello(String,String)
Jako další příklad spuštění fragmentu kódu metody definujte metodu hello(String str1, String str2) s návratovým typem String[] .
[17]-> String[] hello(String str1, String str2){ return new String[]{str1,str2}; } | created method hello(String,String)
Vyvoláním metody se dvěma argumenty vrátíte pole.
[18]-> hello("John","Michael") | $39 ==> String[2] { "John", "Michael" }
Přetížení metody
Metoda může být přetížena stejně jako v aplikaci Java. Deklarujte metodu hello(String s) .
[1]-> String hello(String s){ return "Hello " + s; } | created method hello(String)
Vyvolejte metodu pro výstup zprávy.
[2]-> hello("John") | $1 ==> "Hello John"
Deklarujte jinou metodu hello(String,String) .
[3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Vyvolejte metodu pro výstup zprávy.
[5]-> hello("Hello"," John") | $16 ==> "Hello John"
Předchozí odkaz na metodu
JShell podporuje předávání odkazů na metodu. Předchozí reference vyvolá metodu, která ještě nebyla definována. Deklarujte metodu main(String) což vytváří odkaz na metodu hello(String) , která dosud nebyla definována. Metoda main(String) se vytvoří, ale nelze jej vyvolat, dokud metoda hello(String) je definováno.
[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
Vyvolejte metodu main(String) a výstupem je zpráva, která značí, že ji nelze vyvolat.
[2]-> main("Michael") | attempted to call method main(String) which cannot be invoked | until method hello(java.lang.String) is declared
Deklarujte metodu hello(String) na který odkazuje main(String) .
[3]-> String hello(String name){ return name; } | created method hello(String)
Následně vyvolejte metodu main(String) znovu a bude vyvolán.
[4]-> main("Michael") | $1 ==> "Hello Michael"
";" je přidána implicitně, pokud není přidána do deklarací proměnných nejvyšší úrovně a deklarací metod, které se přidávají po jedné na řádek. Ale ";" není implicitní v příkazech v rámci metody. Jako příklad deklarujte následující metodu a zobrazí se chyba.
[1]-> int average(int i,int j){ return (i+j)/2 } | Error: | ';' expected
Metody výpisů
Metody definované v dané relaci JShell jsou uvedeny s /methods příkaz. Pro demonstraci definujte několik metod.
[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)
Spusťte /methods a všechny přidané metody se zobrazí.
[5]-> /methods | printf (String,Object...)void | triple (int)int | hello (String)String | hello (String,String)String | average (int,int)int [5]->
Modifikátory nejsou povoleny v deklaracích metod nejvyšší úrovně
Zatímco modifikátory public , soukromé a chráněno v deklaraci metody nejvyšší úrovně jsou ignorovány a definice metody je vytvořena implicitně s veřejným přístupem, některé další modifikátory nejsou ignorovány a nejsou povoleny v deklaraci metody nejvyšší úrovně. Tyto modifikátory nejsou povoleny na nejvyšší úrovni, protože mají význam v určitém kontextu a nejsou vhodné v kontextu JShell, který slouží k testování úryvků kódu.
Modifikátor static má význam při použití s metodou v kontextu třídy nebo rozhraní, ale ne na nejvyšší úrovni. Jako příklad spusťte následující deklaraci metody, která obsahuje static .
[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)
statické modifikátor je ignorován, vydá se varování, ale vytvoří se metoda. Metodu lze vyvolat.
[2]-> hello("John") | $1 ==> "Hello John" [3]->
Podobně modifikátor final nemá význam na nejvyšší úrovni, ať už v deklaraci metody nebo jakékoli jiné deklaraci, protože JShell je navržen tak, aby dynamicky spouštěl úryvky kódu a deklaroval metodu (nebo proměnnou nebo třídu) final by úryvek učinil nemodifikovatelným. Jako příklad přidejte finální modifikátor metody. konečné modifikátor je ignorován, je vygenerováno varování a definice metody je vytvořena bez final .
[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)
Vyvolejte metodu a vypíše výsledek.
[3]-> triple(5) | $1 ==> 15 [4]->
Některé další modifikátory také nejsou povoleny na nejvyšší úrovni, ať už v metodě nebo jakékoli jiné deklaraci. Zatímco modifikátory statické a konečný jsou ignorovány a je vytvořena definice metody, modifikátory abstract a nativní v metodě nejvyšší úrovně vygeneruje chybu a metoda se nevytvoří.
[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){ | ^----^
Modifikátory výchozí a synchronizováno v deklaraci metody nejvyšší úrovně nebo v jakékoli jiné deklaraci také nejsou povoleny a generují chybu.
Závěr
V tomto článku jsme diskutovali o spouštění úryvků kódu pro metody Java v JShell. V následujícím článku probereme spouštění úryvků kódu pro třídy Java, rozhraní a pole.