Khóa học free Bài 21: Final class, abstract class và interface trong Java

Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 20/7/13.

  1. Tiasangmoi92

    Tiasangmoi92 Super Moderator

    Lượt xem: 23,964
    /* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
    trên diễn đàn Android.Vn, bạn có thể vào đây đọc

    để hiểu hơn về khóa học và tham gia ngay cùng mọi người;) */
    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

    (Chú ý: Các bạn nên tự giác làm bài tập, hoàn thiện rồi đăng lên, các bài bạn đã làm, nên để code trong thẻ code - chọn thẻ PHP cho rõ ràng và để ẩn code trong thẻ ẩn spoiler, để khi click vào mới hiện code lên , trước khi thử sức tự làm, bạn không nên nhìn code của các bạn khác đã đăng nhé;))

    [​IMG]

    My Facebook: https://www.facebook.com/tiasangmoi

    Bài viết đăng lên diễn đàn khác vui lòng ghi rõ nguồn: Android.Vn
    interface, final class, abstract class, lớp vô sinh, lớp trừu tượng, interface trong java, khóa học java, khóa học lập trình java, học java online, khóa học java giá rẻ
  2. R700

    R700 Member

    tại sao Abstract class có tốc độ thực thi nhanh hơn interface vậy các chú???? @@
    MinhHC thích bài này.
  3. duytinhit

    duytinhit New Member

    Bài viết quá tuyệt vời :)
    hum trước đi pv bị out ngay câu so sánh abstract vs interface -_-
    MinhHC thích bài này.
  4. ChuThan

    ChuThan New Member

    Giả sử mình có một abstract class NhanVien gồm các thuộc tính tên, tuổi, địa chỉ. Để các class KeToan, class GiamDoc kế thừa. Nhưng mình thắc mắc: Mình tạo một class thường đủ thuộc tính trên rồi các class khác kế thừa cũng đều chạy ra một kết quả, vậy tác dụng của abstract class là gi?
    MinhHC thích bài này.
  5. MinhHC

    MinhHC New Member

    Lên cho năm mới 2015 nào
  6. MinhHC

    MinhHC New Member

    Nguyên nhân chính của vấn đề trên là do chúng ta mong muốn quy định một số các chức năng bắt buộc phải có đối với các lớp con khi kế thừa nó. Tuy nhiên, tại thời điểm quy định các chức năng đó chúng ta vẫn chưa xác định cụ thể cách thức thực hiện nên phải khai báo các chức năng đó là các phương thức trừu tượng.
    Sưu tầm :D

Chia sẻ trang này