VII. Ngôn ngữ Java
5. Các bổ từ (modifier):
Bổ từ là những từ khoá cho phép thay đổi thời gian tồn tại hoặc phạm vi của lớp, biến, hay các hàm thành phần. Danh sách các bổ từ của Java trên bảng
II.0x cho phép chúng ta thấy đợc khả năng kết hợp của các bổ từ với các hàm hay biến.. Bảng II.0x : Bổ từ dùng kết hợp với lớp, hàm thành phần, biến thành phần và biến cục bộ Bổ từ Lớp Hàm thành phần Biến thànhphần Biến cụcbộ abstract - - static - - public - protected - private - - private protected - - synchronized - - - native - - - transient - - - volatite - - - final 5.1. Bổ từ abstract:
Khi dùng cho một lớp, bổ từ abstract cho biết lớp này cha đợc phát triển đầy đủ, không đợc tạo đối tợng từ nó. Nếu đợc dùng cho hàm thành phần, bổ từ abstract cho biết hàm đó sẽ đợc phát triển đầy đủ ở các lớp con. Khi đó, vì hàm thành phần cha thành hình, lớp đó cũng đợc coi là khai báo abstract nhằm tránh việc tạo đối tợng từ lớp và gọi đến các hàm “ảo”. Các giao diện (interface) đợc mặc định là abstract.
Ví dụ:
public abstract class java.net.SocketImpl extends java.lang.Object {
// Các trờng:
protected InetAddress address; protected FileDescriptor fd; protected int localport; protected int port; // Hàm dựng
public SocketImpl(); // Các hàm thành phần
protected abstract void accept(SocketImpl s); protected abstract int available();
protected abstract void bind(InetAddress host, int port); protected abstract void close();
protected abstract void connect( InetAddress address, int port);
protected abstract void connect(String host, int port); protected abstract void create(boolean stream);
protected FileDescriptor getFileDescriptor(); protected InetAddress getInetAddress();
protected abstract InputStream getInputStream(); protected int getLocalPort();
protected int getPort();
protected abstract void listen(int count); public String toString();
}
5.2. Bổ từ static:
Thông thờng, mỗt đối tợng trong cùng một lớp sẽ có bản sao riêng biệt tất cả các biến thành phần. Tuy nhiên, đôi khi ngời ta cần đến một biến thành phần chung cho tất cả các đối tợng của lớp đó. Một biến thành phần nh vậy đợc gọi là static (biến tĩnh), khi khai báo có đi kèm với bổ từ static. Lấy ví dụ một lớp sau đây (MyClass) đợc thiết kế sao cho nó có thể đếm số đối tợng đợc tạo ra của lớp:
public class MyClass{
// Khai báo biến dùng chung cho các đối tợng // khác nhau của lớp MyClass
public static int Counter; // Hàm dựng đối tợng
public MyClass (){
// tăng biến tĩnh của lớp đó Counter++;
}
// Hàm tĩnh dùng để đặt Counter về 0 public static void resetCounter(){
Counter = 0; }
// Đoạn mã khởi tạo lớp MyClass static { Counter = 0; }
}
Một hàm thành phần có thể khai báo là hàm tĩnh bằng bổ từ static. Ví dụ nh hàm resetCounter() đợc dùng để đặt biến Counter về 0. Lúc này hàm có thể gọi thông qua đối tợng hoặc trực tiếp bằng tên lớp:
// Đối tợng thứ nhất đợc tạo ra, Counter = 1 MyClass n = new MyClass();
// Đối tợng thứ hai tạo ra, Counter = 2 MyClass m = new MyClass();
System.out.println(MyClass.Counter+“ đối tợng vừa đợc tạo!”);
m.resetCounter(); // hoặc MyClass.resetCounter() cũng đúng
Lớp System trong gói java.lang khai báo tất cả các hàm và biến thành phần của nó là static. Nh vậy, chúng ta có thể dùng trực tiếp các hàm và biến này thông qua tên lớp. Khi đó không cần tạo ra đối tợng thuộc lớp System:
System MySystem = new System(); // Không đợc phép! // Đợc phép vì out đã khai báo static
System.out.println(“Chào các bạn!”); //Đợc phép vì hàm này đã khai báo static long timeNow = System.currentTimeMillis();
5.3. Bổ từ synchronized:
Java cho phép chạy nhiều tác vụ một lúc (đa luồng). Tuy nhiên, đôi khi hai tác vụ cùng thực hiện và truy cập đến một hàm có thể dẫn đến xung đột. Bổ từ synchronized dùng để định nghĩa một hàm thành phần nào đó là đồng bộ (nghĩa là trong cùng một thời điểm, chỉ có một thread đợc gọi đến hàm này).
5.4. Bổ từ native:
Các hành vi đợc khai báo native sẽ đợc thực hiện bằng ngôn ngữ khác (chẳng hạn C) do đó chúng không có phần mã lệnh. Rất nhiều hàm trong Core API có kiểu native bởi chúng cần truy cập đến các lệnh mức thấp của hệ điều hành. Ví dụ:
/**
* Trả về giá trị sin của một góc
* tham số a là một góc tính theo radians */
public static native double sin (double s);
Hàm native trên đây gọi đến th viện chuẩn của hệ điều hành để tính sin góc s. Đối với hệ Intel x86, đây là lệnh của bộ đồng xử lý, trong khi với các hệ khác có thể là do phần mềm tính toán.
Hai bổ từ native và synchronized chỉ đợc dùng đối với hàm thành phần.
5.5. Bổ từ volatite:
Một biến khai báo là volatile sẽ biến động tuỳ ý, không thể giả định rằng nó mang một giá trị nào xác định (giống với bổ từ volatile của C++).
5.6. Bổ từ transient:
Hiện nay bổ từ này không có tác dụng gì đối với trình biên dịch Java. Nó sẽ đ- ợc sử dụng trong tơng lai để tạo đối tợng "bền" (tức là không huỷ đi khi chơng trình kết thúc).
5.7. Bổ từ final:
Hầu hết các ngôn ngữ đều cho phép khai báo một biến nào đó nh hằng số (nghĩa là không thay đổi đợc). Với Java, để khai báo một biến nh vậy, chúng ta phải thêm bổ từ final. Nếu đã khai báo final, chúng ta phải gán giá trị khởi đầu cho nó luôn:
final int MAX_CHANNEL = 10;
Lớp và hàm cũng có thể khai báo là final. Nếu có bổ từ này trong khai báo một lớp, chúng ta không đợc quyền tạo các lớp con từ lớp này. Ví dụ, các lớp trong gói Math (hàm toán học) đợc khai báo final. Một hàm final sẽ không còn khả năng nạp chồng ở các lớp con.
5.8. Bổ từ private:
Bổ từ này giới hạn khả năng truy cập của biến hoặc hàm từ phía bên ngoài lớp. Chỉ có các hàm bên trong lớp đó mới có quyền truy cập đến các biến hoặc hàm khai báo private.
5.9. Bổ từ protected:
Bổ từ protected quy định biến hoặc hàm đó đợc "nhìn thấy" bởi hàm trong lớp đó hoặc các lớp con của lớp đó. Các lớp con có thể nằm trên các gói (packet) khác nhau.
5.10. Bổ từ private protected:
Bổ từ private protected tơng tự nh protect, nhng giới hạn hơn: các lớp con cùng gói với lớp mẹ mới nhìn thấy các hàm và biến này.