静态是指被“卡住”的是什么?

时间:2012-04-21 01:56:31

标签: static terminology

我试图给自己一个静态一词的映射概念(使用我当前的静态名词定义,对形容词定义没有很好的理解),但看起来非静态变量和方法实际上是“卡住”(或更好地说引用/引用)对象/实例。那么什么是静态实际描述声明的方法/变量的术语?

2 个答案:

答案 0 :(得分:2)

“静态”和“动态”这两个词在编程术语中经常被用作对立面。

一些动态的东西会发生变化;在类的上下文中,它与每个实例(对象)具有不同的值或行为。

静止的东西不会改变;它处于停滞状态。因此,类的静态变量不会对每个实例采用不同的值。

静电不动;它被困在一个地方,在你的袜子上。动态电流,在电线中运动,可以做更强大的事情。

答案 1 :(得分:1)

我认为这里的问题提供了一个非常详细的答案:What is "static"?

static的概念与某个东西是某个类还是某个对象(实例)的一部分有关。

对于main方法声明为static的情况,它表示main方法是一个类方法 - 一个属于类的方法,而不是一个对象的一部分。这意味着另一个类可以通过引用ClassName.method来调用另一个类的类方法。例如,调用MyClass的run方法将通过以下方式完成:

MyClass.main(new String[]{"parameter1", "parameter2"});

另一方面,没有static修饰符的方法或字段意味着它是对象的一部分(或者也称为“实例”)而不是类的一部分。它由方法或字段所属的特定对象的名称引用,而不是类名:

MyClass c1 = new MyClass();
c1.getInfo()     // "getInfo" is an instance method of the object "c1"

由于每个实例可能具有不同的值,因此不同对象中具有相同名称的方法或字段的值不一定必须相同:

MyClass c1 = getAnotherInstance();
MyClass c2 = getAnotherInstance();

c1.value     // The field "value" for "c1" contains 10.
c2.value     // The field "value" for "c2" contains 12.
             // Because "c1" and "c2" are different instances, and 
             // "value" is an instance field, they can contain different
             // values.

结合实例和类变量的两个概念。假设我们声明一个包含实例和类变量和方法的新类:

class AnotherClass {
    private int instanceVariable;
    private static int classVariable = 42;

    public int getInstanceVariable() {
        return instanceVariable;
    }

    public static int getClassVariable() {
        return classVariable;
    }

    public AnotherClass(int i) {
        instanceVariable = i;
    }
}

上面的类有一个实例变量instanceVariable,以及一个用classVariable修饰符声明的类变量static。同样,有一个实例和类方法来检索值。

实例的构造函数接受一个值以作为参数分配给实例变量。类变量初始化为42并且永远不会更改。

让我们实际使用上面的课程,看看会发生什么:

AnotherClass ac1 = new AnotherClass(10);

ac1.getInstanceVariable();             // Returns "10"
AnotherClass.getClassVariable();       // Returns "42"

请注意调用类和实例方法的不同方法。它们通过名称AnotherClass引用类的方式,或名称ac1引用的实例。让我们进一步看看方法的行为差异:

AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);

ac1.getInstanceVariable();             // Returns "10"
AnotherClass.getClassVariable();       // Returns "42"
ac2.getInstanceVariable();             // Returns "20"
AnotherClass.getClassVariable();       // Returns "42"

可以看出,实例变量是由对象(或“实例”)持有的变量,因此对于该特定实例是唯一的,在此示例中是ac1和{引用的对象{1}}。

另一方面,类变量仅对整个类是唯一的。为了更好地理解这一点,让我们为ac2添加一个新方法:

AnotherClass

然后,运行以下命令:

public int getClassVariableFromInstance() {
    return classVariable;
}

尽管AnotherClass ac1 = new AnotherClass(10); AnotherClass ac2 = new AnotherClass(20); ac1.getInstanceVariable(); // Returns "10" ac1.getClassVariableFromInstance(); // Returns "42" ac2.getInstanceVariable(); // Returns "20" ac2.getClassVariableFromInstance(); // Returns "42" 是一个实例方法,通过引用实例getClassVariableFromInstanceac1可以看出,它们都返回相同的值,ac2 。这是因为在两个实例方法中,它们引用类方法42,它对于类是唯一的,而不是对实例的引用 - 对于类{{1},只有classVariable的单个副本}}

我希望有些内容可以澄清classVariable修饰符的用途。

来自Sun的

The Java Tutorials有一个名为Understanding Instance and Class Members的部分,它也涉及两种类型的变量和方法。