NỘI DUNG BÀI VIẾT
Kế thừa trong Java là một trong những khái niệm cốt lõi của Lập trình hướng đối tượng. Kế thừa trong Java được sử dụng khi chúng ta có mối quan hệ là một giữa các đối tượng. Kế thừa trong Java được thực hiện bằng cách sử dụng từ khóa extends.
Kế thừa trong Java
Kế thừa trong Java là phương pháp tạo hệ thống phân cấp giữa các lớp bằng cách kế thừa từ các lớp khác.
Kế thừa Java có tính bắc cầu – vì vậy nếu Sedan extends Car và Car extends Vehicle, thì Sedan cũng được kế thừa từ Vehicle. Vehicle trở thành lớp siêu cấp của cả Car và Sedan.
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.
Cú pháp của kế thừa trong Java
class Subclass-name extends Superclass-name {
//methods and fields
}
Code language: JavaScript (javascript)
Ví dụ về kế thừa trong Java
Mọi lớp trong java đều extends lớp java.lang.Object. Vì vậy, lớp Object nằm ở cấp cao nhất của hệ thống phân cấp kế thừa trong java.
Superclass: Animal
public class Animal { private boolean vegetarian; private String eats; private int noOfLegs; public Animal(){} public Animal(boolean veg, String food, int legs){ this.vegetarian = veg; this.eats = food; this.noOfLegs = legs; } public boolean isVegetarian() { return vegetarian; } public void setVegetarian(boolean vegetarian) { this.vegetarian = vegetarian; } public String getEats() { return eats; } public void setEats(String eats) { this.eats = eats; } public int getNoOfLegs() { return noOfLegs; } public void setNoOfLegs(int noOfLegs) { this.noOfLegs = noOfLegs; } }
Subclass: Cat
public class Cat extends Animal{ private String color; public Cat(boolean veg, String food, int legs) { super(veg, food, legs); this.color="White"; } public Cat(boolean veg, String food, int legs, String color){ super(veg, food, legs); this.color=color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
class Employee {
float salary = 1000;
}
class Programmer extends Employee {
int bonus = 150;
}
public class InheritanceSample1 {
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);
}
}
Code language: JavaScript (javascript)
Kết quả:
Programmer salary is: 1000.0 Bonus of Programmer is: 150
Trong ví dụ trên class Programmer là con của class Employee, nên nó được phép truy cập đến trường salary của class cha.
Các kiểu kế thừa trong java
Có 3 kiểu kế thừa trong java đó là đơn kế thừa, kế thừa nhiều cấp, kế thừa thứ bậc.
Khi một class được kế thừa từ nhiều class đươc gọi là đa kế thừa. Trong java, đa kế thừa chỉ được support thông qua interface, như đã được nói đến trong bài interface trong java
Chú ý: Đa kế thừa trong java không được support thông qua class.
Ví dụ về đơn kế thừa
File: TestInheritance1.java
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("barking...");
}
}
public class TestInheritance1 {
public static void main(String args[]) {
Dog d = new Dog();
d.bark();
d.eat();
}
}
Code language: JavaScript (javascript)
Output:
barking... eating...
Ví dụ về kế thừa nhiều cấp
File: TestInheritance2.java
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("barking...");
}
}
class BabyDog extends Dog {
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();
}
}
Code language: JavaScript (javascript)
Kết quả:
weeping... barking... eating...
Ví dụ về kế thừa thứ bậc
File: TestInheritance3.java
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("barking...");
}
}
class Cat extends Animal {
void meow() {
System.out.println("meowing...");
}
}
public class TestInheritance3 {
public static void main(String args[]) {
Cat c = new Cat();
c.meow();
c.eat();
// c.bark(); // compile error
}
}
Code language: JavaScript (javascript)
Kết quả:
meowing... eating...
Câu hỏi: 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.
class A {
void msg() {
System.out.println("Hello");
}
}
class B {
void msg() {
System.out.println("Welcome");
}
}
public class C extends A,B {
public static void main(String args[]) {
C obj = new C();
obj.msg();
}
}
Code language: JavaScript (javascript)
Kết quả:
Compile Time Error
Trên đây là những kiến thức về kế thừa trong Java. Happy learning!!!