1, Final class (Lớp vô sinh):

Lớp không thể có lớp dẫn xuất từ nó (không có lớp con) gọi là lớp “vô sinh”, hay nói cách khác không thể kế thừa được từ một lớp “vô sinh”. Lớp “vô sinh” dùng để hạn chế, ngăn ngừa các lớp khác dẫn xuất từ nó.
Để khai báo một lớp là lớp “vô sinh”, chúng ta dùng từ khóa final class.
Tất cả các phương thức của lớp vô sinh đều vô sinh, nhưng các thuộc tính của lớp vô sinh thì có thể không vô sinh.
- Xem thêm video blog StudyAndShare


Ví dụ:
PHP:
public final class {
    public final 
int x;
    private 
int y;
    public final 
void method_1(){
    
// …
    
}
    public final 
void method_2(){
    
// …
    
}
}
2, Abstract class (Lớp trừu tượng):

Một lớp trừu tượng thì không có thể hiện nghĩa là ta không thể khởi tạo nó bằng toán tử new, và một phương thức trong nó là abstract thì chỉ được đưa ra định nghĩa (khai báo) mà không được thực thi và nó sẽ được override lại trong các lớp con kế thừa. Và trong lớp mà tồn tại phương thức abstract thì lớp đó cũng được định nghĩa abstract.

- Lớp trừu tượng là lớp không có khai báo các thuộc tính thành phần và các phương thức.
- Bất cứ class nào kết thừa abstract class nào đó phải định nghĩa lại các abstract mothods của lớp mà nó thừa kế hoặc không định nghĩa lại nhưng phải ghi lại abstract mothods đó.
- Abstract class là class có chứa các abstract mothods
- Các methods trong abstract class phải khai báo với từ khóa abstract (không giống như interface vì interface mặc định gán abstract cho các mothods)
- Một abstract class có thể chứa cả abstract mothods và các mothods thường.
- Khi một class có chứa abstract mothod thì bắt buộc phải có từ khóa abstract đằng trước tên class đó.

PHP:
abstract class A{
    abstract 
void method_1();
}
public class 
extends A{
    @
Override
    
public void method_1(){
    
// cài đặt chi tiết cho phương thức method_1
    // trong lớp con B.
    // …
    
}
}
public class 
extends A{
    @
Override
    
public void method_1(){
    
// cài đặt chi tiết cho phương thức method_1
    // trong lớp con C.
    // …
    
}
}
Lưu ý:
* Các phương thức được khai báo dùng các tiền tố private và static thì không được khai báo là trừu tượng abstract. Tiền tố private thì không thể truy xuất từ các lớp dẫn xuất, còn tiền tố static thì chỉ dùng riêng cho lớp khai báo mà thôi.
* Phương thức trong abstract class có 2 cách để khai báo:
- Khai báo bình thường như class
- Khai báo giống như interface nhưng phải có thêm từ khóa abstract

Code demo:
PHP:
package java.demo.android.vn;

abstract class 
nhanSu {

    abstract 
void show();
}

class 
hocSinh extends nhanSu {

    public 
String hoTen;
    public 
int namSinh;

    public 
void show() {
        
System.out.println("Hello " hoTen " Năm sinh: " namSinh);
    }
}

public class 
JavaDemoAndroidVn {

    public static 
void main(String[] args) {
        
hocSinh a = new hocSinh();
        
a.hoTen "Vũ Văn A";
        
a.namSinh 1992;
        
a.show();

    }
}
3, Interface (Khác với GUI - Nó không phải là giao diện người dùng)

- Như chúng ta đã biết một lớp trong java chỉ có một siêu lớp (super class) trực tiếp hay một cha duy nhất (đơn thừa kế). Để tránh đi tính phức tạp của đa thừa kế (multi-inheritance) trong lập trình hướng đối tượng, Java thay thế bằng interface. Một lớp có thể kế thừa từ nhiều interface với các lớp khác để thừa hưởng thêm vùng dữ liệu và phương thức của các interface này.

- Interface được khai báo như một lớp. Nhưng các thuộc tính của interface là các hằng (khai báo dùng từ khóa final) và các phương thức của interface là trừu tượng (mặc dù không có từ
khóa abstract).
- Mothods trừu tượng là các mothods chỉ có phần header, không có phần body.(Xem ví dụ phía dưới)
- Trong các lớp có cài đặt các interface ta phải tiến hành cài đặt cụ thể các phương thức này.

- Interface được định nghĩa nhằm làm cho code rành mạch hơn vì các class có thể implements các interface.

Ví dụ: Code ví dụ của video bên blog StudyAndShare


