java当使用静态方法时,类是否每次都被实例化?
假设我有一个静态方法增量:
public class StaticTest {
private static int no = 0;
public static void increment()
{
no++;
}
}
当我使用StaticTest.increment()
语法调用increment时,类是否被实例化过?如果堆上已经不存在该类型的对象怎么办
你可以在下面搜索框中键入要查询的问题!
假设我有一个静态方法增量:
public class StaticTest {
private static int no = 0;
public static void increment()
{
no++;
}
}
当我使用StaticTest.increment()
语法调用increment时,类是否被实例化过?如果堆上已经不存在该类型的对象怎么办
# 1 楼答案
您使用
new StaticTest
实例化一个实例,除非您创建了其中一个实例,否则您还没有创建实例# 2 楼答案
类本身被加载(由类加载器加载),如果它还没有加载。如果已经加载,则不会再次加载。不会创建该类的实例(该类类型的对象),因为您尚未创建任何实例
假设调用
StaticTest.increment()
的所有代码都使用相同的类加载器(通常情况下是这样),那么不管有多少不同的代码位调用该静态方法,只使用该类的一个副本。他们都有同感。例如:一旦所有这些都运行了,
StaticTest
中的no
私有静态成员的值为3
然后类加载器加载它
将该代码与此代码进行对比(无
static
):现在,我们不能这样做:
我们这样做:
第一个时间代码就是这样做的,类加载器加载
NonStaticTest
类。然后,new NonStaticTest()
表达式创建类的实例,该类有一个no
成员。秒时间代码执行此操作,NonStaticTest
已经加载,因此不会再次加载。然后new NonStaticTest()
表达式创建类的第二个实例如果我们有三位代码都执行上述操作,它们中的每一位都会看到“1”,因为
no
是特定于类的实例,而不是附加到类本身# 3 楼答案
您必须明确区分两件事:
类由类加载器加载一次,而类的对象则在每次调用
new ClassName()
(如果类被调用ClassName
)时创建现在,回到您的问题:使用
static
关键字使您的声明独立于类的任何实例(对象)因此,当您使用
StaticTest.increment()
时,不会创建类StaticTest
的对象(并且不需要对象)