CodeGym/Blog Java/Ngẫu nhiên/Kế thừa trong Java

Kế thừa trong Java

Xuất bản trong nhóm
Java là một ngôn ngữ hướng đối tượng. Điều này có nghĩa là mọi thứ trong Java đều bao gồm các lớp và đối tượng của chúng, đồng thời tuân theo mô hình OOP (lập trình hướng đối tượng). Một mô hình như vậy là tính kế thừa, một cơ chế trong Java mà theo đó một lớp được phép kế thừa các tính năng (trường và phương thức) của lớp khác. Nói một cách đơn giản, trong Java, kế thừa có nghĩa là tạo các lớp mới dựa trên các lớp hiện có. Kế thừa trong Java - 1

Các tác nhân chính của tính kế thừa trong Java

  • Kế thừa là khái niệm mà một lớp có thể lặp lại một phần hoặc hoàn toàn các thuộc tính và phương thức của lớp cha (lớp mà nó kế thừa).
  • Lớp con, lớp con, lớp mở rộng hoặc lớp dẫn xuất là lớp kế thừa từ một lớp khác.
  • Lớp cha, lớp cha hoặc lớp cơ sở là một lớp có một số hàm và các hàm này có thể được truyền (kế thừa) bởi một lớp khác (lớp con).
  • Ghi đè phương thức đang thay đổi hành vi của phương thức lớp dẫn xuất. Đây thường là hành vi cụ thể, tinh tế hơn. Nếu bạn ghi đè một phương thức trong phần thừa kế đã có trong lớp cha, thì nó sẽ thay thế phương thức cha.
  • Một lớp chỉ có thể có một lớp tổ tiên, nhưng mỗi lớp có thể có nhiều "con".

Làm thế nào nó hoạt động

Chuỗi kế thừa được hướng từ lớp trừu tượng nhất đến lớp cụ thể hơn. Tức là siêu lớp là lớp trừu tượng nhất trong chuỗi các lớp. Thông thường nó được biểu thị là trừu tượng (lớp cơ sở không yêu cầu triển khai). Tất cả các lớp học tiếp theo đều cụ thể hơn. Ví dụ: có một lớp tên là “Tiện ích”. Nó có thể có dung lượng pin trường “trọng lượng”, mức sạc trường và các phương thức (hoặc hành vi) “công việc” và sạc. Trong trường hợp này, các phương thức có thể trừu tượng, nghĩa là chúng không có cách triển khai cụ thể. Mặc dù chúng tôi không thể nói nó là loại thiết bị gì nhưng nó hoàn toàn là bất kỳ thiết bị nào có thể sạc lại. Hãy tạo một lớp con Điện thoại của lớp Tiện ích. Nó không còn cần phải xác định lại trọng lượng và pin nữa, nó chỉ cần kế thừa chúng từ tiện ích trừu tượng. Nhưng hành vi của công việc sẽ cần phải được làm rõ. Bạn cũng có thể thêm các trường khác “đường chéo màn hình”, trình kết nối, v.v. Bạn có thể thêm một phương thức mới “Cập nhật hệ điều hành”. Tiếp theo, chúng ta có thể tạo thêm hai lớp nữa và cả hai sẽ được kế thừa từ Điện thoại, Android và iPhone. Cả hai lớp đều kế thừa tất cả các trường và phương thức của Tiện ích và Điện thoại thông minh, đồng thời các phương thức này có thể bị ghi đè. Loại đầu tiên cần trường "Tên thương hiệu", trong khi iPhone không cần trường này vì chỉ có một công ty sản xuất điện thoại thông minh như vậy.
class Gadget {}
}
//subclass of Gadget class
class Phone extends Gadget {}
//subclass of Phone class
class IPhone extends Phone {}
//subclass of Phone class
class AndroidPhone extends Phone {}
Một lớp con kế thừa tất cả các thành viên public và protected của lớp cha. Việc lớp con nằm trong gói nào không quan trọng. Nếu lớp con nằm trong cùng gói với lớp cha, thì nó cũng kế thừa các thành viên riêng tư của gói cha. Bạn có thể sử dụng nguyên các thành viên được kế thừa, thay thế, ẩn chúng hoặc thêm thành viên mới:
  • Bạn có thể sử dụng trực tiếp các trường được kế thừa, chẳng hạn như bất kỳ trường nào khác.
  • Bạn có thể khai báo một trường trong lớp con có cùng tên với lớp cha. Nó đang che giấu nó (vì vậy tốt hơn là đừng làm điều đó).
  • Bạn có thể khai báo các trường mới trong lớp con (những trường mà lớp cha không có).
  • Các phương thức kế thừa có thể được sử dụng trực tiếp mà không cần ghi đè trong lớp dẫn xuất.
  • Ngoài ra, bạn có thể viết một phương thức cá thể mới trong một lớp con có cùng chữ ký với một phương thức trong lớp cha. Thủ tục này sẽ ghi đè lên nó.
  • Bạn có thể khai báo các phương thức mới trong lớp con chưa được khai báo trong lớp Cha.
  • Bạn có thể viết một hàm tạo của lớp con gọi hàm tạo của lớp cha một cách ngầm định hoặc bằng từ khóa super.

Ví dụ

Hãy tạo một lớp MusicalInstrument cơ bản với các trường trọng số và nhãn hiệu cũng như phương thức work() . Chúng tôi cũng định nghĩa một hàm tạo.
public class MusicalInstrument {
   int weight;
   String tradeMark;

   public MusicalInstrument(int weight, String tradeMark) {
       this.weight = weight;
       this.tradeMark = tradeMark;
   }

