(Edit: mở rộng về việc trả lời trả lời một số ý kiến)
Trình biên dịch có các lớp bên trong và biến chúng thành các lớp đầu cấp. Vì các phương thức riêng chỉ có sẵn cho lớp bên trong nên trình biên dịch phải thêm các phương thức "tổng hợp" mới có quyền truy cập cấp gói để các lớp cấp cao nhất có quyền truy cập vào nó.
Something như thế này ($ người được bổ sung bởi trình biên dịch):
class A
{
private void f()
{
final B b;
b = new B();
// call changed by the compiler
b.$g();
}
// method generated by the compiler - visible by classes in the same package
void $f()
{
f();
}
}
class B
{
private void g()
{
final A a;
a = new A();
// call changed by the compiler
a.$f();
}
// method generated by the compiler - visible by classes in the same package
void $g()
{
g();
}
}
lớp Non-tĩnh là như nhau, nhưng họ có sự bổ sung của một tham chiếu đến các lớp bên ngoài để các phương pháp có thể được gọi vào nó.
Lý do Java làm theo cách này là họ không muốn yêu cầu thay đổi VM để hỗ trợ các lớp bên trong, vì vậy tất cả các thay đổi phải ở cấp trình biên dịch.
Trình biên dịch lấy lớp bên trong và biến nó thành lớp cấp cao nhất (do đó, ở cấp VM không có thứ gì như lớp bên trong). Trình biên dịch sau đó cũng phải tạo ra các phương thức "chuyển tiếp" mới. Chúng được thực hiện ở cấp gói (không công khai) để đảm bảo rằng chỉ các lớp trong cùng một gói có thể truy cập chúng. Trình biên dịch cũng đã cập nhật các cuộc gọi phương thức tới các phương thức riêng cho các phương thức "forwarding" được tạo ra.
Bạn có thể tránh việc trình biên dịch tạo phương thức mà tôi khai báo các phương thức là "gói" (không có công khai, riêng tư và được bảo vệ). Nhược điểm đó là bất kỳ lớp nào trong gói có thể gọi các phương thức.
vì vậy, bạn khai báo một phương thức riêng tư và trình biên dịch biến nó thành công cộng thay vì tạo ra một lỗi? – cbrulak
cũng không công khai nó là gói. Và, vâng, đó là những gì nó làm. Điều này là do VM không có kiến thức về các lớp bên trong ... do đó trình biên dịch thực hiện tất cả công việc thay vì làm cho VM thực hiện những việc đặc biệt. – TofuBeer
gói là lớp có chứa lớp bên trong? – cbrulak