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

Fra*_*ero 6 java

我正在从头开始阅读Java教程,我static对字段或变量的关键字有疑问.至于Java在这里:

Class Variables (Static Fields)类变量是使用static修饰符声明的任何字段; 这告诉编译器这个变量只有一个副本存在,无论该类被实例化多少次.定义特定类型自行车的齿轮数量的区域可以标记为静态,因为从概念上讲,相同数量的齿轮将适用于所有实例.

有了这个,我想如果你有一个对象(在这种情况下,是一个类的一个实例Bicycle)和它内部的一个字段,那么它是static独立的,如果你正在为它bicycle1或者bicycle2,它的静态将具有相同的字段值.我错了还是我理解得很好?

我的意思是,如果我有:

Bicycle bicycle1 = new Bicycle();
Bicycle bicycle2 = new Bicycle();
Run Code Online (Sandbox Code Playgroud)

在课堂上Bicycle我有一个static字段:

class Bicycle{
   static int gears;

   //Methods to set and get gears
}
Run Code Online (Sandbox Code Playgroud)

bicycle1我设置齿轮的值为七:

bicycle1.setGears(7);
Run Code Online (Sandbox Code Playgroud)

然后,如果我试图获得齿轮的值,bicycle2我应该得到与我设置的相同的值bicycle1,对吧?

System.out.println(bicycle2.getGears()); //7
Run Code Online (Sandbox Code Playgroud)

好吧,这就是我怀疑的地方,因为正如Java我在上面提到的引文中所说:

这告诉编译器存在这个变量的正好一个副本

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

小智 9

这份副本存放在哪里?

副本(静态变量)存储在"永久生成"部分中,但如果使用Java8,则"永久生成"部分不再存在.静态变量和静态方法是反射数据的一部分,反射数据是与类相关的数据,而不是与实例相关的.

对象如何访问该副本?

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

这个副本什么时候创建的?

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

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

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

class Static {

    static int staticField;

}

public class UseStatic {

    public static void main(String[] args) {

        System.out.println(Static.staticField);

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

资料来源:java大学课程,java官方文档