So Sánh Giao Diện Và Lớp Trừu Tượng

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:

Lớp trừu tượng

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!

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 1

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 2

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 3

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 4

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);

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 29/01/2024