我试图给自己一个静态一词的映射概念(使用我当前的静态名词定义,对形容词定义没有很好的理解),但看起来非静态变量和方法实际上是“卡住”(或更好地说引用/引用)对象/实例。那么什么是静态实际描述声明的方法/变量的术语?
答案 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"
是一个实例方法,通过引用实例getClassVariableFromInstance
和ac1
可以看出,它们都返回相同的值,ac2
。这是因为在两个实例方法中,它们引用类方法42
,它对于类是唯一的,而不是对实例的引用 - 对于类{{1},只有classVariable
的单个副本}}
我希望有些内容可以澄清classVariable
修饰符的用途。
The Java Tutorials有一个名为Understanding Instance and Class Members的部分,它也涉及两种类型的变量和方法。