gpt4 book ai didi

java - 静态成员类 - 声明类私有(private)和类成员包私有(private)?

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:42 26 4
gpt4 key购买 nike

考虑你有以下类(class)

public class OuterClass {
...

private static class InnerClass {
int foo;
int bar;
}
}

我想我在某处(但不是官方 Java 教程)读到过,如果我将静态成员类属性声明为私有(private),编译器必须生成某种访问器方法,以便外部类可以实际访问静态成员成员类(实际上是包私有(private)的顶级类)的属性。

有什么想法吗?

最佳答案

是的,这是真的。至少对于 Sun javac。看看下面的例子:

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

}

它定义了一个用于设置值的static int access$002(int),以及一个用于获取值的static int access$000()。 setter 还返回值,大概是为了轻松编译 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

}

在第 2 行和第 9 行,它分别调用了 setter (access$002) 和 getter (access$000)。


另请注意,它仅在需要时才引入这些访问器方法。例如,bar 字段从未从类外部访问过,因此编译器只为 foo 字段生成了一个 getter/setter。

关于java - 静态成员类 - 声明类私有(private)和类成员包私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2920282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com