Tất cả các phương thức của interface đều là abstract.
Một interface không thể chứa một trường nào trừ các trường vừa static và final.
Một interface không thể kế thừa từ lớp, nó được triển khai bởi một lớp.
Một interface có thể kế thừa từ nhiều interface khác.
Ví dụ 3.25: Tạo Printable Interface có phương thức print (), sau đó khai báo lớp triển khai interface vừa tạo.
interface printable{ void print();
}
class A6 implements printable{
public void print(){System.out.println("Hello");} public static void main(String args[]){
A6 obj = new A6(); obj.print();
}
}
3.6.2. Mục đích sử dụng giao diện
Trong một số trường hợp, Interface cần thiết cho các nhóm phát triển khác nhau đồng ý với một “contract”, từ đó xác định cách phần mềm của họ tương tác
Mỗi nhóm nên có cách viết code theo cách riêng mà không cần biết cách các nhóm khác làm thế nào
Các interface trong java có thể được sử dụng để xác định các contracts.
Interface không thuộc bất kỳ lớp nào cho dù chúng làm việc kết hợp với các lớp khác.
Java không cho phép đa kế thừa trong nhưng interface hỗ trợ điều đó
Trong Java, một class có thể kế thừa từ chỉ một class nhưng nó có thể implement nhiều interfaces.
3.6.3. So sánh giao diện và lớp trừu tượng
Cả lớp abstract và Interface đều sử dụng để thu được tính trừu tượng, từ đó cả hai đều có thể khai báo các phương thức trừu tượng. Cả lớp trừu tượng và Interface không thể được khởi tạo. Giữa lớp trừu tượng và Interface, có các điểm khác nhau như sau:
Interface | |
Lớp trừu tượng có thể có các phương thức abstract và non-abstract | Interface chỉ có thể có phương thức abstract |
Có thể bạn quan tâm!
- Đối Tượng, Lớp, Kế Thừa, Giao Diện
- Công nghệ Java - 8
- Công nghệ Java - 9
- Các Ngoại Lệ Được Định Nghĩa Với Lệnh ‘Throw’ Và ‘Throws’
- Cấu Trúc Phân Cấp Theo Quan Hệ Kế Thừa Của Các Giao Diện Lõi
- Sử Dụng Phương Thức Isalive() Và Join()
Xem toàn bộ 232 trang tài liệu này.
Interface hỗ trợ đa kế thừa | |
Lớp trừu tượng có thể có các biến final, non- final, static và non-static | Interface chỉ có các biến static và final |
Lớp trừu tượng có thể có phương thức static, phương thức main và constructor | Interface không thể có phương thức static, main hoặc constructor. |
Từ khóa abstract được sử dụng để khai báo lớp trừu tượng | Từ khóa interface được sử dụng để khai báo Interface |
Lớp trừu tượng có thể cung cấp trình triển khai của Interface | Interface không cung cấp trình triển khai cụ thể của lớp abstract |
Ví dụ: public abstract class Shape{ public abstract void draw(); } | Ví dụ: public interface Drawable{ void draw(); } |
Lớp trừu tượng không hỗ trợ đa kế thừa
3.7. Lớp nội
Java cho phép định nghĩa một lớp nằm trong một lớp khác, những lớp như vậy được gọi là lớp lồng nhau (nested class).
Cú pháp:
class Outer{
...
class Nested{ // lớp lồng
...
}
}
Lớp Outer định nghĩa bên ngoài, lớp Nested (lồng) định nghĩa bên trong lớp Outer.
Lớp lồng được chia thành hai loại: static (Lớp lồng tĩnh) và no-static (Lớp nội).
Lớp nội được gắn với đối tượng thuộc lớp bao bọc lấy nó và có thể truy xuất tới các phương thức và thuộc tính thuộc đối tượng đó, thậm chí các thành phần khai báo private.
Để tạo một đối tượng lớp nội phải tạo lớp ngoài trước. Sau đó tạo đối tượng lớp nội theo cú pháp như sau:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Lớp lồng static- tĩnh được gắn kết với đối tượng thuộc lớp bao bọc lấy nó nhưng không thể truy xuất tới các thuộc tính và phương thức của đối tượng đó. Truy xuất tới lớp lồng static bằng cách thêm dấu chấm và tên lớp:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Lợi ích của việc sử dụng lớp nội: Gom nhóm các lớp có chung mục đích lại với nhau
Tăng tính đóng gói
Tăng tính dễ đọc và dễ bảo trì cho code
3.7.1. Các kiểu lớp nội
3.7.1.1. Lớp nội thành viên
Một lớp non-static được tạo ra bên trong một lớp nhưng ngoài một phương thức được gọi là lớp nội thành viên member inner class trong java.
Ví dụ 3.26:
class MemberOuterExample { private int data = 30; class Inner {
void msg() {
System.out.println("data is " + data);
}
}
public static void main(String args[]) { MemberOuterExample obj = new MemberOuterExample(); MemberOuterExample.Inner in = obj.new Inner(); in.msg();
}
}
Kết quả:
3.7.1.2. Lớp nội nặc danh
Một lớp không có tên được gọi là lớp nội nặc danh (anonymous inner class). Được sử dụng nếu phải ghi đè phương thức của lớp hoặc interface. Anonymous inner class có thể được tạo ra bằng hai cách:
Class: có thể là abstract class hoặc class cụ thể.
Interface
abstract class Person { abstract void eat();
}
class TestAnonymousInner {
public static void main(String args[]) { Person p = new Person() {
void eat() {
System.out.println("nice fruits");
}
};
p.eat();
}
}
Kết quả:
3.7.1.3. Lớp nội địa phương
Một lớp được tạo ra bên trong một phương thức được gọi là local inner class. Nếu muốn gọi các phương thức của lớp được khai báo bên trong một phương thức, phải tạo ra thể hiện của lớp này bên trong phương thức chứa nó.
public class localInner1 {
private int data = 30;// instance variable void display() {
class Local {
void msg() {
System.out.println(data);
}
}
Local l = new Local(); l.msg();
}
public static void main(String args[]) { localInner1 obj = new localInner1(); obj.display();
}
}
Kết quả:
3.8. Xử lý ngoại lệ
3.8.1. Giới thiệu
Exception là một loại lỗi đặc biệt. Lỗi này xuất hiện vào lúc thực thi chương trình. Các trạng thái không bình thường xảy ra trong khi thi hành chương trình tạo ra các exception. Nếu không xử lý các trạng thái này thì chương trình có thể bị kết thúc đột ngột. Ví dụ, việc chia cho 0 sẽ tạo một lỗi trong chương trình. Ngôn ngữ Java cung cấp cơ chế dùng để xử lý ngoại lệ rất hiệu quả. Việc xử lý này làm hạn chế tối đa trường hợp hệ thống bị hỏng (crash) hay hệ thống bị ngắt đột ngột. Tính năng này làm cho Java trở thành một ngôn ngữ lập trình mạnh.
3.8.2. Mục đích của việc xử lý ngoại lệ
Một chương trình nên có cơ chế xử lý ngoại lệ. Nếu không, chương trình sẽ bị ngắt khi ngoại lệ xảy ra. Trong trường hợp đó, tất cả các nguồn tài nguyên mà hệ thống đã cấp không được giải phóng. Điều này gây lãng phí tài nguyên. Để tránh trường hợp này, tất cả các nguồn tài nguyên mà hệ thống cấp nên được thu hồi lại.
3.8.3. Lớp Exception
Lớp Exception và các lớp con của nó là một dạng Throwable chỉ ra các điều kiện mà một ứng dụng có thể muốn nắm bắt.
Lớp Exception dùng để kiểm tra ngoại lệ. Đoạn code sau đây sẽ thể hiện cấu trúc của một lớp Exception.
public class Exception extends Throwable{
…
}
3.8.4. Xử lý ngoại lệ
Khi một ngoại lệ xảy ra, đối tượng (object) tương ứng với ngoại lệ đó được tạo ra. Đối tượng này sau đó được truyền cho phương thức là nơi mà ngoại lệ xảy ra. Đối tượng này chứa thông tin chi tiết về ngoại lệ.
Thông tin này có thể được nhận về và được xử lý. Lớp ‘Throwable’ là lớp trên cùng của lớp Exception, đây là lớp cha của tất cả các ngoại lệ khác.
3.8.5. Mô hình xử lý ngoại lệ
Mô hình xử lý ngoại lệ của Java được gọi là ‘catch and throw’. Trong mô hình này, khi một ngoại lệ xảy ra, ngoại lệ sẽ bị chặn và chương trình chuyển đến một khối xử lý ngoại lệ. Người lập trình phải xử lý các ngoại lệ khác nhau phát sinh trong chương trình. Các ngoại lệ phải được xử lý, hoặc thoát khỏi chương trình khi nó xảy ra.
Dưới đây là cấu trúc của mô hình xử lý ngoại lệ:
try
{
// đoạn mã có khả năng gây ra ngoại lệ
}
catch(Exception e1)
{
// Nếu các lệnh trong khối ‘try’ tạo ra ngoại lệ có loại e1, thì thực hiện
//xử lý ngoại lệ nếu không chuyển xuống khối 'catch' tiếp theo
}
catch(Exception e2)
{
// Nếu các lệnh trong khối ‘try’ tạo ra ngoại lệ có loại e2, thì thực hiện
//xử lý ngoại lệ nếu không chuyển xuống khối 'catch' tiếp theo
}
catch(Exception eN)
{
// Nếu các lệnh trong khối ‘try’ tạo ra ngoại lệ có loại eN, thì thực hiện
//xử lý ngoại lệ nếu không chuyển xuống khối 'catch' tiếp theo
}
finally
{
// khối lệnh nay luôn được thực hiện cho dù ngoại lệ có xảy ra hay không.
}
3.8.5.1. Các ưu điểm của mô hình ‘catch và throw’
Mô hình ‘catch và throw’ có hai ưu điểm:
Người lập trình chỉ phải xử lý ngoại lệ khi cần thiết. Không cần phải thực hiện tại mọi mức.
Thông báo lỗi có thể được hiện ra khi tiến hành xử lý ngoại lệ.
3.8.5.2. Các khối ‘try’ và ‘catch’
Khối ‘try-catch’ được sử dụng để thi hành mô hình ‘catch và throw’ của việc xử lý ngoại lệ. Một hay nhiều khối ‘catch’ có thể theo sau một khối ‘try’. Các khối ‘catch’ này bắt các ngoại lệ có khả năng tạo ra trong trong khối ‘try’. Ví dụ
Try
{
doFileProcessing(); // phương thức do người sử dụng định nghĩa displayResults();
}
catch (Exeption e) // thể hiện của ngoại lệ
{
System.err.println(“Error :” + e.toString()); e.printStackTrace();
}
Ở đây, ‘e’ là đối tượng của lớp ‘Exception’. Chúng ta có thể sử dụng đối tượng này để in các chi tiết về ngoại lệ. Các phương thức ‘toString’ và ‘printStackTrace’ được sử dụng để mô tả các ngoại lệ xảy ra. Hình sau chỉ ra kết xuất của phương thức ‘printStackTrace()’.
Khối Try và Catch
Để xử lý được ngoại lệ nào, ta phải chỉ ra kiểu ngoại lệ tương ứng catch(Exception e). Khi ngoại lệ không biết thuộc kiểu nào, chúng ta có thể sử dụng lớp ‘Exception’ để bắt ngoại lệ đó.
3.8.6. Các khối chứa nhiều Catch
Nhiều khối ‘catch’ xử lý các loại ngoại lệ khác nhau một cách độc lập. Chúng được liệt kê trong đoạn mã sau:
try
{
doFileProcessing();
displayResults(); }
catch(LookupException e)
// e – LookupException object
{
handleLookupException(e); // phương thức xử lý lỗi do người sử dụng
//định nghĩa
}
catch(Exception e)
{
System.err.println(“Error:” + e.printStackTrace());
}
}
Trong trường hợp này, khối ‘catch’ đầu tiên sẽ bắt giữ một ‘LockupException’. Khối ‘catch’ thứ hai sẽ xử lý kiểu ngoại lệ khác với khối ‘catch’ thứ nhất.
Một chương trình cũng có thể chứa các khối ‘try’ lồng nhau. Ví dụ đoạn mã dưới đây:
try{
statement 1;
statement 2; try{
statement1; statement2;
}catch(Exception e) { // của khối try trong
}
}catch(Exception e) { // của khối try ngoài
}
Khi sử dụng các ‘try’ lồng nhau, khối ‘try’ bên trong được thi hành đầu tiên. Bất kỳ ngoại lệ nào bị chặn trong khối ‘try’ sẽ bị bắt giữ trong các khối ‘catch’ theo sau. Nếu khối ‘catch’ thích hợp không được tìm thấy thì các khối ‘catch’ của các khối ‘try’ bên ngoài sẽ được xem xét. Nếu không, Java Runtime Environment xử lý các ngoại lệ.
Ví dụ 3.27: Chương trình sau minh họa cách sử dụng các khối ‘try’ và ‘catch’
class TryClass{
public static void main(String args[]){ int demo=0;
try{
System.out.println(20/demo);