Tôi không thể tìm thấy câu hỏi như tôi, vì vậy tôi hy vọng nó không phải là một bản sao.Java - Ẩn Ghi đè và sửa đổi cuối cùng
Một lần nữa nó về trọng và ẩn. Tôi nghĩ - nhưng tôi có thể sai - tôi hiểu cả hai.
Mã sau hoạt động như mong đợi, cả hai phương pháp đều bị ẩn. method1 bởi vì nó là một phương thức riêng và các phương thức riêng không thể bị ghi đè chỉ bị ẩn, method2 bởi vì nó là phương thức tĩnh và tĩnh không thể bị ghi đè, chúng chỉ có thể được ẩn đi.
public class Child extends Parent {
public void method1(){System.out.println("child");}
public static void method2(){ System.out.println("static child");}
}
class Parent{
private void method1(){ System.out.println("parent");}
public static void method2(){ System.out.println("static parent");}
public static void main(String[] args){
Parent p = new Child();
p.method1(); //prints out "parent"
p.method2(); //prints out "static parent"
}
}
Nếu tôi đọc specs nó nói:
http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.3.3
Một phương pháp có thể được tuyên bố chính thức để ngăn chặn các lớp con từ trọng hoặc che giấu nó.
Nếu tôi thay đổi method1 trong lớp cha để "cuối cùng"
private final void method1(){ System.out.println("parent");}
Tất cả mọi thứ hoạt động tốt. chỉnh sửa bắt đầu: Tôi mong đợi một lỗi trình biên dịch nói rằng phương pháp cuối cùng không thể được ẩn, nhưng điều đó đã không xảy ra. : chỉnh sửa kết thúc
Câu hỏi số 1: điều đó có nghĩa là chỉ có phương pháp tĩnh có thể bị ẩn? Trong cuốn sách tôi đang đọc (hướng dẫn nghiên cứu OCA, Jeanne Boyarsky và trang Scott Selikoff 252), họ nói rõ ràng rằng một phương pháp riêng đã bị ẩn.
Sau đó, tôi đã thay đổi method2 trong lớp cha để
public final static void method2(){ System.out.println("static parent");}
Bây giờ trình biên dịch không phàn nàn, các lỗi nói: "Trẻ em không thể ghi đè method2()", mà là khá khó hiểu bởi vì tôi nghĩ rằng tôi đã cố gắng để che giấu một phương pháp .
Câu hỏi số 2: Không phải là "Trẻ em không thể ẩn phương thức 2()"?
chỉnh sửa bắt đầu: Tôi biết rằng không có ghi đè nào xảy ra ở đây, nhưng như thông số được đề cập chỉ ra: sửa đổi cuối cùng ngăn các phương thức bị ghi đè hoặc ẩn, đó là lý do tôi đặt nó vào tiêu đề. : chỉnh sửa cuối
Ví dụ của bạn hơi khó hiểu vì phương thức 2 được xác định trước phương thức1. Để dễ đọc, bạn có thể muốn cấu trúc lại thành: a) đầu tiên định nghĩa method1, sau đó metho2 và b) đầu tiên xác định lớp Parent, sau đó lớp Child và cuối cùng là một lớp public chứa phương thức main như là một khung kiểm thử. – penguineer
Và bây giờ câu hỏi thực sự của tôi: Bạn có ý nghĩa gì bởi "Mọi thứ hoạt động tốt"? Vui lòng nêu rõ những gì bạn mong đợi và điều gì sẽ xảy ra. Tôi sẽ mong đợi một lỗi trình biên dịch khi Overriding một phương pháp cuối cùng - bạn đã nhận được lỗi đó? Hoặc đã làm các trình biên dịch đi qua với nó? Bạn có thấy bản in của phương pháp overriden không? – penguineer
Hướng dẫn Oracle ngụ ý rằng bạn không thể ghi đè phương thức 'tĩnh', chỉ ẩn nó: https://docs.oracle.com/javase/tutorial/java/IandI/override.html –