Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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_.net_Oop_Class - Fatal编程技术网

Java 是对象';堆或堆栈上的私有成员?

Java 是对象';堆或堆栈上的私有成员?,java,.net,oop,class,Java,.net,Oop,Class,以任何引用为基本结构的OOPs语言(如java和c#)为例 为了快速执行,它们还支持int和char等基本类型。 我认为这是通过将它们存储在堆栈上实现的。 和堆上的对象类型 为此: class B { ... } class A { int a; B b; } A.A是在堆栈中还是在堆上? 类对象,包括方法代码和静态字段:heap 对象,包括实例字段:heap 局部变量和方法调用:堆栈 但对于java6,有些情况下会在堆栈上创建对象 证明:只有局部变量存储在堆栈中,其他变量存

以任何引用为基本结构的OOPs语言(如java和c#)为例

为了快速执行,它们还支持int和char等基本类型。 我认为这是通过将它们存储在堆栈上实现的。 和堆上的对象类型

为此:

class B
{
 ...
}

class A
{
   int a;
   B b;
}
A.A是在堆栈中还是在堆上?

  • 类对象,包括方法代码和静态字段:heap
  • 对象,包括实例字段:heap
  • 局部变量和方法调用:堆栈
但对于java6,有些情况下会在堆栈上创建对象


证明:

只有局部变量存储在堆栈中,其他变量存储在堆中。

基本答案是所有局部变量都在堆栈中,其他所有变量都在堆中。但是,从Java 7开始,编译器将执行一种称为转义分析的技术,该技术检查对象是否严格在方法中使用(而不是转义该方法),并且在找到这样的对象后,将在堆栈上分配其存储。此行为是通过引入的,但默认情况下未激活

这和许多其他示例一样,向您展示了Java语言规范是一回事,实现是另一回事。只要实现的行为符合JLS的定义,它就是合法的。

请参见此答案