Siêu từ khóa Java (Có ví dụ)

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về từ khóa super trong Java với sự trợ giúp của các ví dụ.

Các supertừ khóa trong Java được sử dụng trong các lớp con để truy cập lớp cha thành viên (thuộc tính, nhà thầu và phương pháp).

Trước khi chúng ta tìm hiểu về supertừ khóa, hãy đảm bảo bạn đã biết về kế thừa Java.

Sử dụng từ khóa siêu

  1. Để gọi các phương thức của lớp cha được ghi đè trong lớp con.
  2. Để truy cập các thuộc tính (trường) của lớp cha nếu cả lớp cha và lớp con đều có các thuộc tính trùng tên.
  3. Để gọi một cách rõ ràng lớp cha no-arg (mặc định) hoặc phương thức khởi tạo tham số hóa từ phương thức khởi tạo lớp con.

Chúng ta hãy hiểu từng công dụng này.

1. Truy cập các phương thức ghi đè của lớp cha

Nếu các phương thức có cùng tên được định nghĩa trong cả lớp cha và lớp con, phương thức trong lớp con sẽ ghi đè phương thức trong lớp cha. Đây được gọi là ghi đè phương thức.

Ví dụ 1: Ghi đè phương thức

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Đầu ra

 Tôi là một con chó 

Trong ví dụ này, bằng cách tạo một đối tượng dog1 của lớp Dog, chúng ta có thể gọi phương thức printMessage () của nó sau đó thực thi display()câu lệnh.

display()được định nghĩa trong cả hai lớp, nên phương thức của lớp con Dog ghi đè phương thức của lớp cha Animal. Do đó, display()lớp con được gọi.

Điều gì sẽ xảy ra nếu phương thức ghi đè của lớp cha phải được gọi?

Chúng tôi sử dụng super.display()nếu phương thức ghi đè display()của lớp siêu cấp Animal cần được gọi.

Ví dụ 2: Phương thức siêu lớp gọi siêu cấp

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Đầu ra

 Tôi là một con chó tôi là một con vật 

Đây, cách chương trình trên hoạt động.

2. Các thuộc tính truy cập của lớp siêu cấp

Lớp cha và lớp con có thể có các thuộc tính trùng tên. Chúng tôi sử dụng supertừ khóa để truy cập thuộc tính của lớp cha.

Ví dụ 3: Truy cập thuộc tính siêu lớp

 class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) ) 

Đầu ra :

 Tôi là động vật có vú, tôi là động vật 

Trong ví dụ này, chúng ta đã xác định cùng một kiểu trường cá thể trong cả lớp con Animal và lớp con Dog.

Sau đó, chúng tôi tạo một đối tượng dog1 của lớp Dog. Sau đó, printType()phương thức được gọi bằng cách sử dụng đối tượng này.

Bên trong printType()hàm,

  • kiểu tham chiếu đến thuộc tính của lớp con Dog.
  • super.type đề cập đến thuộc tính của Động vật siêu lớp.

Do đó, System.out.println("I am a " + type);bản in Tôi là một động vật có vú. Và, System.out.println("I am an " + super.type);bản in Tôi là một con vật.

3. Sử dụng super () để truy cập hàm tạo lớp cha

Như chúng ta đã biết, khi một đối tượng của một lớp được tạo, phương thức khởi tạo mặc định của nó sẽ tự động được gọi.

Để gọi hàm tạo lớp cha một cách rõ ràng từ phương thức khởi tạo lớp con, chúng ta sử dụng super(). Đó là một dạng đặc biệt của supertừ khóa.

super() chỉ có thể được sử dụng bên trong phương thức khởi tạo của lớp con và phải là câu lệnh đầu tiên.

Ví dụ 4: Sử dụng super ()

 class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Đầu ra

 Tôi là một con vật tôi là một con chó 

Ở đây, khi một đối tượng dog1 của lớp Dog được tạo, nó sẽ tự động gọi phương thức khởi tạo mặc định hoặc không có đối số của lớp đó.

Bên trong phương thức khởi tạo của lớp con, super()câu lệnh gọi phương thức khởi tạo của lớp cha và thực thi các câu lệnh bên trong nó. Do đó, chúng tôi nhận được kết quả đầu ra Tôi là một con vật.

Luồng chương trình sau đó quay trở lại phương thức khởi tạo của lớp con và thực hiện các câu lệnh còn lại. Vì vậy, tôi là một con chó sẽ được in.

Tuy nhiên, việc sử dụng super()là không bắt buộc. Ngay cả khi super()không được sử dụng trong phương thức khởi tạo của lớp con, trình biên dịch sẽ ngầm gọi phương thức khởi tạo mặc định của lớp cha.

Vì vậy, tại sao lại sử dụng mã dự phòng nếu trình biên dịch tự động gọi super ()?

Nó được yêu cầu nếu phương thức khởi tạo tham số hóa (một phương thức khởi tạo nhận đối số) của lớp cha phải được gọi từ phương thức khởi tạo lớp con.

Tham số hóa super()phải luôn là câu lệnh đầu tiên trong phần thân của hàm tạo của lớp con, nếu không, chúng ta sẽ gặp lỗi biên dịch.

Ví dụ 5: Gọi hàm tạo tham số bằng super ()

 class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Đầu ra

 Loại: Động vật Tôi là một con chó 

Trình biên dịch có thể tự động gọi hàm tạo no-arg. Tuy nhiên, nó không thể gọi các hàm tạo được tham số hóa.

Nếu một phương thức khởi tạo được tham số hóa phải được gọi, chúng ta cần xác định rõ ràng nó trong phương thức khởi tạo lớp con.

Lưu ý rằng trong ví dụ trên, chúng ta đã gọi hàm tạo tham số một cách rõ ràng super("Animal"). Trong trường hợp này, trình biên dịch không gọi hàm tạo mặc định của lớp cha.

thú vị bài viết...