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

标签 java nested-class

考虑你有以下类(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/

相关文章:

java - 在 Java 中是否有 C# 中的 Convert 类的等价物?

Java - 将数组的数组拆分为多个数组

c++ - 使用声明和访问修饰符的嵌套类

Python 嵌套类混淆

java - 在Java中刷新fileSystemViewer

java - 古巴平台不显示 map UI 组件

c# - C# 中的类修饰符问题与 "private"类

python - python 嵌套类变量

java - 接口(interface)中的嵌套类

java - 包/导航器资源管理器中的 Eclipse 类导航