Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Apr 2015
    Bài viết
    0

    Bài 21: Final class, abstract class và interface trong Java

    /* 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ụ:


    Mã nguồn PHP:
    [color=#000000]
    [/color][color=#007700]public final class [/color][color=#0000bb]a [/color][color=#007700]{ public final [/color][color=#0000bb]int x[/color][color=#007700]; private [/color][color=#0000bb]int y[/color][color=#007700]; public final [/color][color=#0000bb]void method_1[/color][color=#007700](){ [/color][color=#ff8000]// … [/color][color=#007700]} public final [/color][color=#0000bb]void method_2[/color][color=#007700](){ [/color][color=#ff8000]// … [/color][color=#007700]}}[/color] 
    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 đó.



    Mã nguồn PHP:
    [color=#000000]
    [/color][color=#007700]abstract class [/color][color=#0000bb]a[/color][color=#007700]{ abstract [/color][color=#0000bb]void method_1[/color][color=#007700]();}public class [/color][color=#0000bb]b [/color][color=#007700]extends [/color][color=#0000bb]a[/color][color=#007700]{ @[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void method_1[/color][color=#007700](){ [/color][color=#ff8000]// cài đặt chi tiết cho phương thức method_1 // trong lớp con b. // … [/color][color=#007700]}}public class [/color][color=#0000bb]c [/color][color=#007700]extends [/color][color=#0000bb]a[/color][color=#007700]{ @[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void method_1[/color][color=#007700](){ [/color][color=#ff8000]// cài đặt chi tiết cho phương thức method_1 // trong lớp con c. // … [/color][color=#007700]}}[/color] 
    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:


    Mã nguồn PHP:
    [color=#000000]
    package java[/color][color=#007700].[/color][color=#0000bb]demo[/color][color=#007700].[/color][color=#0000bb]android[/color][color=#007700].[/color][color=#0000bb]vn[/color][color=#007700]; abstract class [/color][color=#0000bb]nhansu [/color][color=#007700]{ abstract [/color][color=#0000bb]void show[/color][color=#007700]();} class [/color][color=#0000bb]hocsinh [/color][color=#007700]extends [/color][color=#0000bb]nhansu [/color][color=#007700]{ public [/color][color=#0000bb]string hoten[/color][color=#007700]; public [/color][color=#0000bb]int namsinh[/color][color=#007700]; public [/color][color=#0000bb]void show[/color][color=#007700]() { [/color][color=#0000bb]system[/color][color=#007700].[/color][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]println[/color][color=#007700]([/color][color=#dd0000]"hello " [/color][color=#007700]+ [/color][color=#0000bb]hoten [/color][color=#007700]+ [/color][color=#dd0000]" năm sinh: " [/color][color=#007700]+ [/color][color=#0000bb]namsinh[/color][color=#007700]); }} public class [/color][color=#0000bb]javademoandroidvn [/color][color=#007700]{ public static [/color][color=#0000bb]void main[/color][color=#007700]([/color][color=#0000bb]string[/color][color=#007700][] [/color][color=#0000bb]args[/color][color=#007700]) { [/color][color=#0000bb]hocsinh a [/color][color=#007700]= new [/color][color=#0000bb]hocsinh[/color][color=#007700](); [/color][color=#0000bb]a[/color][color=#007700].[/color][color=#0000bb]hoten [/color][color=#007700]= [/color][color=#dd0000]"vũ văn a"[/color][color=#007700]; [/color][color=#0000bb]a[/color][color=#007700].[/color][color=#0000bb]namsinh [/color][color=#007700]= [/color][color=#0000bb]1992[/color][color=#007700]; [/color][color=#0000bb]a[/color][color=#007700].[/color][color=#0000bb]show[/color][color=#007700](); }}[/color] 
    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




    Mã nguồn PHP:
    [color=#000000]
    [/color][color=#007700]public class [/color][color=#0000bb]demojavabasic [/color][color=#007700]{ public static [/color][color=#0000bb]void main[/color][color=#007700]([/color][color=#0000bb]string[/color][color=#007700][] [/color][color=#0000bb]args[/color][color=#007700]) { [/color][color=#0000bb]manager mana [/color][color=#007700]= new [/color][color=#0000bb]manager[/color][color=#007700](); [/color][color=#0000bb]mana[/color][color=#007700].[/color][color=#0000bb]show[/color][color=#007700](); }}interface [/color][color=#0000bb]human[/color][color=#007700]{ public static final [/color][color=#0000bb]int avg_age [/color][color=#007700]= [/color][color=#0000bb]100[/color][color=#007700]; [/color][color=#0000bb]int avg_weight [/color][color=#007700]= [/color][color=#0000bb]60[/color][color=#007700]; public abstract [/color][color=#0000bb]void show[/color][color=#007700](); [/color][color=#0000bb]void study[/color][color=#007700]();}class [/color][color=#0000bb]manager [/color][color=#007700]implements [/color][color=#0000bb]human[/color][color=#007700]{ @[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void show[/color][color=#007700]() { [/color][color=#0000bb]system[/color][color=#007700].[/color][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]println[/color][color=#007700]([/color][color=#dd0000]"tuoi trung bình: "[/color][color=#007700]+ [/color][color=#0000bb]avg_age[/color][color=#007700]); } @[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void study[/color][color=#007700]() { [/color][color=#ff8000]// todo auto-generated method stub [/color][color=#007700]} }[/color] 
    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:


    Mã nguồn PHP:
    [color=#000000]
    [/color][color=#007700]public interface [/color][color=#0000bb]interfacename [/color][color=#007700]extends [/color][color=#0000bb]interface1[/color][color=#007700], [/color][color=#0000bb]interface2[/color][color=#007700],[/color][color=#0000bb]interface3[/color][color=#007700]{[/color][color=#ff8000]// …[/color][color=#007700]}[/color] 
    ví dụ:


    Mã nguồn PHP:
    [color=#000000]
    [/color][color=#007700]interface [/color][color=#0000bb]dientich [/color][color=#007700]{ public abstract [/color][color=#0000bb]void shinhvuong[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700]); public abstract [/color][color=#0000bb]void shinhchunhat[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700], [/color][color=#0000bb]float b[/color][color=#007700]);} interface [/color][color=#0000bb]chuvi [/color][color=#007700]{ public abstract [/color][color=#0000bb]void cvhinhvuong[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700]); public abstract [/color][color=#0000bb]void cvhinhchunhat[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700], [/color][color=#0000bb]float b[/color][color=#007700]);} interface [/color][color=#0000bb]congthuc [/color][color=#007700]extends [/color][color=#0000bb]dientich[/color][color=#007700], [/color][color=#0000bb]chuvi [/color][color=#007700]{} class [/color][color=#0000bb]congthuctinh [/color][color=#007700]implements [/color][color=#0000bb]congthuc [/color][color=#007700]{[/color][color=#ff8000]//hoặc viết là class congthuctinh implements dientich,chuvi cũng được! [/color][color=#007700]@[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void shinhvuong[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700]) { [/color][color=#0000bb]system[/color][color=#007700].[/color][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]println[/color][color=#007700]([/color][color=#dd0000]"diện tích hình vuông là: " [/color][color=#007700]+ [/color][color=#0000bb]a [/color][color=#007700]* [/color][color=#0000bb]a[/color][color=#007700]); } @[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void shinhchunhat[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700], [/color][color=#0000bb]float b[/color][color=#007700]) { [/color][color=#0000bb]system[/color][color=#007700].[/color][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]println[/color][color=#007700]([/color][color=#dd0000]"diện tích hình chữ nhật là: " [/color][color=#007700]+ [/color][color=#0000bb]a [/color][color=#007700]* [/color][color=#0000bb]b[/color][color=#007700]); } @[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void cvhinhvuong[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700]) { [/color][color=#0000bb]system[/color][color=#007700].[/color][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]println[/color][color=#007700]([/color][color=#dd0000]"chu vi hình vuông là: " [/color][color=#007700]+ [/color][color=#0000bb]4 [/color][color=#007700]* [/color][color=#0000bb]a[/color][color=#007700]); } @[/color][color=#0000bb]override [/color][color=#007700]public [/color][color=#0000bb]void cvhinhchunhat[/color][color=#007700]([/color][color=#0000bb]float a[/color][color=#007700], [/color][color=#0000bb]float b[/color][color=#007700]) { [/color][color=#0000bb]system[/color][color=#007700].[/color][color=#0000bb]out[/color][color=#007700].[/color][color=#0000bb]println[/color][color=#007700]([/color][color=#dd0000]"chu vi hình chữ nhật là: " [/color][color=#007700]+ [/color][color=#0000bb]2 [/color][color=#007700]* ([/color][color=#0000bb]a [/color][color=#007700]+ [/color][color=#0000bb]b[/color][color=#007700])); }} public class [/color][color=#0000bb]javaandroidvn [/color][color=#007700]{ public static [/color][color=#0000bb]void main[/color][color=#007700]([/color][color=#0000bb]string[/color][color=#007700][] [/color][color=#0000bb]args[/color][color=#007700]) { [/color][color=#0000bb]congthuctinh x [/color][color=#007700]= new [/color][color=#0000bb]congthuctinh[/color][color=#007700](); [/color][color=#0000bb]x[/color][color=#007700].[/color][color=#0000bb]shinhvuong[/color][color=#007700]([/color][color=#0000bb]5.0f[/color][color=#007700]); [/color][color=#0000bb]x[/color][color=#007700].[/color][color=#0000bb]cvhinhvuong[/color][color=#007700]([/color][color=#0000bb]5.0f[/color][color=#007700]); [/color][color=#0000bb]x[/color][color=#007700].[/color][color=#0000bb]shinhchunhat[/color][color=#007700]([/color][color=#0000bb]5.5f[/color][color=#007700], [/color][color=#0000bb]10.0f[/color][color=#007700]); [/color][color=#0000bb]x[/color][color=#007700].[/color][color=#0000bb]cvhinhchunhat[/color][color=#007700]([/color][color=#0000bb]5.5f[/color][color=#007700], [/color][color=#0000bb]10.0f[/color][color=#007700]); }}[/color] 
    đọ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:







    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!


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

    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

  2. #2
    Ngày tham gia
    Apr 2014
    Bài viết
    0
    tại sao abstract class có tốc độ thực thi nhanh hơn interface vậy các chú???? @@

  3. #3
    Ngày tham gia
    Apr 2014
    Bài viết
    1
    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 -_-

  4. #4
    Ngày tham gia
    Apr 2016
    Bài viết
    0
    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?

  5. #5
    Ngày tham gia
    Mar 2014
    Bài viết
    0
    lên cho năm mới 2015 nào

  6. #6
    Ngày tham gia
    Apr 2016
    Bài viết
    0
    Trích dẫn Gửi bởi chuthan
    vậy tác dụng của abstract class là gi?
    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

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •