Ghi đè trong java, cách thực hiện chi tiết

Trong lập trình hướng đối tượng, ghi đè là một kỹ thuật cho phép các đối tượng con ghi đè lại phương thức của đối tượng cha mà chúng kế thừa. Điều này cho phép chúng ta định nghĩa lại cách hoạt động của một phương thức và tùy chỉnh nó cho nhu cầu của đối tượng con. Trong bài viết này, chúng ta sẽ tìm hiểu về ghi đè trong Java và cách sử dụng nó.

Ghi đè phương thức trong Java

Khi một lớp con kế thừa từ lớp cha, nó có thể ghi đè lại một hoặc nhiều phương thức được định nghĩa trong lớp cha. Để ghi đè (Overriding) một phương thức trong Java, chúng ta cần định nghĩa lại phương thức đó trong lớp con với cùng tên, cùng tham số và cùng kiểu trả về như phương thức cha.

Ví dụ về ghi đè phương thức trong Java

class Animal {
   public void makeSound() {
      System.out.println("The animal makes a sound");
   }
}

class Dog extends Animal {
   public void makeSound() {
      System.out.println("The dog barks");
   }
}

Trong ví dụ trên, lớp Dog kế thừa từ lớp Animal và ghi đè lại phương thức makeSound(). Khi chúng ta gọi phương thức makeSound() trên đối tượng Dog, nó sẽ in ra chuỗi "The dog barks" thay vì chuỗi "The animal makes a sound".

Quy tắc của ghi đè trong Java

Khi ghi đè một phương thức trong Java, chúng ta cần tuân thủ một số quy tắc sau:

  • Tên phương thức, tham số và kiểu trả về của phương thức ghi đè phải giống với phương thức cha.
  • Phương thức ghi đè không được có phạm vi truy cập thấp hơn phương thức cha (ví dụ: phương thức cha là public, thì phương thức ghi đè cũng phải là public).
  • Phương thức ghi đè không được có kiểu trả về khác với kiểu trả về của phương thức cha, trừ khi kiểu trả về của phương thức cha là kiểu đối tượng và kiểu trả về của phương thức ghi đè là kiểu con của kiểu đối tượng đó.
  • Phương thức ghi đè không được ném ra các ngoại lệ (exception) mới hoặc các ngoại lệ không được quản lý (unchecked exception) mà không được khai báo trong phần khai báo ngoại lệ (throws clause) của phương thức cha.

Ví dụ về quy tắc của ghi đè trong Java

class Animal {
   public void makeSound() throws Exception {
      System.out.println("The animal makes a sound");
   }
}

class Dog extends Animal {
   public void makeSound() throws ArithmeticException {
      System.out.println("The dog barks");
   }
}

Trong ví dụ trên, phương thức makeSound() của lớp Dog ghi đè phương thức makeSound() của lớp Animal. Tuy nhiên, lớp Dog không tuân thủ quy tắc của ghi đè trong Java khi ném ra một ngoại lệ (ArithmeticException) không được khai báo trong phần khai báo ngoại lệ của phương thức cha (Animal). Điều này sẽ dẫn đến lỗi biên dịch.

Sử dụng super để gọi phương thức của lớp cha

Trong một phương thức ghi đè, chúng ta có thể sử dụng từ khóa super để gọi phương thức của lớp cha. Điều này cho phép chúng ta giữ lại các tính năng của phương thức cha và chỉ thay đổi những phần mà chúng ta muốn ghi đè.

Ví dụ về sử dụng super để gọi phương thức của lớp cha

class Animal {
   public void makeSound() {
      System.out.println("The animal makes a sound");
   }
}

class Dog extends Animal {
   public void makeSound() {
      super.makeSound();
      System.out.println("The dog barks");
   }
}

Trong ví dụ trên, phương thức makeSound() của lớp Dog sử dụng từ khóa super để gọi phương thức makeSound() của lớp Animal. Sau đó, nó in ra chuỗi "The dog barks". Khi chúng ta gọi phương thức makeSound() trên đối tượng Dog, nó sẽ in ra hai chuỗi "The animal makes a sound""The dog barks".

Kết luận

Ghi đè là một kỹ thuật quan trọng trong lập trình hướng đối tượng, cho phép chúng ta tùy chỉnh lại cách hoạt động của một phương thức trong lớp con. Trong bài viết này, chúng ta đã tìm hiểu về cách ghi đè trong Java và quy tắc cần tuân thủ khi sử dụng nó. Chúng ta cũng đã tìm hiểu về việc sử dụng từ khóa super để gọi phương thức của lớp cha trong một phương thức ghi đè. Hy vọng bài viết này sẽ giúp bạn hiểu thêm về ghi đè trong Java và cách sử dụng nó trong các dự án của mình.

Related Posts

Cấu trúc dữ liệu và giải thuật: Một cái nhìn tổng quan

Giới thiệu Trong lĩnh vực phát triển phần mềm, cấu trúc dữ liệu và giải thuật là hai khái niệm quan trọng không thể thiếu. Cấu trúc…

Next.js – Khám phá Framework JavaScript tuyệt vời cho phát triển ứng dụng web

Giới thiệu về Next.js Next.js là một framework JavaScript mã nguồn mở và phổ biến được sử dụng để xây dựng các ứng dụng web hiệu suất…

Lisp – Cái nhìn tổng quan về ngôn ngữ lập trình đặc biệt

Lisp là gì? Lisp là một ngôn ngữ lập trình đặc biệt mang đến một cách tiếp cận độc đáo trong việc xử lý thông tin và…

Cách sử dụng đường dẫn tương đối trong HTML

Cách sử dụng đường dẫn tương đối trong HTML

Trang web hiện đại thường bao gồm nhiều tài nguyên như hình ảnh, trang HTML khác, tệp tin CSS và JavaScript. Để liên kết và truy cập…

Bài tập về hàm split trong Python

Chuỗi là một loại dữ liệu phổ biến trong lập trình, và việc xử lý chuỗi là một kỹ năng cần thiết cho các lập trình viên….

Xử lý chuỗi trong Python: Các phương thức cơ bản

Python là một trong những ngôn ngữ lập trình phổ biến nhất hiện nay. Nó được sử dụng rộng rãi trong nhiều lĩnh vực, từ phát triển…