访问私有变量的 Java 静态方法

2022-09-02 20:15:51

我的印象是,私有非静态变量只能通过变量所在的对象上调用的方法访问,但事实并非如此。有人可以解释一下为什么编译和运行的原因吗?

public class Sandbox {
    private String _privateString = "unmodified";
    public static void setPrivateString(String str, Sandbox s) {
        s._privateString = str;
    }
    public String toString()
    {
        return _privateString;
    }

    public static void main(String[] args) {
        Sandbox s = new Sandbox();
        setPrivateString("modified", s);
        System.out.println(s);
    }
}

输出:

modified

编辑:在 C# 中也是如此。


答案 1

类 A 的私有成员变量可以通过类 A 的任何方法(静态或非静态)访问(即读/写),因此在您的示例中,由于更改字符串的方法与该成员所属的类的方法相同,因此被授予对变量的访问权限。

原因是因为一个类被认为是一个独立的逻辑体(即一个特定的实现),所以隐私包含在一个类中是有道理的;没有理由从该访问权限中排除静态方法,因为它们也是该类提供的特定实现的一部分。


答案 2

您似乎混淆了 .实例变量位于实例的作用域内,因此无法在静态方法中直接访问它们,而只能使用实例引用限定符进行访问:在您的情况下。visibilityscopes._privateString

但是,这并不意味着实例变量对于同一类内的静态方法不可见,因为这意味着在类内可见(对于具有任何作用域的任何成员)。private