Tính kế thừa (Inheritance) trong java

1. Tính kế thừa là gì?

Tính kế thừa (Inheritance) là một trong bốn tính chất cơ bản của lập trình hướng đối tượng trong Java.

Kế thừa là sự liên quan giữa hai class với nhau, trong đó có class cha (superclass) và class con (subclass). Khi kế thừa class con được hưởng tất cả các phương thức và thuộc tính của class cha. Tuy nhiên, nó chỉ được truy cập các thành viên public và protected của class cha. Nó không được phép truy cập đến thành viên private của class cha.

Tư tưởng của kế thừa trong java là có thể tạo ra một class mới được xây dựng trên các lớp đang tồn tại. Khi kế thừa từ một lớp đang tồn tại bạn có sử dụng lại các phương thức và thuộc tính của lớp cha, đồng thời có thể khai báo thêm các phương thức và thuộc tính khác.

Từ khóa extends được sử dụng để thể hiện sự kế thừa của một lớp.

Cú pháp:

class Super {
 
}
 
class Sub extends Super {
 
}

Ví dụ:

public class Employee {
 
    protected float salary = 40000;
 
}
 
public class Programmer extends Employee {
 
    int bonus = 10000;
 
    public static void main(String args[]) {
        Programmer p = new Programmer();
        System.out.println("Programmer salary is:" + p.salary);
        System.out.println("Bonus of Programmer is:" + p.bonus);
    }
 
}

Trong ví dụ trên, class Programmer là con của class Employee, nên nó được phép truy cập đến field salary của class Programmer.

2. Các kiểu kế thừa trong java

Có 3 kiểu kế thừa trong java: đơn kế thừa (single), kế thừa nhiều cấp (multilevel), kế thừa thứ bậc (hierarchical).

Khi một class được kế thừa từ nhiều class đươc gọi là đa kế thừa.

Trong java, một class không được phép thừa kế từ nhiều class, có thể cài đặt (implement) nhiều interface. Tuy nhiên, một interface có thể thừa kế nhiều interface.

2.1. Thừa kế đơn (Single Inheritance):

public class Animal {
    public void eat() {
        System.out.println("eating...");
    }
}
 
public class Dog extends Animal {
    public void bark() {
        System.out.println("barking...");
    }
}
 
public class TestInheritance {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.bark();
        d.eat();
    }
}

Kết quả:

barking...
eating...

2.2. Thừa kế nhiều cấp (Multilevel Inheritance):

public class Animal {
    public void eat() {
        System.out.println("eating...");
    }
}
 
public class Dog extends Animal {
    public void bark() {
        System.out.println("barking...");
    }
}
 
public class BabyDog extends Dog {
    public void weep() {
        System.out.println("weeping...");
    }
}
 
public class TestInheritance2 {
    public static void main(String args[]) {
        BabyDog d = new BabyDog();
        d.weep();
        d.bark();
        d.eat();
    }
}

Kết quả:

weeping...
barking...
eating...

2.3. Thừa kế thứ bậc (Hierarchical Inheritance):

class Animal {
    public void eat() {
        System.out.println("eating...");
    }
}
 
class Dog extends Animal {
    public void bark() {
        System.out.println("barking...");
    }
}
 
public class Cat extends Animal {
    public void meow() {
        System.out.println("meowing...");
    }
}
 
public class TestInheritance3 {
    public static void main(String args[]) {
        Cat c = new Cat();
        c.meow();
        c.eat();
    }
}

Kết quả:

meowing...
eating...

3. Một số câu hỏi liên quan đến tính thừa kế trong Java

3.1. Tại sao sử dụng tính kế thừa trong Java?

  • Để ghi đè phương thức (Method Overriding), do đó có thể thu được tính đa hình tại runtime.
  • Để làm tăng tính tái sử dụng của code.

3.2. Tại sao đa kế thừa không được support trong java?

Để giảm thiểu sự phức tạp và đơn giản hóa ngôn ngữ, đa kế thừa không được support trong java.

Hãy suy xét kịch bản sau: Có 3 lớp A, B, C. Trong đó lớp C kế thừa từ các lớp A và B. Nếu các lớp A và B có phương thức giống nhau và bạn gọi nó từ đối tượng của lớp con, như vậy khó có thể xác đinh được việc gọi phương thức của lớp A hay B.

Vì vậy lỗi khi biên dịch sẽ tốt hơn lỗi khi runtime, java sẽ print ra lỗi “compile time error” nếu bạn cố tình kế thừa 2 class.

public class Printable {
void print() {
System.out.println("Printable");
}
}

public class Showable {
void print() {
System.out.println("Showable");
}
}

// Không thể thực hiện đa thừa kế với class
public class MultiHeritanceExample extends Printable, Showable {
public static void main(String args[]) {
MultiHeritanceExample obj = new MultiHeritanceExample();
obj.print();  // Không thể xác định được gọi phương thức print() của class nào
}
}

Related posts:

Java Program to Implement Coppersmith Freivald’s Algorithm
Java Program to Generate Random Hexadecimal Byte
Converting Between an Array and a Set in Java
Java Program to Implement ConcurrentLinkedQueue API
Java equals() and hashCode() Contracts
Java Program to Implement Hash Tables Chaining with Doubly Linked Lists
Using JWT with Spring Security OAuth (legacy stack)
Java TreeMap vs HashMap
A Guide to JPA with Spring
Java Program to Perform Quick Sort on Large Number of Elements
Java – String to Reader
Java Program to Check if a Directed Graph is a Tree or Not Using DFS
Java Program to Implement the Bin Packing Algorithm
Java Program to Implement Hash Tables with Quadratic Probing
Java Program to Delete a Particular Node in a Tree Without Using Recursion
An Intro to Spring Cloud Contract
Spring Boot - Google OAuth2 Sign-In
Java Program to Find kth Smallest Element by the Method of Partitioning the Array
Java Program to Find Nearest Neighbor for Dynamic Data Set
Java Program to Check whether Undirected Graph is Connected using DFS
Tips for dealing with HTTP-related problems
Compare Two JSON Objects with Jackson
A Custom Media Type for a Spring REST API
Spring RestTemplate Request/Response Logging
Merging Two Maps with Java 8
Setting a Request Timeout for a Spring REST API
StringBuilder vs StringBuffer in Java
Hướng dẫn Java Design Pattern – Facade
Java Program to Find the Edge Connectivity of a Graph
HashSet trong java
Tổng quan về ngôn ngữ lập trình java
Quick Intro to Spring Cloud Configuration

2 Trackbacks / Pingbacks

  1. 4 tính chất của lập trình hướng đối tượng trong Java – Blog của VietMX
  2. Giới thiệu Design Patterns - Blog của VietMX

Comments are closed.