Abstract là gì trong java

Trong bài này, tôi sẽ giới thiệu đến các bạn tính chất cuối cùng trong lập trình hướng đối tượng đó là tính trừu tượng (Abstraction) và cách vận dụng tính chất này trong lập trình. Cuối bài này, tôi sẽ đưa ra một số bài tập cho các bạn luyện tập!

Abstract là gì trong java

Abstract là gì trong java

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Tính trừu tượng trong Java là tính chất không thể hiện cụ thể mà chỉ nêu tên vấn đề. Đó là một quá trình che giấu các hoạt động bên trong và chỉ hiển thị những tính năng thiết yếu của đối tượng tới người dùng. Ví dụ: một người sử dụng điện thoại để gửi tin nhắn thì anh ta sẽ nhập nội dung tin nhắn, thông tin người nhận và ấn nút gửi. Khi anh ta bắt đầu gửi tin thì anh ấy không biết những gì diễn ra bên trong quá trình gửi mà chỉ biết được là kết quả của tin nhắn đã được gửi đến người nhận thành công hay chưa. Vì vậy trong ví dụ này, quá trình gửi tin nhắn đã được ẩn đi và chỉ hiển thị những chức năng mà người dùng cần đó là chức năng nhập nội dung tin nhắn, thông tin người nhận, kết quả gửi tin nhắn thành công hay thất bại. Đó chính là tính trừu tượng.

Ưu điểm khi sử dụng tính trừu tượng để lập trình:

  • Tính trừu tượng cho phép các lập trình viên loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình, cải thiện khả năng bảo trì của hệ thống.
  • Tính trừu tượng giúp chúng ta tập trung vào những cốt lõi cần thiết của đối tượng thay vì quan tâm đến cách nó thực hiện.
  • Tính trừu tượng cung cấp nhiều tính năng mở rộng khi sử dụng kết hợp với tính đa hình và kế thừa trong lập trình hướng đối tượng.

Java trừu tượng hóa thông qua các lớp trừu tượng (Abstract class) và các giao diện (Interface). Trong bài này, tôi sẽ hướng dẫn các bạn tìm hiểu về lớp trừu tượng và phương thức trừu tượng, còn Interface tôi sẽ giới thiệu trong các bài sau.

Bài viết này được đăng tại [free tuts .net]

2. Phương thức trừu tượng (Abstract method) và lớp trừu tượng (Abstract class)

Phương thức trừu tượng (Abstract method)

Các phương thức chỉ có phần khai báo mà không có thân phương thức nằm trong cặp dấu {} và có một dấu chấm phẩy để kết thúc được gọi là phương thức trừu tượng. Để định nghĩa một phương thức là phương thức trừu tượng chúng ta sẽ sử dụng từ khóa abstract đứng trước tên phương thức.

Cú pháp khai báo phương thức trừu tượng:

Cú pháp

[access_modifier] abstract [kiểu_trả_về] [tên_phương_thức_trừu_tượng] [<đối_số_truyền_vào>];

, trong đó:

  • [access_modifier] là phạm vi truy cập của phương thức trừu tượng. Phạm vi truy cập của phương thức trừu tượng tương tự như của các phương thức bình thường nhưng không được khai báo phạm vi truy cập là private, nếu để là private thì trình biên dịch sẽ báo lỗi.
  • [kiểu_trả_về] là kiểu dữ liệu của phương thức.
  • [tên_phương_thức_trừu_tượng] phải tuân theo quy tắc đặt tên phương thức (hàm) của Java.
  • Phương thức này có thể có hoặc không có <đối_số_truyền_vào>.

Ví dụ

// khai báo 1 phương thức trừu tượng có tên là khaiBaoPhuongThucTruuTuong() // phương thức này có phạm vi truy cập là public // và không có đối số truyền vào public abstract khaiBaoPhuongThucTruuTuong();

Lưu ý: Để sử dụng phương thức trừu tượng này, chúng ta cần phải ghi đè (override) nó trong lớp con kế thừa trực tiếp lớp khai báo phương thức này.

Lớp trừu tượng (Abstract class)

  • Lớp trừu tượng là lớp được khai báo với từ khóa abstract đứng trước tên của lớp.
  • Nếu 1 lớp được khai báo là 1 lớp trừu tượng thì chúng ta không thể dùng trực tiếp nó để tạo ra đối tượng mà phải viết một lớp kế thừa của lớp trừu tượng đó.
  • Lớp trừu tượng có thể có hoặc không có phương thức trừu tượng. Nếu một lớp có ít nhất 1 phương thức trừu tượng thì lớp đó phải được khai báo là lớp trừu tượng.
  • Những lớp là lớp trừu tượng cũng không cần có phương thức khởi tạo.
  • Một khi có một lớp nào đó kế thừa lớp trừu tượng thì lớp con đó bắt buộc phải override lại nội dung tất cả các phương thức trừu tượng có trong lớp đó.

Tóm lại, lớp trừu tượng là 1 lớp không thể khởi tạo đối tượng từ nó, nhưng nó lại ràng buộc các lớp con kế thừa trực tiếp nó phải có các phương thức trừu tượng của nó thông qua sự ghi đè (override) phương thức.

Để khai báo lớp trừu tượng, chúng ta sẽ sử dụng cú pháp sau:

Cú pháp

[access_modifier] abstract class TenClass { }

AbstractClassDemo

package vidu; public abstract class AbstractClassDemo { public void hienThi() { System.out.println("Đây là lớp trừu tượng"); } // khai báo 1 phương thức abstract có tên là hienThi() // phương thức này không có thân phương thức // và có kiểu trả về là void public abstract void show(); }

3. Ví dụ

Ví dụ dưới đây sẽ minh họa cách sử dụng tính trừu tượng trong Java.

Animal.java

package vidu; public abstract class Animal { private String tiengKeu; public abstract void hienThiTiengKeu(); }

Dog.java

package vidu; public class Dog extends Animal { @Override public void hienThiTiengKeu() { System.out.println("Gâu"); } }

Cat.java

package vidu; public class Cat extends Animal { @Override public void hienThiTiengKeu() { System.out.println("Meo"); } }

Main.java

package vidu; public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.hienThiTiengKeu(); Cat cat = new Cat(); cat.hienThiTiengKeu(); } }

Kết quả sau khi biên dịch chương trình:

Abstract là gì trong java

Giải thích hoạt động của chương trình trên:

Trong ví dụ trên, tôi tạo ra 3 lớp đối tượng là Animal, Dog và Cat, trong đó lớp Animal là lớp trừu tượng. Lớp Animal có một phương thức trừu tượng tên là hienThiTiengKeu() dùng để hiển thị tiếng kêu của từng loài động vật tương ứng. Lớp Dog và Cat là 2 lớp kế thừa của lớp Animal, 2 lớp này khi mới tạo ra sẽ có nội dung lớp như sau:

Dog.java

