Ẩn phần trong html
Để bật tính năng nhắn tin trên trang Facebook của bạn, hãy truy cập Trang của bạn Một phương thức thể hiện trong một lớp con có cùng chữ ký (tên, cộng với số và loại tham số của nó) và kiểu trả về dưới dạng một phương thức thể hiện trong lớp cha sẽ ghi đè phương thức của lớp cha Khả năng ghi đè phương thức của lớp con cho phép lớp kế thừa từ lớp cha có hành vi "đủ gần" và sau đó sửa đổi hành vi khi cần. Phương thức ghi đè có cùng tên, số lượng và loại tham số và kiểu trả về giống như phương thức mà nó ghi đè. Một phương thức ghi đè cũng có thể trả về một kiểu con của loại được trả về bởi phương thức ghi đè. Kiểu con này được gọi là kiểu trả về hiệp biến Khi ghi đè một phương thức, bạn có thể muốn sử dụng chú thích public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }7 hướng dẫn trình biên dịch rằng bạn định ghi đè một phương thức trong lớp cha. Nếu vì một lý do nào đó, trình biên dịch phát hiện ra rằng phương thức này không tồn tại ở một trong các lớp cha, thì nó sẽ tạo ra lỗi. Để biết thêm thông tin về public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }7, xem public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }9 Phương thức tĩnhNếu một lớp con định nghĩa một phương thức tĩnh có cùng chữ ký với một phương thức tĩnh trong lớp cha, thì phương thức trong lớp con sẽ ẩn phương thức trong lớp cha Sự khác biệt giữa ẩn phương thức tĩnh và ghi đè phương thức thể hiện có ý nghĩa quan trọng
Hãy xem xét một ví dụ có chứa hai lớp. Đầu tiên là The static method in Animal The instance method in Cat0, chứa một phương thức thể hiện và một phương thức tĩnh public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } } Lớp thứ hai, một lớp con của The static method in Animal The instance method in Cat0, được gọi là The static method in Animal The instance method in Cat2 public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } } Lớp The static method in Animal The instance method in Cat2 ghi đè phương thức cá thể trong The static method in Animal The instance method in Cat0 và ẩn phương thức tĩnh trong The static method in Animal The instance method in Cat0. Phương thức The static method in Animal The instance method in Cat6 trong lớp này tạo một thể hiện của The static method in Animal The instance method in Cat2 và gọi The static method in Animal The instance method in Cat8 trên lớp và The static method in Animal The instance method in Cat9 trên thể hiện Đầu ra từ chương trình này như sau The static method in Animal The instance method in Cat Như đã hứa, phiên bản của phương thức tĩnh ẩn được gọi là phiên bản trong lớp cha và phiên bản của phương thức thể hiện bị ghi đè được gọi là phiên bản trong lớp con Các phương thức mặc định và phương thức trừu tượng trong giao diện được kế thừa giống như các phương thức thể hiện. Tuy nhiên, khi các siêu kiểu của một lớp hoặc giao diện cung cấp nhiều phương thức mặc định có cùng chữ ký, trình biên dịch Java sẽ tuân theo các quy tắc kế thừa để giải quyết xung đột tên. Các quy tắc này được thúc đẩy bởi hai nguyên tắc sau
Nếu hai hoặc nhiều phương thức mặc định được xác định độc lập xung đột hoặc một phương thức mặc định xung đột với một phương thức trừu tượng, thì trình biên dịch Java sẽ tạo ra lỗi trình biên dịch. Bạn phải ghi đè rõ ràng các phương thức siêu kiểu Hãy xem xét ví dụ về ô tô điều khiển bằng máy tính hiện có thể bay. Bạn có hai giao diện ( public class Horse { public String identifyMyself() { return "I am a horse."; } }4 và public class Horse { public String identifyMyself() { return "I am a horse."; } }5) cung cấp các triển khai mặc định cho cùng một phương thức, ( public class Horse { public String identifyMyself() { return "I am a horse."; } }6) public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }1 public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }2 Một lớp triển khai cả public class Horse { public String identifyMyself() { return "I am a horse."; } }4 và public class Horse { public String identifyMyself() { return "I am a horse."; } }5 phải ghi đè phương thức public class Horse { public String identifyMyself() { return "I am a horse."; } }6. Bạn có thể gọi bất kỳ triển khai mặc định nào bằng từ khóa public interface Flyer { default public String identifyMyself() { return "I am able to fly."; } }0 public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }3 Tên trước public interface Flyer { default public String identifyMyself() { return "I am able to fly."; } }0 (trong ví dụ này, public class Horse { public String identifyMyself() { return "I am a horse."; } }5 hoặc public class Horse { public String identifyMyself() { return "I am a horse."; } }4) phải tham chiếu đến một siêu giao diện trực tiếp xác định hoặc kế thừa một giá trị mặc định cho phương thức được gọi. Hình thức gọi phương thức này không bị hạn chế trong việc phân biệt giữa nhiều giao diện được triển khai có chứa các phương thức mặc định có cùng chữ ký. Bạn có thể sử dụng từ khóa public interface Flyer { default public String identifyMyself() { return "I am able to fly."; } }0 để gọi phương thức mặc định trong cả lớp và giao diện Các phương thức thể hiện được kế thừa từ các lớp có thể ghi đè các phương thức giao diện trừu tượng. Hãy xem xét các giao diện và lớp sau public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }4 public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }5 public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }6 Phương thức public interface Flyer { default public String identifyMyself() { return "I am able to fly."; } }5 trả về chuỗi public class Horse { public String identifyMyself() { return "I am a horse."; } }1 Lớp public interface Flyer { default public String identifyMyself() { return "I am able to fly."; } }7 kế thừa phương thức public interface Flyer { default public String identifyMyself() { return "I am able to fly."; } }8 từ lớp public interface Flyer { default public String identifyMyself() { return "I am able to fly."; } }9, phương thức này sẽ ghi đè phương thức trừu tượng cùng tên trong giao diện public interface Mythical { default public String identifyMyself() { return "I am a mythical creature."; } }0 Ghi chú. Các phương thức tĩnh trong giao diện không bao giờ được kế thừa sửa đổiTrình xác định quyền truy cập cho một phương thức ghi đè có thể cho phép truy cập nhiều hơn nhưng không ít hơn so với phương thức bị ghi đè. Ví dụ: một phương thức thể hiện được bảo vệ trong lớp cha có thể được đặt ở chế độ công khai, nhưng không được đặt ở chế độ riêng tư trong lớp con Bạn sẽ gặp lỗi thời gian biên dịch nếu bạn cố gắng thay đổi một phương thức thể hiện trong lớp cha thành một phương thức tĩnh trong lớp con và ngược lại Tóm lượcBảng sau đây tóm tắt những gì xảy ra khi bạn định nghĩa một phương thức có cùng chữ ký với một phương thức trong lớp cha |