Thứ Ba, 28 tháng 8, 2018

Java - Thừa kế

Học lập trình java thừa kế có thể được định nghĩa là quá trình mà một lớp thu được các thuộc tính (các phương thức và các trường) của một thuộc tính khác. Với việc sử dụng thừa kế, thông tin được quản lý theo thứ tự phân cấp.

Lớp thừa hưởng các thuộc tính của lớp khác được gọi là lớp con (lớp dẫn xuất, lớp con) và lớp có thuộc tính được thừa hưởng được gọi là lớp cha (lớp cơ sở, lớp cha).

mở rộng từ khóa

extends là từ khóa được sử dụng để kế thừa các thuộc tính của một lớp. Sau đây là cú pháp mở rộng từ khóa.

Cú pháp

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

Mã mẫu

Sau đây là một ví dụ thể hiện sự thừa kế Java. Trong ví dụ này, bạn có thể quan sát hai lớp là Tính toán và My_Calculation.

Sử dụng mở rộng từ khóa, My_Calculation kế thừa các phương thức addition () và phép trừ () của lớp tính toán.

Sao chép và dán chương trình sau vào tệp có tên My_Calculation.java

Thí dụ
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 mã trên như hình dưới đây.

javac My_Calculation.java
java My_Calculation

Sau khi thực hiện chương trình, nó sẽ tạo ra kết quả sau:

Đầu ra

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

học lập trình java
Trong chương trình đã cho, khi một đối tượng vào lớp My_Calculation được tạo ra, một bản sao của các 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 một lớp cha.

Biến tham chiếu Superclass có thể chứa đối tượng lớp con, nhưng sử dụng biến đó bạn chỉ có thể truy cập các thành viên của lớp cha, để truy cập vào các thành viên của cả hai lớp, 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ư được đưa ra dưới đây. Nhưng sử dụng biến tham chiếu superclass ( 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);
Ghi chú - Một lớp con kế thừa tất cả các thành viên (các trường, các 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, do đó chúng không được thừa kế 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 siêu từ khóa tương tự như này từ 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 để phân biệt các thành viên của siêu lớp từ các thành viên của phân lớp, nếu chúng có cùng tên.

Nó được sử dụng để gọi hàm tạo siêu lớp từ lớp con.

Phân biệt các thành viên

Nếu một lớp kế thừa các thuộc tính của một lớp khác. Và nếu các thành viên của lớp cha có tên giống với lớp con, để phân biệt các biến này, chúng tôi sử dụng siêu từ khóa như được hiển thị bên dưới.

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 từ khóa siêu .

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 display () với các 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 ta đang gọi phương thức display () của cả hai lớp và in giá trị của biến num của cả hai lớp. Ở đây bạn có thể quan sát thấy chúng ta đã sử dụng siêu từ khóa để phân biệt các thành viên của siêu lớp từ 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.

Thí dụ
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 mã trên bằng cách sử dụ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ả như sau:

Đầu ra

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 dựng siêu lớp

Nếu một lớp kế thừa các thuộc tính của một lớp khác, thì lớp con sẽ tự động nhận được 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 siêu như được hiển thị bên dưới.

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 siêu để gọi hàm tạo parametrized của lớp cha. Chương trình này chứa một siêu lớp và một lớp con, trong đó lớp cha chứa một hàm tạo tham số chấp nhận giá trị số nguyên và chúng tôi đã sử dụng từ khóa siêu để gọi hàm tạo tham số của lớp cha.

Sao chép và dán chương trình sau vào tệp có tên Subclass.java

Thí dụ
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 argd[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}
Biên dịch và thực thi mã trên bằng cách sử dụ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ả như sau:

Đầu ra

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 loại đối tượng đó. Chúng ta hãy xem cách từ khóa mở rộng được sử dụng để đạt được thừa kế.
public class Animal { class Animal {  
}}

public class Mammal mở rộng Animal {public class Mammal mở rộng Animal {     
}}

lớp công khai Bò sát mở rộng Động vật {lớp công khai Bò sát mở rộng Động vật {     
}}

public class Dog mở rộng động vật có vú {public class Dog mở rộng động vật có vú {     
}}
Bây giờ, dựa trên ví dụ trên, trong các thuật ngữ hướng đối tượng, sau đây là đúng

Động vật là siêu lớp của lớp Mammal.

Động vật là siêu lớp của lớp Bò sát.

Động vật có vú và Bò sát là các lớp con của lớp Động vật.

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 -

Động vật có vú IS-A

Bò sát IS-A Động vật

Chó IS-A Động vật có vú

Do đó: Chó IS-A động vật cũng

Với việc sử dụng từ khóa mở rộng, 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à một con vật với việc sử dụng toán tử instance.

Thí dụ
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

Đầu ra

true
true
true

Vì chúng tôi có hiểu biết tốt về từ khóa mở rộng , chúng ta hãy xem xét cách từ khóa thực hiện được sử dụng để có được mối quan hệ IS-A.

Nói chung, từ khóa thực hiện đượ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. Giao diện không bao giờ có thể được mở rộng bởi một lớp học.

Thí dụ
public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

Từ khóa của từ khóa

Chúng ta hãy sử dụng toán tử instanceof để kiểm tra xác định xem động vật có vú thực sự là một con vật, và con chó thực sự là một con vật.

Thí dụ
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

Đầu ra

true
true
true

Mối quan hệ HAS-A

Những mối quan hệ này chủ yếu dựa trên việc sử dụng. Này xác định liệu một lớp nhất định HAS-A điều nhất định. Mối quan hệ này giúp giảm trùng lặp mã cũng như lỗi.

Hãy xem xét một ví dụ

Thí dụ
public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
} 
Điều này cho thấy lớp Van HAS-A Speed. Bằng cách có một lớp riêng biệt cho Tốc độ, chúng tôi không phải đặt toàn bộ mã thuộc về tốc độ bên trong lớp Vân, điều này làm cho nó 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 phải bận tâm về đối tượng nào đang thực hiện công việc thực tế. Để đạt được điều này, lớp Vạn ẩn các chi tiết thực hiện từ những người dùng của lớp Văn. Vì vậy, về cơ bản những gì xảy ra là người dùng sẽ yêu cầu lớp Vân thực hiện một hành động nào đó và lớp Vân sẽ tự làm 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 loại thừa kế như được trình bày dưới đây.

học lập trình java
Một thực tế rất quan trọng cần nhớ là Java không hỗ trợ đa thừa kế. Đ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. Vì vậy sau đây là bất hợp pháp -

Thí dụ
public class extends Animal, Mammal{} 
Tuy nhiên, một lớp có thể thực hiện một hoặc nhiều giao diện, điều này đã giúp Java loại bỏ tính không thể thừa kế của nhiều thừa kế.

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...