【问题标题】:When will I use a Class Variable in Java v.s an Instance Variable?我什么时候在 Java 中使用类变量与实例变量?
【发布时间】:2012-07-23 01:38:54
【问题描述】:

这是我定义的一个泛型类,我想知道的是,当我创建更具体的类(例如 CAR 类)时,我何时使用类变量?我个人对类变量的理解是,已经在类中声明的类变量的单个副本将使用关键字static进行声明,并且从该类中实例化的每个对象都将包含该类的单个副本变量。

实例变量允许从该类创建的类/对象的每个实例对每个对象都有一个单独的实例变量副本?

所以实例变量对于定义类/数据类型的属性很有用,例如 House 会有一个位置,但现在我什么时候在 House 对象中使用类变量?或者换句话说,在设计类时,类对象的正确用途是什么?

public class InstanceVaribale {
public int id; //Instance Variable: each object of this class will have a seperate copy of this variable that will exist during the life cycle of the object.
static int count = 0; //Class Variable: each object of this class will contain a single copy of this variable which has the same value unless mutated during the lifecycle of the objects.

InstanceVaribale() {
    count++;

}
public static void main(String[] args) {

    InstanceVaribale A = new InstanceVaribale();
    System.out.println(A.count);
    InstanceVaribale B = new InstanceVaribale();
    System.out.println(B.count);
    System.out.println(A.id);
    System.out.println(A.count);
    System.out.println(B.id);
    System.out.println(B.count);    
    InstanceVaribale C = new InstanceVaribale();
    System.out.println(C.count);
}
}

【问题讨论】:

  • 尽可能避免使用它们。没有静态变量的程序更容易维护,它们基本上是带有糖衣的全局变量
  • 它们实际上被称为“静态字段”,而不是“类变量”。

标签: java oop instance-variables class-variables


【解决方案1】:

我个人对类变量的理解是,在类中声明的类变量的单个副本将使用关键字static来声明,并且从该类中实例化的每个对象都将包含一个副本类变量。

没有。并不是“每个对象都包含一个副本”。静态变量与 type 相关联,而不是与该类型的每个实例相关联。 实例根本没有变量。

只有一个变量(假设您只从一个类加载器加载它)但是该类型的实例有很多。没有实例?还是一个变数。一百万个实例?还是一个变量。

静态变量对常量或常量类似物非常有用——比如记录器,或“有效价格的集合”等。在应用程序过程中不会改变的东西。根据我的经验,它们几乎应该总是final,并且类型应该是不可变类型(如String)。在可能的情况下,对静态变量也使用不可变集合 - 或确保变量是私有的,并且您永远不会在类中改变集合。

您应该避免使用静态变量来存储全局变化状态。它使代码更难测试和推理。

【讨论】:

  • 据我现在的理解是只有一个静态变量,它与类相关联,变量的一个实例不包含静态变量,而是对象所在的类/类型实例化 from 包含变量,并且由于变量包含在类中,因此只有一个变量与实例无关,即使该类的实例为零,静态变量的状态仍然存在?说静态变量的作用域是它自己的类,任何带有 in 的代码块都可以访问它是否正确?
  • @Aaron:class 的实例不包含静态变量。类本身有效地包含静态变量,是的。我不会在这里使用“范围”这个词——它与谈论存在多少个变量“副本”几乎是正交的。
【解决方案2】:

1. 每个object of the class 都有自己的实例变量副本,即One per Object.

2.但是static variable被类的所有对象共享,它的One per Class.

3.现在我将举两个例子,这两个例子很重要。

实例变量:

考虑一个游戏程序,那么每个玩家将有不同的名称、分数、武器威力、达到的阶段等......

静态变量:

考虑一个银行程序,其中每个客户都将获得一个 ID,该 ID 比前一个更大且唯一,因此静态变量将适用于此。

【讨论】:

    【解决方案3】:

    静态变量用于存储在类的所有实例之间共享的值。

    如果不是这样,它应该是一个实例变量。

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2020-04-12
      • 2010-11-03
      • 2014-09-21
      • 2012-06-10
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多