Truy cập các thành viên riêng tư từ một lớp khác hơi phức tạp hơn vì JVM không thực sự cho phép điều này. Kết quả là trình biên dịch tiêm các phương thức accessor mà làm cho nó hơi chậm hơn hoặc theo dõi stack của bạn phức tạp hơn.
Vì những lý do này, tôi để nó làm gói địa phương.
BTW Nhà xây dựng của abstract class
cũng không cần phải là public
. Nó cũng có thể là protected
hoặc gói địa phương
private static class A {
private A() {
throw new Error();
}
}
public static void main(String... ignored) {
new A();
}
in thêm phần tử theo dõi ngăn xếp.
Exception in thread "main" java.lang.Error
at Main$A.<init>(Main.java:8)
at Main$A.<init>(Main.java:6)
at Main.main(Main.java:12)
Làm cho gói trình xây dựng địa phương và gói thứ hai biến mất.
Nguồn
2013-07-31 17:42:23
Tại sao đường thừa của ngăn xếp ngăn xếp được tạo ra? Làm thế nào nó hoạt động? Tôi recongnized rằng dòng phụ xảy ra chỉ khi tôi xác định nó riêng tư. Chỉ được bảo vệ hai dòng. Vì vậy, nó có nghĩa là xác định tư nhân giảm hiệu quả? Tại sao trình biên dịch JVM cho phép xác định hàm tạo của các lớp như vậy với khả năng hiển thị> = được bảo vệ? –
@ ŁukaszRzeszotarski JVM không cho phép truy cập riêng tư từ một lớp khác. Những gì javac làm để làm việc xung quanh điều này là tạo ra các phương thức tổng hợp mà không phải là private mà có thể được gọi. Chúng nhận được một số dòng của sự khởi đầu của lớp. Phương thức được tạo ra gọi phương thức thực. Nó làm điều này cho tất cả các thành viên tư nhân. Trong khi chậm hơn trong chế độ giải nghĩa, một khi tối ưu hóa phương thức bổ sung được gạch chân và không có tác động AFAIK ngoại trừ trên các hệ thống JME, nơi nó không đủ thông minh để làm điều này. –
Bây giờ nó rõ ràng. Tôi thấy bytecode của lớp và điều thực sự làm tôi ngạc nhiên là bytecode chỉ chứa phương thức bổ sung nếu bạn cố gắng khởi tạo lớp (ví dụ trong phương thức chính). –