Mục lục
Tính Thừa kế trong java
Khái niệm
Thừa kế trong java là một cơ chế cho phép các class con có thể tái sử dụng các thuộc tính và phương thức của class cha.
Thừa kế là tính chất khá quan trọng trong lập trình hướng đối tượng, giúp giảm thiểu code và thời gian xây dựng đáng kể.
Thừa kế đại diện cho mối quan hệ IS – A hay còn được gọi là mối quan hệ cha con.
Class cha: là class chứa class thuộc tính và function được sử dụng bởi các class khác.
Class con: là class thừa kế các các chức năng của class khác như thuộc tính, function etc.
Thừa kế là một kỹ thuật mà chúng ta sẽ định nghĩa một class cơ sở(base class) chứa các data và method phổ biến (được dùng bởi tất cả các class con)
Từ những data và method đã được base class define. Các class con có thể thừa kế mà không cần triển khai lại.
Cú pháp thừa kế trong java
class Subclass extends Superclass { // methods and fields }
Ví dụ thừa kế
Trong ví dụ này chúng ta sẽ có class Shape là base class và Rectange là class con sẽ thừa kế Shape.
Shape.java
// File Shape.java public class Shape { String category = "Shape"; public void printName(String name) { System.out.println("Loai hinh: " + category); System.out.println("Name: " + name); } }
Rectangle.java
// File Rectangle.java public class Rectangle extends Shape { String name; Rectangle() { name = "shareprogramming.net"; } void display() { // Gọi hàm printName được định nghĩa từ class Cha printName(name); } }
Main.java
// File Main.java public class Main { public static void main(String[] args) { Rectangle rectangle = new Rectangle(); rectangle.display(); } }
output:
Loai hinh: Shape
Name: shareprogramming.net
Như vậy chúng ta đã sử dụng data là category và method là printName() của base class. Nếu chúng ta có thêm class Triangle cũng thừa kế từ Shape và nó cũng sử dụng các thuộc tính và method của base class thì code của chúng ta sẽ giảm thiểu đáng kể.
Các loại thừa kế
Trong java có 3 loại thừa kế chính: Single, MultiLevel, Hierarchical.
Single Inheritance (Đơn thừa kế)
Đơn thừa kế trong java là kiểu thừa kế trong đó có chỉ có class con extends class cha. Như ví dụ ở trên của mình
Rectangle extends Shape
OR
Triangle extends Shape
MultiLevel Inheritance(Thừa kế đa cấp)
Khi có một class A extends B, và A lại được C extends, cứ như vậy thì chúng ta có thừa kế đa cấp.
Chúng ta có ví dụ Animal là base cho tất cả các loài động vật. Class Cat(mèo) thừa kế lớp Animal, chúng ta có các loại mèo khác nhau với các tính chất khác nhau như mèo tai cụp Scottish Fold.
// File Animal.java public class Animal { void category(String cate) { System.out.println("Category: " + cate); } }
// File Cat.java public class Cat extends Animal { int v; void run() { // Gọi hàm category được định nghĩa từ class cha Animal category("Cat"); System.out.println("running: " + v); } }
// File ScottishFold.java public class ScottishFold extends Cat { ScottishFold () { // biến v được khởi tạo từ class cha Cat v = 15; } }
// File Main.java public class Main { public static void main(String[] args) { ScottishFold scottishFold = new ScottishFold(); // Gọi hàm run được định nghĩa từ class cha Cat scottishFold.run(); } }
Output:
Category: Cat
running: 15
Hierarchical Inheritance(Kế thừa phân cấp)
Kế thừa phân cấp là kiểu kế thừa mà trong đó một class cha A được kể thừa bởi nhiều class con B,C, etc.
Ví dụ chúng ta có vẫn sẽ có class Animal và Cat thừa kế Animal. Chúng ta sẽ thêm class Dog cũng thừa kế Animal. Như vậy chúng ta có kế thừa phân cấp.
// File Animal.java public class Animal { String cate; void hello() { System.out.println("Hello: " + cate); } } //File Cat.java public class Cat extends Animal { Cat() { // gán thuộc tính cate được định nghĩa từ class Animal cate = "Cat"; } } // File Dog.java public class Dog extends Cat { Dog() { // gán thuộc tính cate được định nghĩa từ class Animal cate = "Dog"; } } //File Main.java public class Main { public static void main(String[] args) { Cat cat = new Cat(); Dog dog = new Dog(); cat.hello(); dog.hello(); } }
Output:
Hello: Cat
Hello: Dog
Đơn thừa kế trong java
Một vấn đề xảy ra là khi một class C thừa kế A và B, nếu A và C đều define một method X(), thì A sẽ không biết sử dụng method của bên nào.
Để giải quyết vấn đề trên có rất nhiều cách, một trong những cách đó là không hỗ trợ đa thừa kế.
Vậy có cách nào cho tôi thực hiện đa thừa kế trong java không? Vấn đề này mình đã có nhắc đến ở bài viết này.