Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
            
                    
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        5年前关闭。
                    
                
        

我们知道在类加载时会为静态变量分配内存。最终的非静态变量也是如此。我知道在该类的每个实例中都将存在一个最终变量的新副本。我认为,最终非静态变量的第一个副本将在类加载本身时创建。请解释

最佳答案

确实,静态字段的内存是在类加载时分配的。或者更确切地说,在类链接阶段,与加载分开。

但这与最终的非静态字段无关。

首先,您无法为某个字段“分配”内存,而不能为其所属的整个对象分配内存。该字段将成为对象的一部分。一旦使用new运算符,将仅为该对象分配空间。

但是也许您认为它的值将在类加载期间预先准备好,然后在创建新实例后立即复制到新实例中?

考虑以下情况:

class A {
    private final int myInt;

    public A( int valueForMyInt ) {

        myInt = valueForMyInt;

    }

    // Other constructors and methods
}


myInt的值在构造期间设置。字段为final的事实并不意味着在所有实例中其所有副本都是相同的。您可以使用常量初始化程序,初始化块或在构造函数中初始化final字段,并且它们在其中设置的值不必对于每个实例都相同。您可以使用new A(15)new A(27)或所需的任何整数创建新实例。

因此,没有理由在实例的其余部分之前设置最终字段。它的分配方式与非最终字段完全相同。唯一的区别是不能再次分配它。

09-30 14:59
查看更多