Ghi đè phương pháp Java

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về ghi đè phương thức trong Java với sự trợ giúp của các ví dụ.

Trong hướng dẫn trước, chúng ta đã tìm hiểu về kế thừa. Kế thừa là một thuộc tính OOP cho phép chúng ta lấy một lớp mới (lớp con) từ một lớp hiện có (lớp cha). Lớp con kế thừa các thuộc tính và phương thức của lớp cha.

Bây giờ, nếu cùng một phương thức được định nghĩa trong cả lớp cha và lớp con, thì phương thức của lớp con sẽ ghi đè phương thức của lớp cha. Đây được gọi là ghi đè phương thức.

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

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

Đầu ra :

I am a dog.

Trong chương trình trên, displayInfo()phương thức này có trong cả lớp con Animal và lớp con Dog .

Khi chúng ta gọi displayInfo()bằng cách sử dụng đối tượng d1 (đối tượng của lớp con), phương thức bên trong lớp con Dog được gọi. Các displayInfo()phương pháp của lớp con sẽ ghi đè phương pháp tương tự của lớp cha.

Lưu ý việc sử dụng @Overridechú thích trong ví dụ của chúng tôi. Trong Java, chú thích là siêu dữ liệu mà chúng tôi đã sử dụng để cung cấp thông tin cho trình biên dịch. Ở đây, @Overridechú thích chỉ định trình biên dịch mà phương thức sau chú thích này sẽ ghi đè phương thức của lớp cha.

Nó không phải là bắt buộc để sử dụng @Override. Tuy nhiên, khi chúng ta sử dụng điều này, phương pháp phải tuân theo tất cả các quy tắc ghi đè. Nếu không, trình biên dịch sẽ tạo ra lỗi.

Quy tắc ghi đè Java

  • Both the superclass and the subclass must have the same method name, the same return type and the same parameter list.
  • We cannot override the method declared as final and static.
  • We should always override abstract methods of the superclass (will be discussed in later tutorials).

Super Keyword trong Java Overriding

Một câu hỏi phổ biến phát sinh khi thực hiện ghi đè trong Java là:

Chúng ta có thể truy cập phương thức của lớp cha sau khi ghi đè không?

Vâng, câu trả lời là  . Để truy cập phương thức của lớp cha từ lớp con, chúng ta sử dụng supertừ khóa.

Ví dụ 2: Sử dụng từ khóa siêu cấp

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      super.displayInfo();
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

Đầu ra :

I am an animal.
I am a dog.

Trong ví dụ trên, lớp con Dog ghi đè phương thức displayInfo()của lớp con Animal .

Khi chúng ta gọi phương thức displayInfo()sử dụng đối tượng d1 của lớp con Dog , phương thức bên trong lớp con Dog được gọi; phương thức bên trong lớp cha không được gọi.

Bên trong displayInfo()của lớp con Dog , chúng tôi đã sử dụng super.displayInfo()để gọi displayInfo()của lớp cha.

Điều quan trọng cần lưu ý là các hàm tạo trong Java không được kế thừa. Do đó, không có cái gọi là ghi đè hàm tạo trong Java.

Tuy nhiên, chúng ta có thể gọi hàm tạo của lớp cha từ các lớp con của nó. Đối với điều đó, chúng tôi sử dụng super(). Để tìm hiểu thêm, hãy truy cập từ khóa Java super .

Truy cập các chỉ định trong ghi đè phương thức

Cùng một phương thức được khai báo trong lớp cha và các lớp con của nó có thể có các chỉ định truy cập khác nhau. Tuy nhiên, có một hạn chế.

Chúng ta chỉ có thể sử dụng các chỉ định truy cập đó trong các lớp con cung cấp quyền truy cập lớn hơn so với các chỉ định truy cập của lớp cha. Ví dụ,

Giả sử, một phương thức myClass()trong lớp cha được khai báo protected. Sau đó, cùng một phương thức myClass()trong lớp con có thể là publichoặc protected, nhưng không private.

Ví dụ 3: Công cụ xác định quyền truy cập trong ghi đè

class Animal {
   protected void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

Đầu ra :

I am a dog.

Trong ví dụ trên, lớp con Dog ghi đè phương thức displayInfo()của lớp con Animal .

Bất cứ khi nào chúng ta gọi displayInfo()bằng cách sử dụng d1 (đối tượng của lớp con), phương thức bên trong lớp con được gọi.

Lưu ý rằng, displayInfo()được khai báo protectedtrong lớp cha Animal . Phương thức tương tự có mã publicxác định quyền truy cập trong lớp con Dog . Điều này là có thể vì publiccung cấp quyền truy cập lớn hơn protected.

Ghi đè các phương thức trừu tượng

Trong Java, các lớp trừu tượng được tạo ra để trở thành lớp cha của các lớp khác. Và, nếu một lớp chứa một phương thức trừu tượng, thì bắt buộc phải ghi đè lên nó.

Chúng ta sẽ tìm hiểu thêm về các lớp trừu tượng và ghi đè các phương thức trừu tượng trong các bài hướng dẫn sau.









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