Java: Ghi đè phương thức (Override)


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Java cho phép lớp con có quyền tạo một phương thức giống hệt với phương thức của lớp cha. Điều này gọi là ghi đè phương thức (Override). Việc ghi đè này cho phép một lớp thừa kế hành vi từ một lớp khác nhưng có thể thay đổi hành vi đó khi cần.

Một số quy tắc cần nhớ khi ghi đè:

- Phương thức ghi đè phải cùng tên, kiểu, và số lượng đối số cũng như kiểu trả về với phương thức của lớp cha.

- Một phương thức ghi đè không thể có mức truy cập yếu hơn so với mức truy cập của phương thức tương ứng ở lớp cha.

Ví dụ ta có lớp Animal như sau:

import java.util.Scanner;

//tạo lớp Animal:
public class Animal {
  //khai báo các thuộc tính:
  int id; //mã nhận diện
  String name; //tên
  float age; //tuổi

  //phương thức nhập liệu
  void inputInfo(){
    Scanner input=new Scanner(System.in);
    System.out.print("Input id: ");
    id=input.nextInt();
    System.out.print("Input name: ");
    input.nextLine();
    name=input.nextLine();
    System.out.print("Input age: ");
    age=input.nextFloat();
  }

  //phương thức hiển thị
  void showInfo() {
    System.out.println("ID: " + id);
    System.out.println("Name: " + name);
    System.out.println("Age: " + age);
  }
}

Trong lớp Animal có hai phương thức là inputInfo() dùng để nhập liệu cho các thuộc tính id, name và age, còn phương thức showInfo() dùng để hiển thị thông tin của các thuộc tính id, name và age.

Và bây giờ ta có lớp Cat thừa kế lớp Animal ở trên như sau:

class Cat extends Animal{
  String color;
}

Thì đương nhiên lớp Cat sẽ được thừa hưởng các phương thức inputInfo() và showInfo() của lớp Animal.

Tuy nhiên, phương thức inputInfo() của lớp cha Animal lại không thể nhập liệu cho thuộc tính color của lớp con Cat, và phương thức showInfo() của lớp cha Animal lại không thể hiển thị cho thuộc tính color của lớp con Cat.

Để khắc phục thì ta tiến hành ghi đè hai phương thức này như sau:

class Cat extends Animal{
  String color;

  @Override
  void inputInfo() {
    Scanner input=new Scanner(System.in);
    super.inputInfo();
    System.out.print("Input color: ");
    color=input.nextLine();
  }

  @Override
  void showInfo() {
    super.showInfo();
    System.out.println("Color: "+color);
  }
}

Ở đoạn code trên có sử dụng đến từ khóa super, bạn có thể tìm hiểu thêm về từ khóa super tại ĐÂY.

Còn dưới đây là đoạn code hoàn chỉnh, bạn có thể copy và chạy thử:

import java.util.Scanner;

//tạo lớp Animal:
class Animal {
  //khai báo các thuộc tính:
  int id; //mã nhận diện
  String name; //tên
  float age; //tuổi

  //phương thức nhập liệu
  void inputInfo(){
    Scanner input=new Scanner(System.in);
    System.out.print("Input id: ");
    id=input.nextInt();
    System.out.print("Input name: ");
    input.nextLine();
    name=input.nextLine();
    System.out.print("Input age: ");
    age=input.nextFloat();
  }

  //phương thức hiển thị
  void showInfo() {
    System.out.println("ID: " + id);
    System.out.println("Name: " + name);
    System.out.println("Age: " + age);
  }
}

class Cat extends Animal{
  String color;

  @Override
  void inputInfo() {
    Scanner input=new Scanner(System.in);
    super.inputInfo();
    System.out.print("Input color: ");
    color=input.nextLine();
  }

  @Override
  void showInfo() {
    super.showInfo();
    System.out.println("Color: "+color);
  }
}

public class Demo1 {
  public static void main(String[] args) {
    Cat cat = new Cat();
    cat.inputInfo();
    cat.showInfo();
  }
}

Kết quả:

Input id: 1
Input name: 2
Input age: 3
Input color: 4
ID: 1
Name: 2
Age: 3.0
Color: 4

Lưu ý: Các chú thích sẽ cung cấp thêm thông tin về chương trình. Các chú thích không ảnh hưởng đến chức năng của đoạn mã mà chúng chú thích.

Lưu ý rằng phương thức showInfo() bây giờ sẽ in ra thông tin cụ thể trong lớp con. Điều này có nghĩa rằng một lời gọi tới phương thức showInfo() sử dụng đối tượng lớp con là cat.showInfo() trước tiên sẽ tìm kiếm phương thức trong lớp con. Sau đó phương thức showInfo() được ghi đè trong lớp con, nó gọi phương thức showInfo() của lớp con mà không phải phương thức showInfo() của lớp cha. Phương thức inputInfo() cũng tương tự như vậy.

» Tiếp: Từ khóa super
« Trước: Thừa kế (Inheritant)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!