PHP:
public class DemoJavaBasic {
      public static 
void main(String[] args) {
            
Manager mana = new Manager();
            
mana.show();
      }
}
interface 
Human{
      public static final 
int AVG_AGE 100;
      
int AVG_WEIGHT 60;

      public abstract 
void show();
      
void study();
}
class 
Manager implements Human{

      @
Override
      
public void show() {
            
System.out.println("Tuoi trung bình: "AVG_AGE);

      }

      @
Override
      
public void study() {
            
// TODO Auto-generated method stub

      
}

}
Có một vấn đề khác với lớp là một giao diện (interface) không chỉ có một giao diện cha trực tiếp mà có thể dẫn xuất cùng lúc nhiều giao diện khác (hay có nhiều giao diện cha). Khi đó nó sẽ kế thừa tất cả các giá trị hằng và các phương thức của các giao diện cha. Các giao diện cha được liệt kê thành chuỗi và cách nhau bởi dấu phẩy “,”. Khai báo như sau:
PHP:
public interface InterfaceName extends interface1interface2,interface3{// …}
Ví dụ:
PHP:
interface DienTich {

    public abstract 
void sHinhVuong(float a);

    public abstract 
void sHinhChuNhat(float afloat b);
}

interface 
ChuVi {

    public abstract 
void cVHinhVuong(float a);

    public abstract 
void cVHinhChuNhat(float afloat b);
}

interface 
CongThuc extends DienTichChuVi {
}

class 
CongThucTinh implements CongThuc {//Hoặc viết là class CongThucTinh implements DienTich,ChuVi cũng được!

    
@Override
    
public void sHinhVuong(float a) {
        
System.out.println("Diện tích hình vuông là: " a);
    }

    @
Override
    
public void sHinhChuNhat(float afloat b) {
        
System.out.println("Diện tích hình chữ nhật là: " b);
    }

    @
Override
    
public void cVHinhVuong(float a) {
        
System.out.println("Chu vi hình vuông là: " a);
    }

    @
Override
    
public void cVHinhChuNhat(float afloat b) {
        
System.out.println("Chu vi hình chữ nhật là: " * (b));
    }
}

public class 
JavaAndroidVn {

    public static 
void main(String[] args) {
        
CongThucTinh x = new CongThucTinh();
        
x.sHinhVuong(5.0f);
        
x.cVHinhVuong(5.0f);
        
x.sHinhChuNhat(5.5f10.0f);
        
x.cVHinhChuNhat(5.5f10.0f);
    }
}
Đọc thêm về Interface: Các interface (giao diện, bề mặt) trong lập trình Java

4, So sánh abstract class và interface:


abstractandinterface


Mấy đoạn này là mình sưu tầm trên mạng nhé:
- Một class chỉ có thể kế thừa từ một abstract class, nhưng có thể kế thừa nhiều interface.
- Trong Interface chỉ có thể khai báo các fields, methods, mà không được hiện thực nó. Còn đối với abstract thì dùng các biến, hiện thực cách methods.
- Các fields, methods trong interace đều là public và bắt buộc các class kế thừa phải cài đặt nó (abstract). Trong abstract class thì có các fields, methods có thể là private, internal, public, protected và có thể là abstract hoặc non-abstract.
- Interface dùng để gom các hành động cần được hiện thực, các khả năng của một đối tượng, còn abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái.
- Abstract class có tốc độ thực thi nhanh hơn interface.
- Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.
- Ví dụ về interface, các thành viên của interface phải được thực thi trong các lớp mà kế thừa từ nó.
- Nhìn một cách nào đó, bạn có thể thấy rằng, Interface giống như những câu lạc bộ, và Abstract class là một ông bố trong gia đình.
Một câu lạc bộ luôn luôn có một bộ quy tắc hay nôi qui mà mọi thành viên luôn phải tuân theo.
Một ông bố trong gia đình thì khác, ông có tài sản mà con cháu có thể kế thừa, ông cũng có những qui định trong di chúc – ai là người được kế thừa tài sản của ông! Bạn có thể tham gia cùng lúc nhiều câu lạc bộ như việc một Class "kế thừa" (Implement) nhiều Interface.
Một khi đã tham gia vào CLB nào, bạn phải tuân thủ tất cả các qui tắc của CLB đó, không quan tâm bạn là thành viên của bao nhiêu CLB. Đó là việc tại sao phải Implement đầy đủ các Interface member.
CLB không để lại tài sản cho các bạn, nhưng bố của bạn thì có, ông ấy cho bạn tài sản (không nếu ông ấy không thích Laughing) và cũng bắt bạn tuân theo các qui tắc – gia qui. Và một khi đã là con của người này thì bạn không thể nào là con của người khác giống như không thể kế thừa từ nhiều Abstract Class!


[IMG]

Bài tập về nhà::D Làm lại thành thạo các ví dụ trên!

Đọc thêm: Các interface (giao diện, bề mặt) trong lập trình Java

0 blogger-facebook:

Post a Comment

 
Top