Java中的可变垃圾收集
以下变量声明之间有区别吗Java中的可变垃圾收集,java,garbage-collection,Java,Garbage Collection,以下变量声明之间有区别吗 Class A { private int a; A(){ a= 2; } } VS 垃圾收集的工作方式会有什么不同吗?您的两个初始化行为没有什么不同。在第一个示例中,a=2将在调用构造函数代码之前发生。如果您做了afinal: private final int a; //first example private final int a = 2; //second example 然后,您将看到在构造函数中可以执行的操作之间的差异: A(
Class A {
private int a;
A(){
a= 2;
}
}
VS
垃圾收集的工作方式会有什么不同吗?您的两个初始化行为没有什么不同。在第一个示例中,
a=2
将在调用构造函数代码之前发生。如果您做了a
final:
private final int a; //first example
private final int a = 2; //second example
然后,您将看到在构造函数中可以执行的操作之间的差异:
A(){ //The blank final field a may not have been initialized for first example
}
A(){
a = 2; //The final field Apple.a cannot be assigned for second example
}
在这两种情况下,您都将
int a
声明为类的成员变量。每当实例化该类时,堆上将为该整数留出空间。但是,垃圾收集器只关心是否存在对已实例化的包含对象的任何引用。无论您如何处理成员变量,如果存在对该对象的引用,则该对象将保留在内存中,在该引用之后,该对象才有资格进行垃圾收集
然而,也许你认为应该有所不同?这是为什么?没有区别,因为java编译器在构造函数内部初始化“private int a=2”。您可以使用java反编译器来确认我的上述声明。因此,这两个GC的工作原理是相同的。在第二个示例中,您没有指定可见性修饰符。如果它具有相同的访问修饰符怎么办?这个问题与垃圾收集有什么关系?说真的,这个问题实际上是关于垃圾收集的吗?如果没有,则应澄清以备将来搜索。
A(){ //The blank final field a may not have been initialized for first example
}
A(){
a = 2; //The final field Apple.a cannot be assigned for second example
}