Đúng vậy. Ít nhất là cho Sun javac. Hãy nhìn vào ví dụ sau:
public class OuterClass {
public static void main(String... args) {
InnerClass.foo = 7;
System.out.println(InnerClass.foo);
}
private static class InnerClass {
private static int foo;
private static int bar;
}
}
$ javap -c OuterClass\$InnerClass
Compiled from "OuterClass.java"
class OuterClass$InnerClass extends java.lang.Object{
static int access$002(int);
Code:
0: iload_0
1: dup
2: putstatiC#1; //Field foo:I
5: ireturn
static int access$000();
Code:
0: getstatiC#1; //Field foo:I
3: ireturn
}
Nó định nghĩa một static int access$002(int)
cho thiết lập các giá trị, và một static int access$000()
để nhận được giá trị. Setter cũng trả về giá trị, có lẽ để dễ dàng biên dịch someVariable = InnerClass.foo = 5
.
$ javap -c OuterClass
Compiled from "OuterClass.java"
public class OuterClass extends java.lang.Object{
public OuterClass();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 7
2: invokestatiC#2; //Method OuterClass$InnerClass.access$002:(I)I
5: pop
6: getstatiC#3; //Field java/lang/System.out:Ljava/io/PrintStream;
9: invokestatiC#4; //Method OuterClass$InnerClass.access$000:()I
12: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
15: return
}
Tại dòng 2 và tại dòng 9 nó gọi setter (access$002
) và getter (access$000
) tương ứng.
Cũng lưu ý rằng nó chỉ giới thiệu các phương thức truy cập này nếu cần. Ví dụ, trường bar
không bao giờ được truy cập từ bên ngoài lớp, do đó trình biên dịch chỉ tạo ra trình lấy/đặt cho trường foo
.
+1 Câu trả lời hay. Vì vậy, bạn nên luôn luôn khai báo lớp thành viên tĩnh private/package-private/protected và để các trường thành viên là gói riêng tư? – helpermethod
@Helper Method - Không - xem câu trả lời của tôi. –
Bạn nên làm những gì thích hợp cho lĩnh vực được đề cập. Nếu có ý nghĩa riêng tư, hãy đặt ở chế độ riêng tư. Đừng lo lắng về vấn đề hiệu suất, v.v. cho đến khi nó quan trọng, và sau đó lược tả toàn bộ chương trình và xem nơi bạn tận dụng tối đa việc tối ưu hóa. (Nó chắc chắn sẽ không nằm trong những trường hợp như thế này.) – aioobe