Java - Kế thừa
Kế thừa có thể được định nghĩa là quá trình mà một lớp có được các thuộc tính (phương thức và trường) của lớp khác. Với việc sử dụng tính kế thừa, thông tin được quản lý theo một thứ tự phân cấp.
Lớp kế thừa các thuộc tính của khác được gọi là lớp con (lớp dẫn xuất, lớp con) và lớp có các thuộc tính được kế thừa được gọi là lớp cha (lớp cơ sở, lớp cha).
mở rộng từ khóa
extendslà từ khóa dùng để kế thừa các thuộc tính của một lớp. Sau đây là cú pháp của từ khóa expand.
Syntax
class Super {
.....
.....
}
class Sub extends Super {
.....
.....
}
Mã mẫu
Sau đây là một ví dụ minh họa sự kế thừa Java. Trong ví dụ này, bạn có thể quan sát hai lớp là Tính toán và Tính_tính của tôi.
Sử dụng từ khóa expand, My_Calculation kế thừa các phương thức add () và Subtraction () của lớp Tính toán.
Sao chép và dán chương trình sau vào một tệp có tên My_Calculation.java
Example
class Calculation {
int z;
public void addition(int x, int y) {
z = x + y;
System.out.println("The sum of the given numbers:"+z);
}
public void Subtraction(int x, int y) {
z = x - y;
System.out.println("The difference between the given numbers:"+z);
}
}
public class My_Calculation extends Calculation {
public void multiplication(int x, int y) {
z = x * y;
System.out.println("The product of the given numbers:"+z);
}
public static void main(String args[]) {
int a = 20, b = 10;
My_Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
demo.multiplication(a, b);
}
}
Biên dịch và thực thi đoạn mã trên như hình dưới đây.
javac My_Calculation.java
java My_Calculation
Sau khi thực thi chương trình sẽ cho kết quả như sau:
Output
The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200
Trong chương trình đã cho, khi một đối tượng My_Calculationlớp được tạo, một bản sao nội dung của lớp cha được tạo bên trong nó. Đó là lý do tại sao, bằng cách sử dụng đối tượng của lớp con, bạn có thể truy cập các thành viên của lớp cha.
Biến tham chiếu Superclass có thể chứa đối tượng của lớp con, nhưng sử dụng biến đó, bạn chỉ có thể truy cập vào các thành viên của lớp cha, do đó, để truy cập vào các thành viên của cả hai lớp, bạn nên luôn tạo biến tham chiếu cho lớp con.
Nếu bạn xem xét chương trình trên, bạn có thể khởi tạo lớp như dưới đây. Nhưng sử dụng biến tham chiếu lớp cha (cal trong trường hợp này) bạn không thể gọi phương thức multiplication(), thuộc về lớp con My_Calculation.
Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
Note- Một lớp con kế thừa tất cả các thành viên (trường, phương thức và các lớp lồng nhau) từ lớp cha của nó. Các hàm tạo không phải là thành viên, vì vậy chúng không được kế thừa bởi các lớp con, nhưng hàm tạo của lớp cha có thể được gọi từ lớp con.
Từ khóa siêu
Các super từ khóa tương tự như thistừ khóa. Sau đây là các tình huống mà từ khóa siêu được sử dụng.
Nó được sử dụng để differentiate the members của lớp cha từ các thành viên của lớp con, nếu chúng có cùng tên.
Nó được sử dụng để invoke the superclass phương thức khởi tạo từ lớp con.
Phân biệt các thành viên
Nếu một lớp đang kế thừa các thuộc tính của lớp khác. Và nếu các thành viên của lớp cha có tên giống lớp con, để phân biệt các biến này chúng ta sử dụng từ khóa super như hình dưới đây.
super.variable
super.method();
Mã mẫu
Phần này cung cấp cho bạn một chương trình thể hiện việc sử dụng super từ khóa.
Trong chương trình đã cho, bạn có hai lớp là Sub_class và Super_class , cả hai đều có một phương thức có tên là display () với các cách triển khai khác nhau và một biến có tên là num với các giá trị khác nhau. Chúng tôi đang gọi phương thức display () của cả hai lớp và in ra giá trị của biến num của cả hai lớp. Ở đây bạn có thể thấy rằng chúng tôi đã sử dụng từ khóa super để phân biệt các thành viên của lớp cha với lớp con.
Sao chép và dán chương trình vào một tệp có tên Sub_class.java.
Example
class Super_class {
int num = 20;
// display method of superclass
public void display() {
System.out.println("This is the display method of superclass");
}
}
public class Sub_class extends Super_class {
int num = 10;
// display method of sub class
public void display() {
System.out.println("This is the display method of subclass");
}
public void my_method() {
// Instantiating subclass
Sub_class sub = new Sub_class();
// Invoking the display() method of sub class
sub.display();
// Invoking the display() method of superclass
super.display();
// printing the value of variable num of subclass
System.out.println("value of the variable named num in sub class:"+ sub.num);
// printing the value of variable num of superclass
System.out.println("value of the variable named num in super class:"+ super.num);
}
public static void main(String args[]) {
Sub_class obj = new Sub_class();
obj.my_method();
}
}
Biên dịch và thực thi đoạn mã trên bằng cú pháp sau.
javac Super_Demo
java Super
Khi thực hiện chương trình, bạn sẽ nhận được kết quả sau:
Output
This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20
Gọi hàm tạo siêu lớp
Nếu một lớp đang kế thừa các thuộc tính của một lớp khác, lớp con sẽ tự động lấy hàm tạo mặc định của lớp cha. Nhưng nếu bạn muốn gọi một hàm tạo tham số của lớp cha, bạn cần sử dụng từ khóa super như hình dưới đây.
super(values);
Mã mẫu
Chương trình được đưa ra trong phần này trình bày cách sử dụng từ khóa super để gọi hàm tạo tham số của lớp cha. Chương trình này chứa một lớp cha và một lớp con, trong đó lớp cha chứa một phương thức khởi tạo được tham số hóa chấp nhận một giá trị nguyên và chúng tôi đã sử dụng từ khóa super để gọi phương thức khởi tạo tham số hóa của lớp cha.
Sao chép và dán chương trình sau vào một tệp có tên Subclass.java
Example
class Superclass {
int age;
Superclass(int age) {
this.age = age;
}
public void getAge() {
System.out.println("The value of the variable named age in super class is: " +age);
}
}
public class Subclass extends Superclass {
Subclass(int age) {
super(age);
}
public static void main(String args[]) {
Subclass s = new Subclass(24);
s.getAge();
}
}
Biên dịch và thực thi đoạn mã trên bằng cú pháp sau.
javac Subclass
java Subclass
Khi thực hiện chương trình, bạn sẽ nhận được kết quả sau:
Output
The value of the variable named age in super class is: 24
Mối quan hệ IS-A
IS-A là một cách nói: Đối tượng này là một kiểu của đối tượng đó. Hãy để chúng tôi xem làm thế nàoextends từ khóa được sử dụng để đạt được tính kế thừa.
public class Animal {
}
public class Mammal extends Animal {
}
public class Reptile extends Animal {
}
public class Dog extends Mammal {
}
Bây giờ, dựa trên ví dụ trên, trong thuật ngữ Hướng đối tượng, những điều sau là đúng:
- Động vật là lớp cha của lớp Động vật có vú.
- Động vật là lớp phụ của lớp Bò sát.
- Động vật có vú và Bò sát là các phân lớp của lớp Thú.
- Chó là lớp con của cả hai lớp Động vật có vú và Động vật.
Bây giờ, nếu chúng ta xem xét mối quan hệ IS-A, chúng ta có thể nói -
- Mammal IS-A Animal
- Bò sát IS-A Animal
- Dog IS-A Mammal
- Do đó: Chó cũng là động vật
Với việc sử dụng từ khóa expand, các lớp con sẽ có thể kế thừa tất cả các thuộc tính của lớp cha ngoại trừ các thuộc tính riêng của lớp cha.
Chúng ta có thể đảm bảo rằng Động vật có vú thực sự là Động vật với việc sử dụng toán tử cá thể.
Example
class Animal {
}
class Mammal extends Animal {
}
class Reptile extends Animal {
}
public class Dog extends Mammal {
public static void main(String args[]) {
Animal a = new Animal();
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
Điều này sẽ tạo ra kết quả sau:
Output
true
true
true
Vì chúng tôi đã hiểu rõ về extends từ khóa, chúng ta hãy xem xét cách implements từ khóa được sử dụng để lấy mối quan hệ IS-A.
Nói chung, implementstừ khóa được sử dụng với các lớp để kế thừa các thuộc tính của một giao diện. Các giao diện không bao giờ có thể được mở rộng bởi một lớp.
Example
public interface Animal {
}
public class Mammal implements Animal {
}
public class Dog extends Mammal {
}
Phiên bản của Từ khoá
Hãy để chúng tôi sử dụng instanceof để kiểm tra xác định xem Động vật có vú có thực sự là Động vật hay không và chó thực sự là Động vật.
Example
interface Animal{}
class Mammal implements Animal{}
public class Dog extends Mammal {
public static void main(String args[]) {
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
Điều này sẽ tạo ra kết quả sau:
Output
true
true
true
HAS-A mối quan hệ
Các mối quan hệ này chủ yếu dựa trên cách sử dụng. Điều này xác định xem một lớp nhất địnhHAS-Ađiều chắc chắn. Mối quan hệ này giúp giảm thiểu trùng lặp mã cũng như lỗi.
Hãy xem xét một ví dụ -
Example
public class Vehicle{}
public class Speed{}
public class Van extends Vehicle {
private Speed sp;
}
Điều này cho thấy Van HAS-A Speed đẳng cấp. Bằng cách có một lớp riêng biệt cho Tốc độ, chúng ta không phải đặt toàn bộ mã thuộc về tốc độ bên trong lớp Van, điều này có thể sử dụng lại lớp Tốc độ trong nhiều ứng dụng.
Trong tính năng Hướng đối tượng, người dùng không cần bận tâm về đối tượng nào đang thực hiện công việc thực sự. Để đạt được điều này, lớp Van ẩn các chi tiết triển khai với người dùng của lớp Van. Vì vậy, về cơ bản những gì sẽ xảy ra là người dùng sẽ yêu cầu lớp Van thực hiện một hành động nhất định và lớp Van sẽ tự thực hiện công việc đó hoặc yêu cầu một lớp khác thực hiện hành động đó.
Các loại thừa kế
Có nhiều kiểu kế thừa như minh họa bên dưới.
Một thực tế rất quan trọng cần nhớ là Java không hỗ trợ đa kế thừa. Điều này có nghĩa là một lớp không thể mở rộng nhiều hơn một lớp. Do đó, việc làm theo là bất hợp pháp -
Example
public class extends Animal, Mammal{}
Tuy nhiên, một lớp có thể triển khai một hoặc nhiều giao diện, điều này đã giúp Java thoát khỏi tình trạng đa thừa kế bất khả thi.