我认为这有助于理解非静态的含义,即没有关键字声明的字段/方法/ static
...。
没有关键字 static 声明的每个字段都作为对象的一部分存在。如果您有两个对象,则这两个对象中的每一个都有一个内容可能不同的字段:
class X {
int f;
}
X x1 = new X();
X x2 = new X();
x1.f = 5;
x2.f = 10;
// x1.f still is 5
但是,静态字段不是每个对象存在的,而是每个类存在的。g
因此,在以下示例中,无论您拥有多少(如果有!)类对象,都只有一个字段Y
:
class Y {
static int g;
}
Y y1 = new Y();
Y y2 = new Y();
y1.g = 5;
y2.g = 10;
// y1.g is 10, because y1.g and y2.g mean the exact same thing
我个人认为对静态字段的访问应该使用类(Y.g
)而不是提及对象实例(y1.g
),这样没有任何对象实例的存在就更明确了。
对于方法,不同之处在于非静态方法与对象实例相关联,可以this
在方法内部进行访问。调用声明的方法时,void m()
您可以访问调用它的对象的非静态(和静态)字段(因此,x1.m()
从上面的示例中,您可以访问包含 5 的字段,因为x2.m()
您可以访问包含 10 的字段。
然而,静态方法可以在没有(相应的?)对象的情况下被调用。如果声明static void n()
在 class 内部,您可以使用orY
调用此方法(如果是 instanceof ,如上)。在这里,我也更喜欢第一种写下来的方式。因为在静态方法中您没有对对象实例的引用(在非静态方法中命名),所以您无法从静态方法内部访问特定的非静态字段 - 仅仅是因为与特定对象没有明确的关联.Y.n()
y1.n()
y1
Y
this
关于static
和类定义:这是相当先进的。您可以在另一个类中声明一个类。如果内部类不是静态的,则内部类的每个对象实例也都有对外部类实例的引用(这也意味着只有在有外部类的实例时才能创建内部类的实例)。这并不总是你想要的。通过声明内部类static
,它只是存在并且可以或多或少地像在自己的文件中定义的类一样使用。