Java super

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 rằng 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 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 được tham số hóa từ phương thức khởi tạo của 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

I am a dog

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.

Vì 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

I am a dog
I am an animal

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

2. 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 type="animal";
}

class Dog extends Animal {
  public String type="mammal";

  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 :

I am a mammal
I am an animal

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,

  • type refers to the attribute of the subclass Dog.
  • super.type refers to the attribute of the superclass Animal.

Do đó, System.out.println("I am a " + type);bản inTôi là động vật có vú. Và, System.out.println("I am an " + super.type);bản inTô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

I am an animal
I am a dog

Ở đâ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 raTô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 của 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 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

Type: Animal
I am a dog

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"). Trình biên dịch không gọi hàm tạo mặc định của lớp cha trong trường hợp này.









Gõ tìm kiếm nhanh...