问题

如果变量声明为public static varName;,那么我可以从任何位置访问asClassName.varName。我也知道静态成员由类的所有实例共享,并且不会在每个实例中重新分配。

声明变量asprivate static varName;与声明变量private varName;有什么不同?

在这两种情况下,它都无法从任何其他类访问为ClassName.varName或asClassInstance.varName

将变量声明为静态会给它带来其他特殊属性吗?


#1 热门回答(97 赞)

当然,它可以被访问为ClassName.var_name,但只能从定义它的类中进行访问 - 这是因为它是private

public staticorprivate static变量通常用于常量。例如,许多人不喜欢在代码中"硬编码"常量;他们喜欢使用有意义的名称制作apublic staticprivate static变量,并在其代码中使用它,这应该使代码更具可读性。 (你也应该做这样的常量final)。

例如:

public class Example {
    private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
    private final static String JDBC_USERNAME = "username";
    private final static String JDBC_PASSWORD = "password";

    public static void main(String[] args) {
        Connection conn = DriverManager.getConnection(JDBC_URL,
                                         JDBC_USERNAME, JDBC_PASSWORD);

        // ...
    }
}

你是否想让变量在课堂外可见,取决于你是否希望变量能够在课堂外看到.publicprivate取决于你是否希望变量在课堂外可见。


#2 热门回答(88 赞)

静态变量对于类的所有实例都具有单个值。

如果你要做的事情如下:

public class Person
{
    private static int numberOfEyes;
    private String name;
}

然后你想改变你的名字,这很好,我的名字保持不变。如果你想改变它以便你有17只眼睛,那么世界上每个人也会有17只眼睛。


#3 热门回答(42 赞)

私有静态变量的使用方式与私有实例变量的用法相同:它们存储的状态只能由同一个类中的代码访问。可访问性(私有/公共/等)和变量的实例/静态性质是完全正交的概念。

我会避免将静态变量视为在类的"所有实例"之间共享 - 这表明必须至少存在一个状态才能存在。否 - 静态变量与类型本身相关联,而不是与类型的任何实例相关联。

因此,只要你想要某个与该类型相关联的状态而不是任何特定实例,并且你希望将该状态保持为私有(例如,允许通过属性进行受控访问),那么拥有私有静态变量是有意义的。

顺便说一句,我强烈建议你公开(甚至非私有)的变量只是常量 - 不可变类型的静态最终变量。其他所有内容都应该是私有的,以便分离API和实现(以及其他内容)。


原文链接