我什么时候在Java v.s实例变量中使用类变量?

时间:2012-07-24 17:10:47

标签: java oop instance-variables class-variables

这是我定义的泛型类,我想知道的是当我使用类变量创建更具体的类(例如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);
}
}

3 个答案:

答案 0 :(得分:6)

  

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

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

只有一个变量(假设你只是从一个类加载器加载它)然而有许多类型的实例。没有实例?还有一个变量。一百万个实例?还有一个变量。

静态变量主要用于常量或常数相似 - 例如记录器或“有效价格集”等。在应用程序过程中不会发生变化的事情。根据我的经验,它们几乎总是final,类型应该是不可变类型(如String)。在可能的情况下,对于静态变量也使用不可变集合 - 或者确保变量是私有的,并且永远不要在类中变异集合。

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

答案 1 :(得分:1)

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

2。static variable 将由<* strong>的所有对象共享,One per Class.

3。现在我将举两个例子来说明这两个重要性。

实例变量:

考虑一个游戏计划,然后每个玩家将拥有不同的名称,分数,武器力量,达到阶段等......

静态变量:

考虑一个银行业务计划,每个客户将获得一个Id,它比前一个更大且独特,因此静态变量将适用于此。

答案 2 :(得分:1)

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

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