Abstract class trong java với ví dụ cụ thể

Một class được khai báo với từ khóa abstract được gọi là abstract class. Abstract class có thể chứa các abstract method và các method thông thường. Ngược lại đối với các class thông thường sẽ không thể có abstract method.

Một abstract class được khai báo bằng từ khoá abstract.

Một abstract method là một method được khai báo không có thân hàm.

Các class con thừa kế abstract class phải implement abstract method.

Abstract class không thể khởi tạo .

Đơn giản hoá đối tượng bằng cách đưa ra các thuộc tính và phương thức mà nó có và thực hiện.

Tập trung vào tính cốt lỗi của đối tượng. Ví dụ khi bạn xem method của class bất kỳ trong java chúng đều có mô tả rõ ràng về cách sử dụng, giá trị trả về, tham số truyền vào etc là bạn có thể sử dụng được.

Khai báo class Abstract

Khai báo abstract class
abstract class A{
   // Khai báo biến
   int n;
   // Khai báo abstract method
   abstract void myMethod();
   // Khai báo method thông thường
   void anotherMethod(){
      //Does something
   }
}

Tại sao cần abstract class?

Giả sử chúng ta có ví dụ sau, về Person là class cha, Boy, Girl thừa kế từ Person .

public class Person {
    void eat() {
        System.out.println("Person is eating");
    }
}

// ---------------------------------------------
public class Boy {
    void eat() {
        System.out.println("Boy is eating");
    }
}
// --------------------------------------------

public class Main {
    public static void main(String[] args) {
        Boy boy = new Boy();
        boy.eat();
    }
}

Măc dù Person đã định nghĩa method eat(), thế nhưng các class con BoyGirl đều phải override lại method eat() của Person để phù hợp. Trong thực thế nếu có thêm những class con Les, Gay thừa kế từ Person cũng đều phải override lại eat().

Vậy việc triển khai method eat() ở class Person là hoàn toàn dư thừa, và method eat() nên là một khuôn mẫu để các class khác thừa kế và tự triển khai lấy. Vì vậy java cung cấp cho chúng ta abstract class.

Các abstract method trong abstract class sẽ không có thân hàm và các class extends từ nó sẽ bắt buộc phải implement các method abstract.

Vậy chúng ta sẽ cùng implement lại ví dụ trước, mà Person sẽ trở thành abstract class với eat() là abstract method, vì nó ko cần định nghĩa ở class Person. Chúng ra sẽ thêm thuộc tính agegetAge() là method thông thường và được sử dụng ở các class con.

// File Person.java
public abstract class Person {
    int age;
    abstract void eat();
    
    void getAge() {
        System.out.println(this.age);
    }
}
// File Boy.java
public class Boy extends Person {

    Boy(int age) {
        // Khởi tạo age cho boy
        // this.age vẫn hợp lệ, vì Boy thừa kế từ Person nên nó cũng có thuộc tính age.
        super.age = age;
    }
    @Override
    void eat() {
        System.out.println("Boy is eating");
    }
}
// File Girl.java
public class Girl extends Person{

    Girl(int age) {
        // Ở đây mình dùng this cho các bạn thấy rõ. việc dùng super hoặc this trong trường hợp này là như nhau.
        this.age = age;
    }
    @Override
    void eat() {
        System.out.println("Girl is eating");
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        Person boy = new Boy(18);
        Person girl = new Girl(19);

        girl.eat();
        girl.getAge();

        boy.eat();
        boy.getAge();
    }
}

Output: 

Girl is eating
19
Boy is eating
18

Việc dùng abstract class sẽ giúp cho chúng ta dễ dàng control được ý muốn của mình. Nếu bạn muốn các thằng con của abstract class phải làm đều gì đó thì bạn khai báo abstract method, còn nếu như muốn cho các thằng con dùng chung thì bạn để method thông thường.

Abstract class và Concrete class trong java

Một class được khai báo với từ khoá abstract được gọi là abstract class, ngược lại được gọi là Concrete class. Như ví dụ trên thì Person là một abstract class và Boy, Girl là Concrete class.

Note:

  • Abstract class không thể khởi tạo, nó chỉ được sử dụng với mục đích cho các class khác thừa kế và mở rộng.
  • Abstract method nhất định phải chứa trong abstract class. Đồng nghĩa với việc Concrete class không thể chứa abstract method.
  • Abstract class có thể chứa abstract method hoặc method thông thường.
  • Abstract có thể trừu tượng hoá 100% bằng cách cung cấp tất cả các method đều là abstract method.
  • Abstract class có chứa cả method thông thường và abstract method là class có độ trừu tượng 0 – 100%.

Kết

Abstract class là một trong những công cụ mạnh để triển khai tính kế thừa trong lập trình hướng đối tượng. Tuy nhiên đừng có lạm dụng nó trong mọi trường hợp nhé. Mình nói đều này là vì lúc làm việc với các anh em trong team cứ mỗi lần cần đụng tới kế thừa là mọi người cứ tại một abstract class rồi cho các class con kế thừa, trong khi thằng abstract class chỉ chứa các thuộc tính sử dụng chung không hề có một abstract method nào? vậy abstract class để làm gì chúng ta có thể sử dụng một class thông thường cũng được mà! Nhớ nha, mọi class trong java đều có thể được thừa kế từ bất cứ class nào.

Ở bài sau chúng ta sẽ tìm hiểu về interface, interface được dùng như để xác định 100% trừu tượng về các method trong interface mặc định là abstract method. Các bạn sẽ không thể triển khai bất cứ hàm nào trong interface.  

Các bài viết liên quan

4.7 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x