有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当使用静态方法时,类是否每次都被实例化?

假设我有一个静态方法增量:

public class StaticTest {
    private static int no = 0;

    public static void increment()
    {
        no++;
    }
}

当我使用StaticTest.increment()语法调用increment时,类是否被实例化过?如果堆上已经不存在该类型的对象怎么办


共 (3) 个答案

  1. # 1 楼答案

    您使用new StaticTest实例化一个实例,除非您创建了其中一个实例,否则您还没有创建实例

  2. # 2 楼答案

    When I call increment using the StaticTest.increment() syntax, does the class ever get instantiated?

    类本身被加载(由类加载器加载),如果它还没有加载。如果已经加载,则不会再次加载。不会创建该类的实例(该类类型的对象),因为您尚未创建任何实例

    假设调用StaticTest.increment()的所有代码都使用相同的类加载器(通常情况下是这样),那么不管有多少不同的代码位调用该静态方法,只使用该类的一个副本。他们都有同感。例如:

    // Some bit of code somewhere
    StaticTest.increment();
    
    // Another bit of code somewhere else
    StaticTest.increment();
    
    // A third bit of code in yet another place
    StaticTest.increment();
    

    一旦所有这些都运行了,StaticTest中的no私有静态成员的值为3

    What if no class of that type exists on the heap already?

    然后类加载器加载它


    将该代码与此代码进行对比(无static):

    public class NonStaticTest {
        private int no = 0;
    
        public void increment()
        {
            no++;
        }
    
        public int getNo() // So we can see the results
        {
            return no;
        }
    }
    

    现在,我们不能这样做:

    NonStaticTest.increment(); // WRONG, fails with error saying `increment` is not static
    

    我们这样做:

    NonStaticTest instance = new NonStaticTest();
    instance.increment();
    System.out.println(instance.getNo()); // "1"
    

    第一个时间代码就是这样做的,类加载器加载NonStaticTest类。然后,new NonStaticTest()表达式创建类的实例,该类有一个no成员。秒时间代码执行此操作,NonStaticTest已经加载,因此不会再次加载。然后new NonStaticTest()表达式创建类的第二个实例

    如果我们有三位代码都执行上述操作,它们中的每一位都会看到“1”,因为no是特定于类的实例,而不是附加到类本身

  3. # 3 楼答案

    您必须明确区分两件事:

    • 类,这是一种“自定义类型”(我在这里简化)
    • 对象,它们是这些类的实例

    类由类加载器加载一次,而类的对象则在每次调用new ClassName()(如果类被调用ClassName)时创建

    现在,回到您的问题:使用static关键字使您的声明独立于类的任何实例(对象)

    因此,当您使用StaticTest.increment()时,不会创建类StaticTest的对象(并且不需要对象)