Thứ Năm, 12 tháng 7, 2018

Java - Ghi đè

Trong chương trước, chúng ta đã nói về các siêu lớp và các lớp con. Nếu một lớp thừa hưởng một phương thức từ siêu lớp của nó, thì có một cơ hội để ghi đè lên phương thức với điều kiện là nó không được đánh dấu cuối cùng.

ảnh minh họa

Lợi ích của việc ghi đè trong java là: khả năng xác định một hành vi cụ thể cho loại lớp con, có nghĩa là một lớp con có thể thực hiện một phương thức lớp cha dựa trên yêu cầu của nó.

Trong các thuật ngữ hướng đối tượng, ghi đè có nghĩa là ghi đè lên chức năng của một phương thức hiện có.

Thí dụ

Chúng ta hãy xem xét một ví dụ.
class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}
Điều này sẽ tạo ra kết quả sau

Đầu ra

Animals can move
Dogs can walk and run

Trong ví dụ trên, bạn có thể thấy rằng mặc dù b là một loại Animal nó chạy phương thức di chuyển trong lớp Dog. Lý do cho điều này là: Trong thời gian biên dịch, kiểm tra được thực hiện trên loại tham chiếu. Tuy nhiên, trong thời gian chạy trên java, JVM chỉ ra kiểu đối tượng và sẽ chạy phương thức thuộc về đối tượng cụ thể đó.

Do đó, trong ví dụ trên, chương trình sẽ biên dịch đúng vì lớp Animal có phương thức di chuyển trên java. Sau đó, tại thời gian chạy, nó chạy phương thức cụ thể cho đối tượng đó.

Hãy xem ví dụ sau

Thí dụ
class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
   public void bark() {
      System.out.println("Dogs can bark");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
      b.bark();
   }
}

Điều này sẽ tạo ra kết quả sau

Đầu ra

TestDog.java:26: error: cannot find symbol
      b.bark();
       ^
  symbol:   method bark()
  location: variable b of type Animal
1 error

Chương trình này sẽ ném một lỗi thời gian biên dịch vì kiểu tham chiếu của b Động vật không có một phương thức bằng tên của vỏ cây.

Quy tắc ghi đè phương pháp

Danh sách đối số phải chính xác giống với danh sách được ghi đè của java.

Kiểu trả về phải giống hoặc kiểu con của kiểu trả về được khai báo trong phương thức ghi đè ban đầu trong lớp cha.

Mức truy cập không thể hạn chế hơn mức truy cập của phương thức được ghi đè. Ví dụ: Nếu phương thức superclass được khai báo là public thì phương thức overridding trong lớp con không thể là private hoặc protected.

Các phương thức thể hiện có thể được ghi đè chỉ khi chúng được thừa kế bởi lớp con.

Một phương thức được khai báo cuối cùng không thể bị ghi đè.

Phương thức tĩnh được khai báo không thể ghi đè nhưng có thể được khai báo lại.

Nếu một phương thức không thể được kế thừa, thì nó không thể bị ghi đè.

Một lớp con trong cùng một gói như siêu lớp của cá thể có thể ghi đè lên bất kỳ phương thức siêu lớp nào không được khai báo riêng hoặc cuối cùng.

Một lớp con trong một gói khác nhau chỉ có thể ghi đè các phương thức không phải cuối cùng được khai báo công khai hoặc được bảo vệ. Của lập trình java

Một phương thức ghi đè có thể ném bất kỳ ngoại lệ bỏ chọn nào, bất kể phương thức ghi đè có ném ngoại lệ hay không. Tuy nhiên, phương thức ghi đè không nên ném các ngoại lệ đã kiểm tra mới hoặc rộng hơn các ngoại lệ được khai báo bằng phương pháp ghi đè. Phương pháp ghi đè có thể ném các ngoại lệ hẹp hơn hoặc ít hơn so với phương pháp ghi đè.

Constructors không thể bị ghi đè.

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

Khi gọi một phiên bản siêu lớp của một phương thức ghi đè, từ khóa siêuđược sử dụng.

Thí dụ
class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      super.move();   // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

Điều này sẽ tạo ra kết quả sau

Đầu ra

Animals can move
Dogs can walk and run

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...