Định nghĩa một giao diện Hiện thực một giao diện Sử dụng giao diện như là một kiểu dữ liệu Định nghĩa gói Tạo và sử dụng các gói Vai trò của các gói trong việc điều khiển truy cập Những đặc trưng của gói java.lang Những đặc trưng của góiĐịnh nghĩa một giao diện Hiện thực một giao diện Sử dụng giao diện như là một kiểu dữ liệu Định nghĩa gói Tạo và sử dụng các gói Vai trò của các gói trong việc điều khiển truy cập Những đặc trưng của gói java.lang Những đặc trưng của góiĐịnh nghĩa một giao diện Hiện thực một giao diện Sử dụng giao diện như là một kiểu dữ liệu Định nghĩa gói Tạo và sử dụng các gói Vai trò của các gói trong việc điều khiển truy cập Những đặc trưng của gói java.lang Những đặc trưng của gói
Chương 4: CÁC GÓI & GIAO DIỆN Mục tiêu học Kết thúc chương này, bạn học viên có thể: Định nghĩa giao diện Hiện thực giao diện Sử dụng giao diện kiểu liệu Định nghĩa gói Tạo sử dụng gói Vai trò gói việc điều khiển truy cập Những đặc trưng gói java.lang Những đặc trưng gói java.util 4.1 Giới thiệu Gói giao diện hai thành phần chương trình Java Các gói lưu trữ theo kiểu phân cấp, nhập (import) cách tường minh vào lớp định nghĩa Các giao diện sử dụng để định tập phương thức Các phương thức thực hay nhiều lớp Một tập tin nguồn Java chứa tất bốn phần nội sau đây: Một câu lệnh khai báo gói (package) Những câu lệnh nhập thêm gói lớp khác vào chương trình (import) Một khai báo lớp cơng cộng (public) đơn Một số lớp dạng riêng tư (private) gói Một tập tin nguồn Java có khai báo lớp public đơn Tất phát biểu khác tuỳ chọn Chương trình viết dòng gói với lệnh nhập (import), lớp (class) 4.2 Các giao diện Giao diện khái niệm quan trọng ngôn ngữ Java Nó cho phép lớp có nhiều lớp cha (superclass) Các chương trình Java thừa kế lớp thời điểm, thực hàng loạt giao diện Giao diện sử dụng để thay lớp trừu tượng, nơi mà thực thi kế thừa Giao diện tương tự lớp trừu tượng Sự khác chỗ lớp trừu tượng có hành vi cụ thể, giao diện khơng thể có phương thức cụ thể có hành vi của riêng Các giao diện cần thực Một lớp trừu tượng mở rộng, khơng thể mơ tả ví dụ minh hoạ cụ thể Các bước để tạo giao diện liệt kê đây: 33 Core Java Định nghĩa giao diện: Một giao diện định nghĩa sau: Chương trình 4.1 //Giao diện với phương thức public interface myinterface { public void add(int x,int y); public void volume(int x,int y,int z); } //Giao diện để định nghĩa public interface myconstants { public static final double price=1450.00; public static final int counter=5; } Chương trình dịch sau: javac myinterface.java Một giao diện thực với từ khoá “implements” Trong trường hợp trên, giao diện cho phép ứng dụng mối quan hệ “is a” Ví dụ: class demo implements myinterface Nếu nhiều giao diện thực thi, tên ngăn cách với dấu phẩy Điều trình bày sau: class Demo implements MyCalc, Mycount Hãy ghi nhớ lưu ý sau tạo giao diện: Tất phương thức giao diện phải kiểu public Các phương thức định nghĩa lớp mà lớp thực giao diện 4.2.1 Hiện thực giao diện Các giao diện mở rộng (extend) lớp, chúng mở rộng giao diện khác Nếu bạn thực giao diện mà làm mở rộng nó, bạn cần ghi đè (override) phương thức giao diện cách hợp lý giao diện cũ Trong ví dụ trên, phương thức khai báo, mà không định nghĩa Các phương thức phải định nghĩa lớp mà lớp thực giao diện Nói cách khác, bạn cần hành vi phương thức Tất phương thức giao diện phải kiểu public Bạn không sử dụng bổ ngữ (modifers) chuẩn khác protected, private…, khai báo phương thức giao diện Đoạn mã Chương trình 4.2 biểu diễn giao diện thực thi nào: Chương trình 4.2 import java.io.*; Các Gói & Giao Diện 34 class Demo implements myinterface { public void add(int x,int y) { System.out.println(“ “+(x+y)); //Giả sử phương thức add khai báo giao diện } public void volume(int x,int y,int z) { System.out.println(“ “+(x*y*z)); //Giả sử phương thức volume khai báo giao diện } public static void main(String args[]) { Demo d=new Demo(); d.add(10,20); d.volume(10,10,10); } } Khi bạn định nghĩa giao diện mới, có nghĩa bạn định nghĩa kiểu tham chiếu liệu Bạn sử dụng tên giao diện nơi đâu tên kiểu liệu khác Chỉ có thể (instance) lớp mà lớp thực thi giao diện gán đến biến tham chiếu Kiểu biến tham chiếu tên giao diện 4.3 Các gói Gói coi thư mục, nơi bạn tổ chức lớp giao diện bạn Các chương trình Java tổ chức tập gói Mỗi gói gồm có nhiều lớp, và/hoặc giao diện coi thành viên Đó phương án thuận lợi để lưu trữ nhóm lớp có liên quan với tên đặc biệt Khi bạn làm việc với chương trình ứng dụng, bạn tạo số lớp Các lớp cần tổ chức cách hợp lý Điều dễ dàng để tổ chức tập tin lớp thành gói khác Hãy tưởng tượng gói giống thư mục Tất điều mà bạn cần làm đặt lớp giao diện có liên quan với vào thư mục riêng, với tên phản ánh mục đích lớp Nói tóm lại, gói có ích cho mục đích sau: Chúng cho phép bạn tổ chức lớp thành đơn vị nhỏ (như thư mục), làm cho việc xác định vị trí trở nên dễ dàng sử dụng tập tin lớp cách phù hợp 35 Core Java Giúp đỡ để tránh cho việc đặt tên bị xung đột (trùng lặp định danh) Khi bạn làm việc với số lớp bạn cảm thấy khó để định đặt tên cho lớp phương thức Đôi lúc bạn muốn sử dụng tên giống mà tên liên quan đến lớp khác Các gói giấu lớp để tránh việc đặt tên bị xung đột Các gói cho phép bạn bảo vệ lớp, liệu phương thức mức rộng tảng class-to-class Các tên gói sử dụng để nhận dạng lớp Các gói chứa gói khác Để tạo lớp thành viên gói, bạn cần bắt đầu mã nguồn bạn với khai báo gói, sau: package mypackage; Hãy ghi nhớ điểm sau tạo gói: Đoạn mã phải bắt đầu với phát biểu “package” Điều nói lên lớp định nghĩa tập tin phần gói xác định Mã nguồn phải nằm thư mục, mà thư mục lại tên gói bạn Quy ước rằng, tên gói bắt đầu chữ thường để phân biệt lớp gói Các phát biểu khác xuất sau khai báo gói câu lệnh nhập, sau chúng bạn bắt đầu định nghĩa lớp bạn Tương tự tất tập tin khác, lớp gói cần biên dịch Để cho chương trình Java bạn có khả sử dụng gói đó, nhập (import) chúng vào mã nguồn bạn Sự khai báo sau hợp lệ không hợp lệ : Hợp lệ package mypackage; import java.io.*; Không hợp lệ import java.io.*; package mypackage; Bạn có tuỳ chọn sau nhập vào gói: Bạn nhập vào tập tin cụ thể từ gói: import java.mypackage.calculate Bạn nhập (import) tồn gói: import java.mypackage.*; Máy ảo Java (JVM) phải giữ lại track (rãnh ghi) tất phần tử hữu gói mà khai báo Các Gói & Giao Diện 36 Bạn sẵn sàng làm việc với phát biểu nhập import – java.io.* Bản thân Java cài đặt sẵn tập gói, bảng đề cập đến vài gói có sẵn Java: Gói Mơ tả java.lang Khơng cần phải khai báo cách rõ ràng Gói ln nhập cho bạn java.io Bao gồm lớp để trợ giúp cho bạn tất thao tác nhập xuất java.applet Bao gồm lớp để bạn cần thực thi applet trình duyệt java.awt Hữu dụng để tạo nên ứng dụng giao diện đồ hoạ (GUI) java.util Cung cấp nhiều lớp nhiều giao diện khác để tạo nên ứng dụng, applet, cấu trúc liệu, lịch biểu, ngày tháng, v.v java.net Cung cấp lớp giao diện cho việc lập trình mạng TCP/IP Bảng 4.1 Các gói Java Bên cạnh đó, Java cung cấp thêm nhiều gói để phát triển ứng dụng applet bạn Nếu bạn không khai báo gói đoạn mã bạn, lớp giao diện bạn sau kết thúc nằm gói mặc định mà khơng có tên Thơng thường, gói mặc định có ý nghĩa cho ứng dụng nhỏ ứng dụng tạm thời, ứng dụng mà bạn vừa bắt đầu để phát triển sau Khi bạn bắt đầu việc phát triển cho ứng dụng lớn, bạn có khuynh hướng phát triển số lớp Bạn cần tổ chức lớp thư mục khác để dễ dàng truy cập vận dụng Để làm điều này, bạn phải đặt chúng vào gói đặt tên Phần lớn việc làm với gói bạn có đặc quyền để sử dụng tên lớp giống nhau, bạn phải đặt chúng vào gói khác 4.3.1 Tạo gói Gói phương thức hữu dụng để nhóm lớp mà tránh tên trùng Các lớp với tên giống đặt vào gói khác Các lớp định nghĩa người sử dụng nhó lại gói Các bước sau cho phép tạo nên gói người dùng định nghĩa: Khai báo gói cách sử dụng cú pháp thích hợp Đoạn mã phải bắt đầu với khai báo gói Điều lớp định nghĩa tập tin phần gói xác định package mypackage; Sử dụng phát biểu import để nhập gói chuẩn theo yêu cầu import java.util.*; Khai báo định nghĩa lớp nằm gói Tất thành phần gói public, để truy cập từ bên Máy ảo Java (JVM) giữ lại track (rãnh ghi) tất phần tử nằm gói 37 Core Java package mypackage; //khai báo gói import java.util.*; public class Calculate //định nghĩa lớp { int var; Calculate(int n) { … var = n; //các phương thức //… public class Display //định nghĩa lớp { …//Các phương thức } } } Lưu định nghĩa tập tin với phần mở rộng java, dịch lớp định nghĩa gói Việc dịch thực với chức “-d” Chức tạo thư mục trùng với tên gói, đặt tập tin class vào thư mục rõ javac –d d:\temp Calculate.java Nếu khai báo gói khơng có chương trình, lớp giao diện kết thúc gói mặc định mà khơng có tên.Nói chung, gói mặc định có nghĩa cho ứng dụng nhỏ tạm thời Hãy ghi nhớ điểm sau bạn khai thác gói người dùng định nghĩa chương trình khác: Mã nguồn chương trình phải tồn thư mục với gói định nghĩa người sử dụng Để cho chương trình Java khác sử dụng gói đó, khai báo chúng vào đoạn mã nguồn Để nhập lớp ta dùng: import java.mypackage.Calculate; Để nhập tồn gói, ta làm sau: import java.mypackage.*; Tạo tham chiếu đến thành phần gói Ta dùng đoạn mã đơn giản sau: import java.io.*; Các Gói & Giao Diện 38 import mypackage.Calculate; class PackageDemo{ public static void main(String args[]){ Calculate calc = new Calculate(); } } Nếu phát biểu import cho gói khơng sử dụng, tên lớp phải đượcsử dụng với tên gói cho phù hợp với phương thức lớp Cú pháp sau: mypackage.Calculate calc = new mypackage.Calculate(); 4.3.2 Thiết lập đường dẫn cho lớp (classpath) Chương trình dịch chương trình thơng dịch tìm kiếm lớp thư mục hành, tập tin nén (zip) chứa tập tin class JDK Điều có nghĩa tập tin class JDK thư mục nguồn tự động thiết lập classpath cho bạn.Tuy nhiên, vài trường hợp, bạn cần phải tự thiết lập classpath cho bạn Classpath danh sách thư mục, danh sách trợ giúp để tìm kiếm tập tin class tương ứng Thông thường, ta không nên thiết lập môi trường classpath thời gian dài Nó thích hợp thiết lập CLASSPATH để chạy chương trình, ta thiết lập đường dẫn cho việc thực thi thời javac –classpath c:\temp Packagedemo.java Thứ tự mục classpath quan trọng Khi bạn thực thi đoạn mã bạn, mày ảo Java tìm kiếm mục classpath bạn giống thứ tự đề cập, tìm thấy lớp cần tìm Ví dụ gói Chương trình 4.3 Package mypackage; Public class calculate { public double volume(double height, double width,double depth) { return (height*width*depth); } public int add(int x,int y) { return (x+y); } public int divide(int x,int y) { 39 Core Java return (x/y); } } Để sử dụng gói này, bạn cần phải: Khai báo lớp sử dụng Khai báo tồn gói Đề cập đến thành phần gói Bạn cần dịch tập tin Nó dịch với tuỳ chọn –d, nhờ đó, tạo thư mục với tên gói đặt tập tin class vào thư mục javac –d c:\temp calculate.java Chương trình biên dịch tạo thư mục gọi “mypackage” thư mục temp, lưu trữ tập tin calculate.class vào thư mục Ví dụ sau biểu diễn cách sử dụng gói: Chương trình 4.4 import java.io.*; import mypackage.calculate; Class PackageDemo{ public static void main(String args[]){ Calculate calc = new calculate(); int sum = calc.add(10,20); double vol = calc.volume(10.3f,13.2f,32.32f); int div = calc.divide(20,4); System.out.println(“The addition is: ”+sum); System.out.println(“The Volume is: ”+vol); System.out.println(“The division is: ”+sum); } } Nếu bạn sử dụng lớp từ gói khác, mà khơng sử dụng khai báo import cho gói đó, đó, bạn cần phải sử dụng tên lớp với tên gói Mypackage.calculate calc = new mypackage.calculate( ); 4.4 Gói điều khiển truy xuất Các gói chứa lớp gói Các lớp chứa liệu đoạn mã Java cung cấp nhiều mức độ truy cập thơng qua lớp, gói định truy cập Bảng sau tóm tắt quyền truy cập thành phần lớp: public Các Gói & Giao Diện protecte No modifier private 40 d Same class Yes Yes Yes Yes Same packages Yes subclass Yes Yes No Same package Yes non-subclass Yes Yes No Different package Yes subclass Yes No No Different package Yes non-subclass No No No Bảng 4.2: Truy cập đến thành phần lớp 4.5 Gói java.lang Theo mặc định, chương trình java nhập gói java.lang Vì thế, khơng cần phải khai báo cách rõ ràng gói java.lang chương trình Lớp trình bao bọc (wrapper class) Các kiểu liệu ngun thủy khơng phải đối tượng Vì thế, chúng khơng thể tạo hay truy cập phương thức Để tạo hay vận dụng kiểu liệu nguyên thuỷ,ta sử dụng “wrap” tương ứng với “wrapper class” Bảng sau liệt kê lớp trình bao bọc (wrapper) Các phương thức lớp có phần phụ lục Kiểu liệu Lớp bọc trình boolean Boolean byte Byte char Character double Double float Float int Integer long Long short Short bao Bảng 4.3: Các lớp trình bao bọc cho kiểu liệu nguyên thuỷ Ví dụ vài phương thức lớp wrapper: Boolean wrapBool = new Boolean(“false”); Integer num1 = new Integer(“31”); Integer num2 = new Integer(“3”); 41 Core Java Int sum = num1.intValue()*num2.intValue(); //intValue() hàm lớp trình bao bọc Integer Chương trình sau minh họa cách sử dụng lớp wrapper cho kiểu liệu int Chương trình 4.5 Class CmdArg { public static void main(String args[]) { int sum = 0; for(int i = 0;i