Java中私有静态变量的用途是什么?

Vai*_*ani 147 java variables static private

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

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

在这两种情况下,它都不能ClassName.varName作为ClassInstance.varName任何其他类访问.

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

Jes*_*per 115

当然,它可以作为ClassName.var_name,但只能从定义它的类内部访问- 因为它是private.

public staticprivate static变量通常用于常量.例如,许多人不喜欢在代码中"硬编码"常量; 他们喜欢使用有意义的名称创建public 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);

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

无论是制作public还是private取决于您是否希望变量在课堂外可见.

  • @chaitanya这是一个常数.为什么您希望通过使其成为非静态的每个类实例来获得变量的副本? (46认同)
  • static是类级变量,这是常见的,并且该类的所有实例只存在一个副本.无论是私人还是公共规则,该规则均适用.私人只是说我不想让边缘世界破坏我的变量值(对于非最终静态).如果一个静态是最终的,那么将其公之于众是没有害处的,因为没有人可以改变它的价值. (16认同)
  • 通过类名访问它并不是必需的*,但有些人认为它是一种好的风格,可以将它与非静态变量区分开来. (11认同)
  • 访问"ClassName.var_nam"有什么必要?我可以直接访问它:类中的`var_nam` (5认同)
  • 使用静态变量访问它需要什么,我们可以编写"private final String JDBC_PASSWORD ="password";" 而不是为此密码字符串使用静态变量. (5认同)

Tof*_*eer 92

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

如果你要做的事情如下:

public class Person
{
    private static int numberOfEyes;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这不适用于私有静态变量,除非您还为私有变量编写访问器方法,因为无法从类外部访问它们. (3认同)
  • 不正确@GaneshKrishnan,该类的任何实例都可以访问这两个变量.当然,你可以期待班上的作者不会做些傻事.此外,通过反射和JNI,所有投注都已关闭. (2认同)

Jon*_*eet 46

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

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

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

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

  • +1是思考静态变量的方法.:) (2认同)
  • @YogGuru:我没有看到问题的相关性.如果您希望它是私有的,请将其设为私有,如果您希望它是静态的,则将其设为静态.他们是正交的. (2认同)

Swa*_*rma 8

好吧,private static变量可用于跨该类的实例共享数据.虽然你是正确的,我们不能private static使用类似的构造来访问变量ClassName.member,ClassInstance.member但是该类的方法或该类的实例始终可以看到该成员.所以实际上该类的实例总是能够引用成员.


Far*_*hat 8

那么你是正确的公共静态变量是在不创建类的实例的情况下使用的,但私有静态变量则不是.它们与我使用私有静态变量的地方之间的主要区别在于您需要在静态函数中使用变量.对于静态函数,您只能使用静态变量,因此您将它们设为私有,以便不从其他类访问它们.这是我使用私有静态的唯一情况.

这是一个例子:

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 我想我最喜欢这个答案.+1.在私有变量中使用静态的唯一时间是静态方法是否访问它. (3认同)

小智 6

private关键字将允许类和内部变量访问使用static的手段,我们可以访问一个静态方法的变量。

您可能需要这样做,因为在静态方法中无法访问非静态引用变量。


avr*_*avr 6

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

是的,两者都不同.第一个被调用,class variable因为它保持单值,class而另一个被调用,instance variable因为它可以为不同的值保持不同的值instances(Objects).第一个在jvm中只创建一次,而另一个在每个实例创建一次,即如果你有10个实例,那么你将有10个不同private varName;的jvm.

声明变量是否static赋予其他特殊属性?

是的,静态变量获得的内容与普通实例变量不同.我已经提到了一些,让我们在这里看到一些:( class variables声明为静态的实例变量)可以通过使用类名直接访问ClassName.varName.并且该类的任何对象都可以访问和修改其值,而不像实例变量仅由其各自的对象访问.类变量可以在静态方法中使用.

什么是运用了private static variable在Java中?

逻辑上,private static variable没有什么不同,public static variable而第一个给你更多的控制.IMO,你可以从字面上代替public static variable通过private static variable与帮助public staticgetter和setter方法.

一个广泛使用的领域private static variable是在简单Singleton模式的实现中,你将在整个世界中只有该类的单个实例.这里static标识符对于使外部世界可以访问单个实例起着至关重要的作用(当然,公共静态getter方法也起主要作用).

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
Run Code Online (Sandbox Code Playgroud)


ihe*_*nyi 5

私有静态类变量的用途是什么?

假设你有一本图书馆课.每次创建新书时,都要为其分配唯一ID.一种方法是简单地从0开始并增加id号.但是,所有其他书籍如何知道最后创建的身份证号码?简单,将其保存为静态变量.顾客需要知道每本书的实际内部身份证号码吗?不,这些信息是私密的.

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个人为的例子,但我相信你可以很容易地想到你希望所有类实例都能访问应该与其他人保持私密的公共信息的情况.或者即使你不能,也可以将事物尽可能地私密化,这是一种很好的编程习惯.如果您不小心将numBooks字段设为公开,即使Book用户不应对其执行任何操作,该怎么办?然后有人可以在不创建新书的情况下更改书籍数量.

非常偷偷摸摸!