   public void work() {
       System.out.println("the instrument is playing...");
   }
}
Hoàn toàn không rõ nó là loại nhạc cụ gì và chơi nó như thế nào. Hãy tạo ra một nhạc cụ cụ thể hơn, violin. Nó sẽ có các trường giống như trong Nhạc cụ (chúng sẽ được gọi trong hàm tạo bằng cách sử dụng từ khóa super. Chúng ta cũng có thể ghi đè phương thức làm việc và tạo phương thức thiết lập dây đàn violin theo chuỗi.
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

   @Override
   public void work() {
       System.out.println("THe violin's playing");

   }

   public void violinTuning () {
     System.out.println("I'm tuning 1st string...");
     System.out.println("I'm tuning 2nd string...");
     System.out.println("I'm tuning 3rd string...");
     System.out.println("I'm tuning 4th string...");
}


}
Hãy tạo một lớp Demo để kiểm tra lớp Violin và xem chính xác cách hoạt động của tính kế thừa.
public class InheritDemo {

   public static void main(String[] args) {

       Violin violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       violin.violinTuning();
       violin.work();
   }
}
Trong trường hợp này, đầu ra của chương trình sẽ như sau:
Tôi đang chỉnh dây 1... Tôi đang chỉnh dây 2... Tôi đang chỉnh dây 3... Tôi đang chỉnh dây 4... Đàn violin đang chơi
Nghĩa là, nếu có một phương thức bị ghi đè trong lớp con thì phương thức tổ tiên sẽ không còn được gọi nữa. Nếu nó không có ở đó thì sao? Tức là lớp Violin trông như thế này:
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

  // @Override


 //  }

   public void violinTuning () {
       System.out.println("I'm tuning 1st string...");
       System.out.println("I'm tuning 2nd string...");
       System.out.println("I'm tuning 3rd string...");
       System.out.println("I'm tuning 4th string...");
   }

}
Đầu ra là:
Tôi đang lên dây 1... Tôi đang lên dây 2... Tôi đang lên dây 3... Tôi đang lên dây 4... nhạc cụ đang chơi...
Tức là phương thức tổ tiên sẽ được gọi tự động. Nhân tiện, lớp con có thể được định nghĩa thông qua lớp tổ tiên, nghĩa là để thực hiện việc truyền tải:
Parent parent = new Child()
Việc khởi tạo này được sử dụng để chỉ truy cập các thành viên có trong lớp cha và các phương thức được ghi đè. Trong ví dụ của chúng tôi nó sẽ là:
public class InheritDemo {

   public static void main(String[] args) {

       MusicalInstrument violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       //violin.violinTuning();
       violin.work();
   }
}
Trong trường hợp như vậy, chúng tôi không thể định cấu hình phương thức violin. Tuy nhiên, cùng lúc đó, phương thức work() của lớp con sẽ được gọi nếu nó tồn tại.

Hệ thống phân cấp lớp nền tảng Java

Trong Java, mọi thứ đều được tạo thành từ các lớp và chúng phụ thuộc vào hệ thống phân cấp. Câu hỏi đặt ra: có một lớp nào mà tất cả những lớp khác được kế thừa từ đó không? Câu trả lời là có, thực sự có tồn tại một lớp như vậy. Và nó được gọi đơn giản là Object . Lớp Object trong gói java.lang xác định và triển khai các hành vi chung cho tất cả các lớp, kể cả những lớp bạn tạo. Trong nền tảng Java, nhiều lớp dẫn xuất trực tiếp từ Object , các lớp khác dẫn xuất từ ​​một số lớp này, v.v., tạo thành một hệ thống phân cấp lớp.

Các kiểu kế thừa trong Java

Hãy nêu bật một số kiểu kế thừa trong Java. 1. Kế thừa đơn Loại này giống như trong ví dụ trên của chúng tôi, các lớp con kế thừa các tính năng của một siêu lớp. Trong hình ảnh bên dưới, lớp A đóng vai trò là lớp cơ sở cho lớp dẫn xuất B. 2. Kế thừa đa cấp Đây chỉ là một chuỗi kế thừa, nghĩa là có một lớp cơ sở A, lớp B được kế thừa từ nó và lớp C được kế thừa từ lớp B. Trong Java, một lớp không thể truy cập trực tiếp vào các thành viên của ông bà. 3. Kế thừa thứ bậc Trong Kế thừa thứ bậc, một lớp đóng vai trò là siêu lớp (lớp cơ sở) cho nhiều hơn một lớp con. Ở trên, chúng tôi đã đưa ra một ví dụ về lớp Điện thoại, có thể có hai "con" - AndroidPhone và IPhone.
class A {
    public void printA() {
System.out.println("A");
 }
}

class B extends A {
    public void printB() {
 System.out.println(" B"); }
}

class C extends A {
    public void printC() {
System.out.println("C");
}
}

class D extends A {
    public void printD() {
System.out.println("D");
 }
}

public class Demo {
    public static void main(String[] args)
    {
        B objB = new B();
        objB.printA();
        objB.printB();

        C objC = new C();
        objC.printA();
        objC.printC();

        D objD = new D();
        objD.printA();
        objD.printD();
    }
}
Đầu ra là:
A B A C A D
4. Đa kế thừa, tức là sự hiện diện của một số tổ tiên ... nhưng chờ đã, đa kế thừa cổ điển không được hỗ trợ trong Java. Ở một mức độ nào đó, nó có thể được triển khai không phải bằng cách sử dụng các lớp mà bằng các giao diện.
interface A {
   public void printA();
}

interface B {
   public void printB();
}

interface C extends A, B {
   public void print();
}
class InheritDemo implements C {
   @Override
   public void print()
   {
       System.out.println("Print something");
   }

   @Override
   public void printA() {
   }

   @Override
   public void printB() {
   }
}
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào