Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục tìm hiểu về Lớp và phương thức trừu tượng (abstract). Ở bài này, mình sẽ đi qua những nội dung như sau:
Nội dung
1. Class trừu tượng(Abstract) trong Java
Trong Java, lớp trừu tượng (abstract class) không thể tạo ra các đối tượng. Chúng ta có thể sử dụng từ khóa abstract để khai báo một lớp trừu tượng. Ví dụ:
abstract class Animal {
//attributes and methods
}
Nếu cố gắng tạo ra các đối tượng của một class trừu tượng, chúng ta sẽ bị lỗi biên dịch. Lấy ví dụ:
Animal a1 = new Animal()
Nó sẽ bị lỗi biên dịch
Animal is abstract; cannot be instantiated
Mặc dù các class trừu tượng không thể được khởi tạo, chúng ta vẫn có thể tạo ra các subclass từ nó. Chúng ta có thể tạo các đối tượng của subclass để truy cập các thành viên của class trừu tượng.
Trước khi chúng ta tìm hiểu chi tiết về nó, chúng ta cần hiểu các phương thức trừu tượng.
2. Phương thức trừu tượng trong Java
Phương thức abstract không có thân phương thức. Chúng ta sử dụng từ khóa abstract để khai báo phương thức abstract và kết thúc bởi dấu chấm phẩy “;”. Ví dụ:
abstract void makeSound();
Điều quan trọng cần ghi nhớ là một class trừu tượng chỉ có thể chứa các phương thức trừu tượng. Nếu một class không phải là class trừu tượng chứa các phương thức trừu tượng, khi đó sẽ có lỗi biên dịch. Ví dụ:
//lỗi, lớp Language phải được khai báo abstract
class Animal {
// abstract method
abstract void makeSound();
}
Một class trừu tượng có thể chứa cả phương thức trừu tượng và các phương thức không trừu tượng như ví dụ sau:
abstract class Animal {
public void displayInfo() {
System.out.println(“I am an animal.”);
}
abstract void makeSound();
}
Trong ví dụ trên, chúng ta đã tạo ra một class trừu tượng là Animal. Nó chứa một phương thức trừu tượng là makeSound() và một phương thức không trừu tượng là dispalyInfo().
3. Tính kế thừa của class trừu tượng
Một class trừu tượng không thể được khởi tạo. Để truy cập các thành viên của một class trừu tượng, chúng ta phải kế thừa nó. Ví dụ:
abstract class Animal {
public void displayInfo() {
System.out.println("I am an animal.");
}
}
class Dog extends Animal {
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}
Kết quả:
I am an animal.
Trong ví dụ trên, chúng ta tạo ra một class trừu tượng là Animal. Chúng ta không thể tạo các đối tượng của class Animal. Để truy cập phương thức displayInfo() của Animal, chúng ta phải kế thừa subclass Dog của class Animal. Sau đó, chúng ta sử dụng đối tượng d1 của subclass Dog để truy cập phương thức displayInfo().
4. Sự ghi đè của các phương thức trừu tượng
Trong Java, ghi đè các phương thức trừu tượng của superclass trong subclass là điều bắt buộc. Đó là bởi vì subclass kế thừa các phương thức trừu tượng của superclass. Vì superclass của chúng ta chứa các phương thức trừu tượng, nên ở subclass chúng ta cần phải ghi đè chúng.
Ghi chú: nếu subclass cũng được khai báo là trừu tượng, thì không bắt buộc phải ghi đè các phương thức trừu tượng.
abstract class Animal {
abstract void makeSound();
public void eat() {
System.out.println("I can eat.");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Bark bark");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.makeSound();
d1.eat();
}
}
Kết quả:
Bark bark.
I can eat.
Trong ví dụ trên, chúng ta đã tạo ra một class trừu tượng là Animal. Class này chứa một phương thức trừu tượng là makeSound() và một phương thức không trừu tượng là eat().
Chúng ta đã kế thừa subclass dog từ superclass Animal. Ở đây, subclass dog ghi đè phương thức trừu tượng displayInfo().
Tiếp theo, chúng ta tạo ra một đối tượng d1 của class Dog. Sử dụng đối tượng này, chúng ta sẽ gọi các phương thức d1.displayInfo() và d1.eat().
5. Truy cập hàm tạo của các class trừu tượng
Tương tự như các class không trừu tượng, chúng ta có thể truy cập vào hàm tạo của class trừu tượng từ subclass sử dụng từ khóa super. Lấy ví dụ:
abstract class Animal {
Animal() {
….
}
}
class Dog extends Animal {
Dog() {
super();
...
}
}
Ở đây, chúng ta đã sử dụng super() bên trong hàm tạo của class dog để truy cập vào hàm tạo của class Animal.
Chú ý rằng từ khóa super luôn luôn phải là câu lệnh đầu tiên trong hàm tạo của subclass. Hãy tham khảo thêm từ khóa super trong Java để tìm hiểu thêm.
6. Tại Sao Java Lại Có Tính Trừu Tượng?
Tính trừu tượng là một thuật ngữ quan trọng của lập trình hướng đối tượng. Tính trừu tượng chỉ thể hiện những thông tin cần thiết và tất cả các chi tiết không cần thiết đều bị ẩn. Điều này cho phép chúng ta quản lí tính linh hoạt bằng cách bỏ qua hoặc ẩn đi các chi tiết bằng một ý tưởng đơn giản mà cao cấp hơn.
Một ví dụ thực tế về tính trừu tượng có thể là phanh xe máy. Chúng ta đều biết phanh xe để làm gì. Khi chúng ta kích hoạt bộ phanh, xe máy sẽ dừng lại. Tuy nhiên, hoạt động của phanh được ẩn đi khỏi chúng ta.
Ưu điểm chính của việc che đi hoạt động của phanh là bây giờ nhà sản xuất có thể điều chỉnh phanh khác nhau cho các loại xe máy khác nhau; tuy nhiên, cơ chế hoạt động của phanh vẫn giống nhau.
Hãy lấy một ví dụ giúp chúng ta hiểu rõ hơn về tính trừu tượng trong Java.
abstract class Animal {
abstract void makeSound();
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Bark bark.");
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println("Meows ");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.makeSound();
Cat c1 = new Cat();
c1.makeSound();
}
}
Kết quả:
Bark bark
Meows
Trong ví dụ trên, chúng ta đã tạo ra superclass Animal. Superclass này có phương thức trừu tượng là makeSound()
Phương thức makeSound() không thể được triển khai bên trong class Animal. Đó là bởi vì mỗi một animal lại có một tiếng kêu riêng. Do đó, mỗi subclass của superclass Animal phải có cách triển khai phương thức makeSound() khác nhau.
Chúng ta không thể triển khai phương thức makeSound() trong superclass Animal theo cách như kiểu nó sẽ đúng với toàn bộ các subclass của nó. Do đó, việc triển khai phương thức makeSound() trong Animal được ẩn đi.
Trong ví dụ trên, mỗi class Dog và Cat tự triển khai phương thức makeSound() riêng.
7. Các điểm quan trọng cần nhớ
Chúng ta sử dụng từ khóa abstract để tạo nên các class và phương thức trừu tượng.
Một phương thức trừu tượng chỉ được khai báo mà không có định nghĩa không thân hàm. Một lớp bao gồm phương thức abstract thì phải được khai báo là lớp abstract.
Chúng ta không thể tạo ra các đối tượng của một class trừu tượng.
Để triển khai các thuộc tính của một class trừu tượng, chúng ta phải kế thừa các subclass từ nó và tạo ra các đối tượng của subclass.
Một subclass phải ghi đè lên tất cả các phương thức trừu tượng. Tuy nhiên, nếu subclass đó được khai báo là trừu tượng, không bắt buộc phải ghi đè các phương thức trừu tượng.
Chúng ta có thể truy cập các thuộc tính và các phương thức tĩnh của một class trừu tượng bằng cách sử dụng tham chiếu của lớp trừu tượng. Ví dụ:
abstract class AClass{
static int bienA;
static void ham1(){
System.out.println("bienA = " + bienA);
}
}
class Main {
public static void main(String[] args) {
AClass.bienA = 5;
AClass.ham1();
}
}
Kết quả
bienA = 5
Ở ví dụ trên, truy xuất biến static bienA và phương thức static ham1()
bởi tên lớp abstract AClass.
8. Kết
Như vậy chúng ta đã tìm hiểu xong Lớp và phương thức trừu tượng trong lập trình hướng đối tượng. Cảm ơn các bạn đã theo dõi bài viết của mình. Chúc các bạn thành công. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn:
https://cafedev.vn/tu-hoc-java-class-truu-tuongabstract-va-phuong-thuc-truu-tuong-trong-java/