JShell er et kommandolinjeværktøj til at køre kodestykker i et shellmiljø uden at skulle kompilere og køre et komplet program. JShell er en ny funktion i Java 9. JShell kan bruges til at teste og fejlsøge kodestykker, når man udvikler en applikation. JShell-input skal være i form af et komplet kodestykke. Vi introducerede JShell med to artikler, "Using JShell in Java 9 in NetBeans 9.0, Part 1," og "Using JShell in Java 9 in NetBeans 9.0, Part 2", hvor vi diskuterede at køre importen sætning, erklære og bruge variabler, sammenligne String s, og løbende erklæringer. I denne fortsættelsesartikel skal vi køre uddrag til Java-metoder. Denne artikel har følgende sektioner:
- Indstilling af miljøet
- Brug af metoder
- Ændring af en metodedefinition
- Metodeoverbelastning
- Foretag en videresend reference til en metode
- Angivelsesmetoder
- Modifiers ikke tilladt i metodeerklæringer på øverste niveau
- Konklusion
Indstilling af miljøet
Download og installer NetBeans, som diskuteret i en tidligere artikel. Start JShell ved at vælge Værktøjer>Åbn Java Platform Shell , som vist i figur 1.
Figur 1: Værktøjer>Åbn Java Platform Shell
Brug af metoder
En metode er deklareret i JShell, ligesom det er i en Java-applikation, med nogle få forskelle, som også diskuteres i dette afsnit. Som et eksempel, erklær en metode triple(int) der tager en int argument og returnerer en int værdi.
int triple(int i) { return i*3; }
Kør kodestykket i JShell, og en metode bliver oprettet.
[10]-> int triple(int i) { return i*3; } | created method triple(int)
Kald metoden triple med en int værdi som arg.
triple(1)
Argumentværdien tredobles og returneres.
[11]-> triple(1) | $13 ==> 3 [12]->
Metoden har en returtype og parametre, men ingen adgangsmodifikator såsom offentlig , privat , eller beskyttet . Det skyldes, at en metodedeklaration på topniveau, som alle deklarationer på topniveau, implicit er offentlig. Enhver adgangsmodifikator i en metodeerklæring på øverste niveau ignoreres. Alle de følgende metodeerklæringer svarer til den foregående metodeerklæring.
[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 viser kompileringstidsfejl, hvis nogen. Gør som et eksempel metodens returtype tredobbelt som streng og en fejlmeddelelse vises.
[10]-> String triple(int i) { return i*3; } | Error: | incompatible types: int cannot be converted to java.lang.String | return i*3; | ^-^
Ændring af en metodedefinition
En outputmeddelelse, der ikke ville blive genereret af en Java-applikation og opført to gange allerede i dette afsnit, er "erstattet metode...". Meddelelsen angiver, at en metodedefinition er blevet ændret. Bestemmelsen om at erstatte/ændre en metodedeklaration og andre deklarationer er for at lette testning.
For at ændre eller erstatte en metode uden at definere en ny metode, må metodesignaturen, som er sat af metodenavnet og metodeparametrene inklusive antallet af parametre og deres type og rækkefølge, ikke ændres. Som et eksempel, erklær en metode hej med returtype void og en streng type parameter.
[4]-> void hello(String s){ } | created method hello(String)
Dernæst erklærer du den samme metode hej med returtype String , en streng type-parameter og en returerklæring. Den tidligere metodeerklæring for hej bliver erstattet.
[5]-> String hello(String s){ return "Hello " + s; } | replaced method hello(String) [6]->
Kald metoden hello(String) og den anden metodedefinition påkaldes for at udsende en "Hej John"-meddelelse.
[6]-> hello("John") | $5 ==> "Hello John" [7]->
Metodeargumenterne er sammenkædet i metodekald, hvis det er nødvendigt, som i det følgende uddrag.
[7]-> hello("John"+" & "+"Johnny") | $22 ==> "Hello John & Johnny" [8]->
I det foregående eksempel på ændring af en metode erstattede vi returtypen void med streng . Returnering skal ikke ændres for at erstatte en metode. Som et eksempel kan du definere en metode hej som følger.
[15]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Derefter skal du kun ændre return udmelding. Metoden hello(String,String) bliver erstattet.
[16]-> String hello(String str1, String str2){ return "Hello"+str1+str2; } | replaced method hello(String,String)
Som et andet eksempel på at køre et metodekodestykke, skal du definere en metode hello(String str1, String str2) med returtype String[] .
[17]-> String[] hello(String str1, String str2){ return new String[]{str1,str2}; } | created method hello(String,String)
Kald metoden med to argumenter for at returnere et array.
[18]-> hello("John","Michael") | $39 ==> String[2] { "John", "Michael" }
Metodeoverbelastning
En metode kan være overbelastet ligesom i en Java-applikation. Erklær en metode hello(String s) .
[1]-> String hello(String s){ return "Hello " + s; } | created method hello(String)
Kald metoden til at udsende en besked.
[2]-> hello("John") | $1 ==> "Hello John"
Erklær en anden metode hello(String,String) .
[3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Kald metoden til at udsende en besked.
[5]-> hello("Hello"," John") | $16 ==> "Hello John"
Foretag en videresend reference til en metode
JShell understøtter fremsendelse af referencer til en metode. En fremsende reference påberåber sig en metode, der endnu ikke er defineret. Erklære en metode main(String) der henviser til en metode hello(String) , som endnu ikke er defineret. Metoden main(String) bliver oprettet, men den kan ikke aktiveres før metoden hello(String) er defineret.
[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
Kald metode main(String) og en meddelelse udlæses, hvilket indikerer, at den ikke kan påkaldes.
[2]-> main("Michael") | attempted to call method main(String) which cannot be invoked | until method hello(java.lang.String) is declared
Erklær metoden hello(String) der henvises til af main(String) .
[3]-> String hello(String name){ return name; } | created method hello(String)
Kald derefter metoden main(String) igen, og den bliver påkaldt.
[4]-> main("Michael") | $1 ==> "Hello Michael"
Det ";" tilføjes implicit, hvis det ikke tilføjes i variabeldeklarationer på øverste niveau og metodeerklæringer, der tilføjes én pr. linje. Men ";" er ikke implicit i udsagn inden for en metode. Som et eksempel, erklær følgende metode, og en fejl bliver output.
[1]-> int average(int i,int j){ return (i+j)/2 } | Error: | ';' expected
Optegnelsesmetoder
Metoder defineret i en given JShell-session er angivet med /methods kommando. For at demonstrere skal du definere nogle få metoder.
[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)
Kør /methods kommando, og alle de tilføjede metoder vises.
[5]-> /methods | printf (String,Object...)void | triple (int)int | hello (String)String | hello (String,String)String | average (int,int)int [5]->
Modifiers ikke tilladt i metodeerklæringer på øverste niveau
Hvorimod modifikatorer offentlige , privat , og beskyttet i metodedeklarationer på øverste niveau ignoreres, og en metodedefinition oprettes implicit med offentlig adgang, visse andre modifikatorer ignoreres ikke og er ikke tilladt i en metodeerklæring på øverste niveau. Disse modifikatorer er ikke tilladt på topniveau, fordi disse har betydning inden for en bestemt kontekst og ikke egnede i sammenhæng med JShell, som er at teste kodestykker.
Modifikatoren statisk har betydning, når den bruges med en metode i sammenhæng med en klasse eller en grænseflade, men ikke på topniveau. Kør som et eksempel følgende metodeerklæring, der inkluderer statisk .
[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)
Den statiske modifikator ignoreres, en advarsel udsendes, men en metode bliver oprettet. Metoden kan påberåbes.
[2]-> hello("John") | $1 ==> "Hello John" [3]->
Tilsvarende ændres final har ikke betydning på det øverste niveau, hverken i en metodedeklaration eller en anden erklæring, fordi JShell er designet til at køre kodestykker dynamisk og erklære en metode (eller variabel eller klasse) final ville gøre uddraget uændret. Som et eksempel kan du tilføje finalen modifikator til en metode. finalen modifikator ignoreres, en advarsel genereres, og metodedefinitionen oprettes uden 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)
Kald metoden og den udsender et resultat.
[3]-> triple(5) | $1 ==> 15 [4]->
Nogle andre modifikatorer er heller ikke tilladt på topniveau, hvad enten det er i en metode eller en anden erklæring. Hvorimod modifikatorer statiske og endelig ignoreres og en metodedefinition oprettes, modifikatorer abstrakt og native i en metode på øverste niveau generere en fejl, og en metode bliver ikke oprettet.
[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){ | ^----^
Modifikatorer standard og synkroniseret i en metodedeklaration på øverste niveau eller enhver anden erklæring er heller ikke tilladt og genererer en fejl.
Konklusion
I denne artikel diskuterede vi at køre kodestykker til Java-metoder i JShell. I en efterfølgende artikel vil vi diskutere kørende kodestykker til Java-klasser, grænseflader og arrays.