静态关键字在Java中是如何工作的?
我从一开始就在阅读,我有一个关于字段或变量的静态关键字在Java中是如何工作的?,java,Java,我从一开始就在阅读,我有一个关于字段或变量的static关键字的问题。正如Java所说: 类变量(静态字段)类变量是使用静态修饰符声明的任何字段;这会告诉编译器,不管类被实例化了多少次,该变量只有一个副本存在。定义特定类型自行车档位数量的字段可以标记为静态,因为概念上相同的档位数量将应用于所有实例 有了它,我想如果你有一个对象(在本例中是类Bicycle)和一个字段,它的是静态的,那么不管你是在引用bicycle1还是bicycle2,这个字段的静态值都是相同的。是我错了还是我理解得很好 我是说
static
关键字的问题。正如Java
所说:
类变量(静态字段)
类变量是使用静态修饰符声明的任何字段;这会告诉编译器,不管类被实例化了多少次,该变量只有一个副本存在。定义特定类型自行车档位数量的字段可以标记为静态,因为概念上相同的档位数量将应用于所有实例
有了它,我想如果你有一个对象(在本例中是类Bicycle
)和一个字段,它的是静态的
,那么不管你是在引用bicycle1
还是bicycle2
,这个字段的静态值都是相同的。是我错了还是我理解得很好
我是说,如果我有:
Bicycle bicycle1 = new Bicycle();
Bicycle bicycle2 = new Bicycle();
在类Bicycle
中,我有一个static
字段,如:
class Bicycle{
static int gears;
//Methods to set and get gears
}
在自行车1
中,我将档位设置为7:
bicycle1.setGears(7);
然后,如果我试图获得自行车2
中的档位值,我应该得到与我在自行车1
上设置的档位值相同的值,对吗
System.out.println(bicycle2.getGears()); //7
好吧,这里是我有疑问的地方,因为正如我在上面引用的Java
所说:
这会告诉编译器该变量存在一个副本
这个副本存放在哪里?对象如何访问该副本?何时创建此副本?java中的静态变量存储在类中,您不需要创建它的实例来访问它们
class Bicycle{
public static int gears = 7;
//Methods to set and get gears
}
您可以像这样访问静态方法
Bicycle.gears;
所以,java上只声明了一个Bicycle类,当您实例化一个类时,它将创建一个Bicycle实例,并声明所有静态属性
这个副本存放在哪里
静态变量存储在一些静态存储中(我相信是在permgen中),您不应该为此烦恼
这个副本是什么时候创建的
它们是在第一次访问类时创建的(由类加载器加载),并且从不删除(除非类被卸载)
对象如何访问该副本
实例引用了它的类,类尊重它的所有变量。如何准确地将C结构放置在内存中是具体实现的细节
因为静态变量绑定到类而不是实例,所以您甚至不需要实例化类来访问它们<代码>MyClass.myStaticVar正常 此副本存储在哪里? 副本(静态变量)存储在永久生成部分中,但是如果使用Java8,永久生成部分将不再存在。 静态变量和静态方法是反射数据的一部分,反射数据与类相关,与实例无关 对象如何访问该副本? 您创建的类(对象)的每个实例都有对该类的引用 何时创建此副本? 它是在运行时加载类时创建的:这是在第一次引用类时由JVM的类加载器完成的 静态变量属于类,而不属于类的实例。 你的直觉是正确的——不管你创建了多少个对象,你只有一个副本 您可以使用类的名称访问静态变量,如本例所示:
class Static {
static int staticField;
}
public class UseStatic {
public static void main(String[] args) {
System.out.println(Static.staticField);
}
}
静态字段可用于创建某种类常量。
最后,为了方便地初始化特定类的静态字段,您可以使用
资料来源:大学java课程
有了这个,我想如果你有一个对象(在这个例子中是一个
类的实例)及其内部的字段
然后是静态的,独立于您是否正在参考bicycle1或
bicycle2,其静态值将具有相同值的字段。我是吗
错了还是我理解得很好
当您第一次用Java实例化一个类时,JVM会创建两件事:
- 一个例子。将为您创建的每个实例在堆上分配一组非静态字段。这些实例字段独立于所有其他实例(并用于表示其对象的状态)
- 类对象。Java中的每个类都有一个且只有一个类对象。。。无论创建了多少实例。例如,Class
的类对象是String
(以文本形式表示为Class
)。可以将类的静态字段视为属于类对象。类对象的生命周期独立于类实例的生命周期;只要JVM进程在运行,类对象就存在(因此,它们的静态字段也存在那么长的时间)String.Class
static
关键字理解为“独立于任何实例”是很有用的:
- 静态字段属于类对象,而不属于任何实例
- 静态方法通过类对象调用,不能直接访问任何实例
- 静态成员类实例不依赖于任何其他实例