评估一个静态私有变量(Java),不应该是非法的吗? [复制]

Posted

技术标签:

【中文标题】评估一个静态私有变量(Java),不应该是非法的吗? [复制]【英文标题】:Assessing a static private variable (Java), Shouldn't it be illegal? [duplicate] 【发布时间】:2019-05-06 22:39:45 【问题描述】:

在将此问题标记为重复之前,请确保提供您自己的解释。谢谢你。请注意私有 STATIC 变量,它们不是实例变量。

我有以下场景:

public class Statics 
   private static class Counter 
        private int data = 5; //Declared as private.

//        public Counter() throws IllegalAccessException 
//            throw new IllegalAccessException();
//        

        public void bump(int inc) 
            inc++;
            data = data + inc;
        
    

    public static void main(String[] args) throws IllegalAccessException 
        Counter c = new Counter();
        int rnd = 2;
        c.bump(rnd);

        c.data = 0; //How this possible? It is declared as private.

        System.out.println(c.data + " & "+ rnd);
    

输出:0 & 2

我的问题是,我怎么可能从课堂外访问数据(私有静态)变量。

在 Java 中,我们知道 private 访问修饰符的成员不能从类外部访问。

我们总是使用 setter 和 Getter 来修改私有变量的值,不是吗?我错过了什么吗?

【问题讨论】:

您可以查看why-can-outer-java-classes-access-inner-class-private-members 因为Counter 是在Statics 内部定义的。如果你在Statics 之外定义了Counter,它会抛出你所期望的错误。 我们处理的是静态变量而不是实例变量。那些将问题标记为重复的人提供了不正确/不相关的链接/参考。 好吧,静态“变量”也是该类的成员,因此至少第二个链接作为重复链接是有效的(没有检查第一个,但可能是相同的推理) 【参考方案1】:

因为类Counter 是类Statics 的私有成员,所以类的私有成员可以从其类中访问。

【讨论】:

【参考方案2】:

My question is, how is it even possible that I am able to access the data (private static) variable from outside the class.

你的问题:

您已经能够从类本身内部访问数据(私有静态)变量”(不在“静态”类之外)

【讨论】:

以上是关于评估一个静态私有变量(Java),不应该是非法的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在类中使用私有静态变量是否合适?

*可以*为静态的C#方法应该是静态的吗? [关闭]

Java中的构造函数可以是私有的吗?

java 内部类

与私有变量相关的非法表达式开头

Java基础面试每日3题:day11