JShell là một công cụ dòng lệnh để chạy các đoạn mã trong môi trường shell mà không cần phải biên dịch và chạy một ứng dụng hoàn chỉnh. JShell là một tính năng mới trong Java 9. JShell có thể được sử dụng để kiểm tra và gỡ lỗi các đoạn mã khi phát triển một ứng dụng. Đầu vào JShell phải ở dạng một đoạn mã hoàn chỉnh. Chúng tôi đã giới thiệu JShell với hai bài viết, “Sử dụng JShell trong Java 9 trong NetBeans 9.0, Phần 1” và “Sử dụng JShell trong Java 9 trong NetBeans 9.0, Phần 2”, trong đó chúng ta đã thảo luận về việc chạy import câu lệnh, khai báo và sử dụng biến, so sánh Chuỗi s và các câu lệnh đang chạy. Trong phần tiếp theo này, chúng ta sẽ chạy các đoạn mã cho các phương thức Java. Bài viết này có các phần sau:
- Thiết lập Môi trường
- Sử dụng các phương pháp
- Sửa đổi Định nghĩa Phương pháp
- Quá tải phương thức
- Tạo tham chiếu chuyển tiếp đến một phương pháp
- Phương pháp liệt kê
- Công cụ sửa đổi không được phép trong khai báo phương thức cấp cao nhất
- Kết luận
Thiết lập Môi trường
Tải xuống và cài đặt NetBeans, như đã thảo luận trong một bài viết trước. Khởi chạy JShell bằng cách chọn Công cụ> Mở Java Platform Shell , như trong Hình 1.
Hình 1: Công cụ> Mở Java Platform Shell
Sử dụng các phương pháp
A phương pháp được khai báo trong JShell giống như trong ứng dụng Java, với một vài điểm khác biệt, cũng được thảo luận trong phần này. Ví dụ, khai báo một phương thức triple (int) chiếm một int đối số và trả về một int giá trị.
int triple(int i) { return i*3; }
Chạy đoạn mã trong JShell và một phương thức được tạo.
[10]-> int triple(int i) { return i*3; } | created method triple(int)
Gọi phương thức triple với một int giá trị như đối số.
triple(1)
Giá trị đối số được tăng gấp ba lần và được trả về.
[11]-> triple(1) | $13 ==> 3 [12]->
Phương thức có kiểu trả về và các tham số nhưng không có công cụ sửa đổi quyền truy cập, chẳng hạn như public , riêng tư hoặc được bảo vệ . Đó là bởi vì một khai báo phương thức cấp cao nhất, như tất cả các khai báo cấp cao nhất, là hoàn toàn công khai. Bất kỳ công cụ sửa đổi quyền truy cập nào trong khai báo phương thức cấp cao nhất đều bị bỏ qua. Tất cả các khai báo phương thức sau đều tương đương với khai báo phương thức trước.
[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 hiển thị lỗi thời gian biên dịch, nếu có. Ví dụ, hãy tạo kiểu trả về của phương thức gấp ba lần dưới dạng Chuỗi và một thông báo lỗi được hiển thị.
[10]-> String triple(int i) { return i*3; } | Error: | incompatible types: int cannot be converted to java.lang.String | return i*3; | ^-^
Sửa đổi định nghĩa phương pháp
Một thông báo đầu ra sẽ không được tạo bởi ứng dụng Java và được liệt kê hai lần trong phần này là “phương thức thay thế…”. Thông báo cho biết rằng định nghĩa phương thức đã được sửa đổi. Điều khoản thay thế / sửa đổi khai báo phương pháp và các khai báo khác là để tạo điều kiện thuận lợi cho việc thử nghiệm.
Để sửa đổi hoặc thay thế một phương thức mà không xác định phương thức mới, không được sửa đổi chữ ký phương thức, được đặt bởi tên phương thức và các tham số phương thức bao gồm số lượng tham số, kiểu và thứ tự của chúng. Ví dụ, khai báo một phương thức hello với kiểu trả về void và một Chuỗi tham số kiểu.
[4]-> void hello(String s){ } | created method hello(String)
Tiếp theo, khai báo cùng một phương thức xin chào với kiểu trả về Chuỗi , một Chuỗi tham số kiểu và một câu lệnh trả về. Khai báo phương thức trước cho hello được thay thế.
[5]-> String hello(String s){ return "Hello " + s; } | replaced method hello(String) [6]->
Gọi phương thức hello (String) và định nghĩa phương thức thứ hai được gọi để xuất ra thông báo “Xin chào John”.
[6]-> hello("John") | $5 ==> "Hello John" [7]->
Các đối số phương thức được nối trong lệnh gọi phương thức, nếu cần, như trong đoạn mã sau.
[7]-> hello("John"+" & "+"Johnny") | $22 ==> "Hello John & Johnny" [8]->
Trong ví dụ trước về việc sửa đổi một phương thức, chúng tôi đã thay thế kiểu trả về void với String . Return không phải được sửa đổi để thay thế một phương thức. Ví dụ, hãy xác định một phương thức hello như sau.
[15]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Tiếp theo, chỉ sửa đổi return tuyên bố. Phương thức hello (Chuỗi, Chuỗi) được thay thế.
[16]-> String hello(String str1, String str2){ return "Hello"+str1+str2; } | replaced method hello(String,String)
Là một ví dụ khác về việc chạy đoạn mã phương thức, hãy xác định phương thức hello (Chuỗi str1, Chuỗi str2) với kiểu trả về String [] .
[17]-> String[] hello(String str1, String str2){ return new String[]{str1,str2}; } | created method hello(String,String)
Gọi phương thức có hai đối số để trả về một mảng.
[18]-> hello("John","Michael") | $39 ==> String[2] { "John", "Michael" }
Nạp chồng phương thức
Một phương thức có thể bị quá tải giống như trong một ứng dụng Java. Khai báo một phương thức hello (String s) .
[1]-> String hello(String s){ return "Hello " + s; } | created method hello(String)
Gọi phương thức để xuất một thông báo.
[2]-> hello("John") | $1 ==> "Hello John"
Khai báo một phương thức khác hello (String, String) .
[3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
Gọi phương thức để xuất một thông báo.
[5]-> hello("Hello"," John") | $16 ==> "Hello John"
Tạo tham chiếu chuyển tiếp đến một phương pháp
JShell hỗ trợ tạo các tham chiếu chuyển tiếp đến một phương thức. Đ tham chiếu chuyển tiếp gọi một phương thức chưa được xác định. Khai báo một phương thức main (String) tham chiếu đến một phương thức hello (String) , vẫn chưa được xác định. Phương thức main (Chuỗi) được tạo nhưng nó không thể được gọi cho đến khi phương thức hello (String) được xác định.
[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
Gọi phương thức main (Chuỗi) và một thông báo được xuất ra, cho biết rằng nó không thể được gọi.
[2]-> main("Michael") | attempted to call method main(String) which cannot be invoked | until method hello(java.lang.String) is declared
Khai báo phương thức hello (String) được tham chiếu bởi main (String) .
[3]-> String hello(String name){ return name; } | created method hello(String)
Sau đó, gọi phương thức main (String) một lần nữa và nó được gọi.
[4]-> main("Michael") | $1 ==> "Hello Michael"
Các ";" được thêm ngầm nếu không được thêm vào trong khai báo biến cấp cao nhất và khai báo phương thức được thêm một trên mỗi dòng. Nhưng ";" không ẩn trong các câu lệnh trong một phương thức. Ví dụ:khai báo phương thức sau và lỗi sẽ xuất hiện.
[1]-> int average(int i,int j){ return (i+j)/2 } | Error: | ';' expected
Phương pháp liệt kê
Các phương thức được xác định trong một phiên JShell nhất định được liệt kê với các / method yêu cầu. Để chứng minh, hãy xác định một vài phương pháp.
[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)
Chạy / method và tất cả các phương thức được thêm vào sẽ được liệt kê.
[5]-> /methods | printf (String,Object...)void | triple (int)int | hello (String)String | hello (String,String)String | average (int,int)int [5]->
Công cụ sửa đổi không được phép trong khai báo phương thức cấp cao nhất
Trong khi các công cụ sửa đổi công khai , riêng tư và được bảo vệ trong khai báo phương thức cấp cao nhất bị bỏ qua và định nghĩa phương thức được tạo ngầm với quyền truy cập công khai, một số công cụ sửa đổi khác không bị bỏ qua và không được phép trong khai báo phương thức cấp cao nhất. Các công cụ sửa đổi này không được phép ở cấp cao nhất vì chúng có ý nghĩa trong một ngữ cảnh nhất định và không phù hợp trong ngữ cảnh của JShell, tức là để kiểm tra các đoạn mã.
Công cụ sửa đổi static có ý nghĩa khi được sử dụng với một phương thức trong ngữ cảnh của một lớp hoặc một giao diện, nhưng không phải ở cấp cao nhất. Ví dụ:chạy khai báo phương thức sau bao gồm 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)
static sửa đổi bị bỏ qua, một Cảnh báo được xuất ra, nhưng một phương thức được tạo. Phương thức có thể được gọi.
[2]-> hello("John") | $1 ==> "Hello John" [3]->
Tương tự, công cụ sửa đổi final không có ý nghĩa ở cấp cao nhất, cho dù trong khai báo phương thức hay bất kỳ khai báo nào khác, vì JShell được thiết kế để chạy các đoạn mã động và khai báo một phương thức (hoặc biến hoặc lớp) final sẽ làm cho đoạn mã không thể sửa đổi. Ví dụ, thêm cuối cùng bổ ngữ cho một phương thức. cuối cùng công cụ sửa đổi bị bỏ qua, Cảnh báo được tạo và định nghĩa phương thức được tạo mà không có cuối cùng .
[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)
Gọi phương thức và nó xuất ra một kết quả.
[3]-> triple(5) | $1 ==> 15 [4]->
Một số sửa đổi khác cũng không được phép ở cấp cao nhất, cho dù trong một phương thức hay bất kỳ khai báo nào khác. Trong khi các công cụ sửa đổi static và cuối cùng bị bỏ qua và định nghĩa phương thức được tạo, bổ ngữ abstract và gốc trong một phương thức cấp cao nhất tạo ra một lỗi và một phương thức không được tạo.
[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){ | ^----^
Công cụ sửa đổi mặc định và được đồng bộ hóa trong khai báo phương thức cấp cao nhất hoặc bất kỳ khai báo nào khác cũng không được phép và tạo ra lỗi.
Kết luận
Trong bài viết này, chúng tôi đã thảo luận về việc chạy các đoạn mã cho các phương thức Java trong JShell. Trong bài viết tiếp theo, chúng ta sẽ thảo luận về việc chạy các đoạn mã cho các lớp, giao diện và mảng Java.