sql >> Databáze >  >> RDS >> Database

Použití JShell v Javě 9 v NetBeans 9.0, část 3

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.


  1. Zploštění protínajících se časových úseků

  2. Geniální nástroj pro změnu hesla SQL pro resetování hesla SQL

  3. Volání uložené procedury s parametrem s hodnotou tabulky z javy

  4. ORA-01097