gpt4 book ai didi

java - static 关键字在 Java 中如何工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:50:24 25 4
gpt4 key购买 nike

我正在阅读 Java tutorials从一开始,我对字段或变量上的 static 关键字有疑问。正如 Java 所说 here :

Class Variables (Static Fields) A class variable is any field declared with the static modifier; this tells the compiler that there is exactly one copy of this variable in existence, regardless of how many times the class has been instantiated. A field defining the number of gears for a particular kind of bicycle could be marked as static since conceptually the same number of gears will apply to all instances.

有了这个,我想如果你有一个对象(在本例中,类 Bicycle 的一个实例)和它里面的一个字段,它的 static 那么,无论您是害怕 bicycle1 还是 bicycle2,其静态字段都将具有相同的值。我错了还是我理解得很好?

我的意思是,如果我有:

Bicycle bicycle1 = new Bicycle();
Bicycle bicycle2 = new Bicycle();

Bicycle 类中,我有一个 static 字段,例如:

class Bicycle{
static int gears;

//Methods to set and get gears
}

bicycle1 中,我将齿轮的值设置为七:

bicycle1.setGears(7);

然后,如果我尝试获取 bicycle2 中齿轮的值,我应该得到与我在 bicycle1 中设置的值相同的值,对吗?

System.out.println(bicycle2.getGears()); //7

嗯,这是我有疑问的地方,因为正如 Java 在我上面的引述中所说:

this tells the compiler that there is exactly one copy of this variable in existence

这个副本存储在哪里?对象如何访问该副本?这个副本是什么时候创建的?

最佳答案

此副本存储在哪里?

副本(静态变量)存储在Permanent Generation部分,但是如果你使用Java8,Permanent Generation部分不再存在。静态变量和静态方法是反射数据的一部分,它们是类相关数据而不是实例相关数据。

对象如何访问该副本?

您创建的类(对象)的每个实例都有对该类的引用。

此副本何时创建?

它是在加载类时在运行时创建的:这是在首次引用类时由 JVM 的类加载器完成的。

静态变量属于类,而不属于类的实例。您的直觉是正确的 - 无论您创建了多少个对象,您都只有一个副本。

您可以使用类名访问静态变量,如本例所示:

class Static {

static int staticField;

}

public class UseStatic {

public static void main(String[] args) {

System.out.println(Static.staticField);

}
}

静态字段对于创建某种类常量很有用。

最后,要轻松初始化特定类的静态字段,您可以使用 Static Initialization Blocks .

来源:Java 大学类(class),java official documentation

关于java - static 关键字在 Java 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com