Java Core - Tính kế thừa trong java

Tính kế thừa trong java

Kế thừa trong java 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.


Cú pháp của kế thừa trong java

Sử dụng từ khóa extends để kế thừa.

class Subclass-name extends Superclass-name {  
   //methods and fields
} 

Ví dụ về kế thừa trong java

class nhanVien {
	float salary = 1000;
}

class lapTrinhVien extends nhanVien {
	float bonus = 100;
}

public class Example01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		lapTrinhVien p = new lapTrinhVien();
		System.out.println("Tính kế thừa trong Java:");
		System.out.println("Lương của lập trình viên là: " + p.salary + " $");
		System.out.println("Lập trình viên được cộng thêm là: " + p.bonus + " $");
	}

}

Kết quả:

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

class dongVat {
	void eat() {
		System.out.println("Eating...");
	}
}

class suTu extends dongVat {
	void growl() {
		System.out.println("Growling...");
	}
}

public class Example02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		suTu st = new suTu();
		System.out.println("Ví dụ về đơn kết thừa:");
		st.eat();
		st.growl();
	}

}


Ví dụ về kế thừa nhiều cấp

class dongVat {
	void eat() {
		System.out.println("Eating...");
	}
}

class suTu extends dongVat {
	void growl() {
		System.out.println("Growling...");
	}
}

class suTuCon extends suTu {
	void weep() {
		System.out.println("Weeping...");
	}
}

public class Example03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		suTuCon st = new suTuCon();
		System.out.println("Ví dụ về kết thừa nhiều cấp:");
		st.eat();
		st.growl();
		st.weep();
	}

}

Kết quả:

 


Ví dụ về kế thừa thứ bậc

class dongVat {
	void eat() {
		System.out.println("Eating...");
	}
}

class suTu extends dongVat {
	void growl() {
		System.out.println("Growling...");
	}
}

class vit extends dongVat {
	void quack() {
		System.out.println("quack-quack...");
	}
}

public class Example04 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		vit st = new vit();
		System.out.println("Ví dụ về kết thừa thứ bậc:");
		st.eat();
		st.quack();
		//st.growl(); // compile error
	}
	
}

Kết quả:


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 Example05 extends A,B {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		C object = new C();
		object.msg();
	}

}

Kết quả: