Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的可变垃圾收集_Java_Garbage Collection - Fatal编程技术网

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
 }