package vidu; public class Dog extends Animal { @Override public void hienThiTiengKeu() { // TODO Auto-generated method stub } }

Các bạn thấy đoạn code trên khi lớp Dog kế thừa lớp Animal mới được tạo ra nó sẽ kế thừa lại phương thức trừu tượng của lớp cha thông qua sự ghi đè phương thức đó, cụ thể ở đây là phương thức hienThiTiengKeu(). Nếu chúng ta xóa bỏ phương thức này trong lớp Dog thì hệ thống sẽ báo lỗi, vì vậy chúng ta có thể rút ra kết luận: lớp cha có những phương thức trừu tượng nào thì lớp con cũng phải có phương thức trừu tượng đó (override) - đây chính là ý tưởng chính của tính trừu tượng.

3. Lời kết

Trong bài này, chúng ta đã tìm hiểu về tính chất cuối cùng khi lập trình hướng đối tượng đó là tính trừu tượng trong Java. Sang bài sau, chúng ta sẽ tìm hiểu về các khái niệm còn lại trong lập trình hướng đối tượng với Java. Các bạn theo dõi nhé!

Câu hỏi thường gặp liên quan:

Cùng chuyên mục:

Abstract là gì trong java

Lớp 1-2-3 Lớp 4 Lớp 5 Lớp 6 Lớp 7 Lớp 8 Lớp 9 Lớp 10 Lớp 11 Lớp 12 IT

Abstract là gì trong java

Khóa học JavaJava cơ bảnKhái niệm Hướng đối tượngFile và I/O trong JavaString trong JavaXử lý ngoại lệ (Exception Handling)Cấu trúc dữ liệu trong JavaCollection trong JavaJava nâng caoTài liệu tham khảo Java Lớp trừu tượng - Abstract Class trong Java Trang trướcTrang sau

Một lớp được khai báo với từ khóa abstract được xem như là lớp abstract trong Java. Nó có thể có các phương thức abstract hoặc non-abtract. Trước khi tìm hiểu về lớp trừu tượng trong Java, bạn cần hiểu tính trừu tượng trong Java là gì.

Bạn đang xem: Lớp abstract trong java là gì, abstract class và interface trong java

Tính trừu tượng (Abstraction) trong Java

Tính trừu tượng là một tiến trình ẩn các chi tiết trình triển khai và chỉ hiển thị tính năng tới người dùng. Nói cách khác, nó chỉ hiển thị các thứ quan trọng tới người dùng và ẩn các chi tiết nội tại, ví dụ: để gửi tin nhắn, người dùng chỉ cần soạn text và gửi tin. Bạn không biết tiến trình xử lý nội tại về phân phối tin nhắn. Tính trừu tượng giúp bạn trọng tâm hơn vào đối tượng thay vì quan tâm đến cách nó thực hiện.

Lớp abstract trong Java

Một lớp được khai báo là abstract thì đó là lớp trừu tượng. Nó cần được kế thừa và phương thức của nó được triển khai. Nó không thể được khởi tạo.

Sử dụng từ khóa abstract để khai báo một lớp abstract. Từ khóa này xuất hiện trước từ khóa class trong khai báo lớp. Ví dụ:

abstract class A{} Có hai cách để đạt được tính trừu tượng hóa trong Java:

Lớp abstract (0 tới 100%)

Interface (100%)


Phương thức trừu tượng trong Java

Một phương thức được khai báo là abstract và không có trình triển khai thì đó là phương thức trừu tượng.

Nếu bạn muốn một lớp chứa một phương thức cụ thể nhưng bạn muốn triển khai thực sự phương thức đó để được quyết định bởi các lớp con, thì bạn có thể khai báo phương thức đó trong lớp cha ở dạng abstract.

Từ khóa abstract được sử dụng để khai báo một phương thức dạng abstract. Một phương thức abstract không có thân phương thức.

Phương thức abstract sẽ không có định nghĩa, được theo sau bởi dấu chấm phảy, không có dấu ngoặc móc ôm theo sau:

abstract void printStatus(); // Khai bao phuong thuc voi tu khoa abstract va khong co than phuong thuct

Ví dụ về lớp trừu tượng và phương thức trừu tượng trong Java

Trong ví dụ này, Bike là lớp trừu tượng chỉ chứa một phương thức trừu tượng là run. Trình triển khai của nó được cung cấp bởi lớp Honda.

// lop truu tuong Bikeabstract class Bike{ abstract void run(); // phuong thuc truu tuong voi tu khoa abstract} // lop Honda4 ke thua lop truu tuong Bike class Honda4 extends Bike{ void run(){ System.out.println("Dang chay mot cach an toan.."); } // phuong thuc main() public static void main(String args<>){ Bike obj = new Honda4(); obj.run(); } }

Kế thừa lớp Abstract trong Java

Trong ví dụ này, Shape là lớp trừu tượng, trình triển khai của nó được cung cấp bởi lớp Rectangle và lớp Circle. Hai lớp này kế thừa lớp trừu tượng Shape.

File: TestAbstraction1.java

// lop truu tuong Shapeabstract class Shape{ abstract void draw(); } //Trong tinh huong nay, trinh trien khai duoc cung cap boi ai do, vi du: nguoi su dung cuoi cung nao do class Rectangle extends Shape{ void draw(){ System.out.println("Ve hinh chu nhat"); } } class Circle1 extends Shape{ void draw(){ System.out.println("Ve hinh tron");} } //Trong tinh huong nay, phuong thuc duoc goi boi lap trinh vien hoac nguoi dung class TestAbstraction1{ public static void main(String args<>){ Shape s=new Circle1(); //Trong tinh huong nay, doi tuong duoc cung cap thong qua phuong thuc, chang han nhu getShape() s.draw(); } } Khi mình tạo sự thể hiện của lớp Rectangle (tại dòng Shape s=new Circle1();), phương thức draw() của lớp Rectangle sẽ được triệu hồi.

Có thể bạn chưa quen thuộc với cách thức viết chung tất cả các lớp trong cùng một file như trên và có thể làm cho các bạn rối mắt. Trong ví dụ tiếp mình sẽ trình bày riêng rẽ từng file cho các bạn dễ hiểu.

Xem thêm:

Tất nhiên, trong khi lập trình bất cứ ngôn ngữ nào, mỗi Class mà chúng ta tạo ra đều phục vụ cho một mục đích cụ thể nào đó. Do đó, bạn nên tạo các Class riêng rẽ trong từng file, đừng làm như trên nhé.


Ví dụ khác về Kế thừa lớp Abstract trong Java

Đầu tiên mình có một lớp trừu tượng Bank có phương thức abstract có tên là getRateOfInterest() với mục đích để lấy lãi suất của ngân hàng nói chung.

File: Bank.java

abstract class Bank{ abstract int getRateOfInterest(); } Tiếp đó, mình có hai lớp SBI và PNB đại diện cho tên các ngân hàng và hai lớp này kế thừa lớp trừu tượng Bank ở trên. Vì hai lớp này kế thừa lớp trừu tượng Bank nên cả hai lớp phải cung cấp trình triển khai cụ thể cho phương thức getRateOfInterest().

File: SBI.java

class SBI extends Bank{ int getRateOfInterest(){return 7;} // bat buoc phai cung cap trinh trien khai cua getRateOfInterest} File: PNB.java

class PNB extends Bank{ int getRateOfInterest(){return 8;} // bat buoc phai cung cap trinh trien khai cua getRateOfInterest} Và cuối cùng, lớp TestBank có phương thức main() sẽ có nội dung như sau:

class TestBank{ public static void main(String args<>){ // Tao mot doi tuong SBI moi Bank b=new SBI(); //Neu doi tuong la PNB, phuong thuc cua PNB se duoc trieu hoi int interest=b.getRateOfInterest(); //Trieu hoi phuong thuc cua SBISystem.out.println("Ti le lai suat la: "+interest+" %"); }} Lớp trừu tượng có thể có thành viên dữ liệu, phương thức trừu tượng, constructor, và có thể cả phương thức main().

File: TestAbstraction2.java

//vi du ve lop abstract ma co than phuong thuc abstract class Bike{ Bike(){ System.out.println("bike duoc tao"); } abstract void run(); void changeGear(){ System.out.println("gear duoc thay doi"); } } class Honda extends Bike{ void run(){ System.out.println("dang chay mot cach an toan.."); } } class TestAbstraction2{ public static void main(String args<>){ Bike obj = new Honda(); obj.run(); obj.changeGear(); } } Qui tắc: Nếu bạn đang kế thừa bất cứ lớp trừu tượng nào mà có phương thức trừu tượng, thì bạn phải hoặc cung cấp trình triển khai của các phương thức của lớp trừu tượng này.

Lớp trừu tượng cũng có thể được sử dụng để cung cấp một số trình triển khai của Interface. Trong tình huống này, người dùng cuối cùng không thể bị bắt buộc phải ghi đè tất cả phương thức của Interface đó.

Ghi chú: Nếu bạn mới học về Java, thì học Interface trước và bỏ qua ví dụ này.

// mot interface Ainterface A{ void a(); void b(); void c(); void d(); } // lop truu tuong B ke thua interface A abstract class B implements A{ //trong vi du nay, lop truu tuong B co the chi cung cap trinh trien khai phuong thuc c()public void c(){ System.out.println("Toi la C"); } } // lop M ke thua lop truu tuong B class M extends B{ // bat buoc phai trien khai cac phuong thuc a(), b(), c()public void a(){ System.out.println("Toi la a"); } public void b(){ System.out.println("Toi la b"); } public void d(){ System.out.println("Toi la d"); } } // lop Test5 chua phuong thuc main() class Test5{ public static void main(String args<>){ A a=new M(); a.a(); a.b(); a.c(); a.d(); }} Ps: Đi làm có thể hỏi về sự khác nhau giữa abstract class và interface. Các bạn nên chú ý các phương thức của interface là abstract 100%, trong abstract class có thể có phương thức không phải abstract. Trong thiết kế phần mềm, interface thường được dùng để chỉ 2 hay nhiều class cùng làm việc gì đó (ví dụ cùng in - Printable), trong khi abstract class thường hướng đến quan hệ cha con trong lập trình hướng đối tượng. Các bạn có thể đọc thêm https://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract-class-and-vice-versa


Đã có app evolutsionataizmama.com trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.

Abstract là gì trong java


Abstract là gì trong java


Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập Java. Khóa học có giá chỉ 300K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.

Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/Bạn nào có nhu cầu mua, inbox trực tiếp a Tuyền, cựu sinh viên Bách Khoa K53, fb: https://www.facebook.com/tuyen.evolutsionataizmama.com

Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của: Tutorialspoint.com

Follow facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.evolutsionataizmama.com để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.