Java 方法本地类?

Java 方法本地类?,java,Java,当我们在函数中声明一个类并创建该类的变量时,该类的对象是被推到堆栈还是堆上?在与内部类的上下文中使用final关键字时,我有一些困惑?如果堆栈上同时存在变量和类对象,那么为什么我们需要将变量命名为final 亲切的问候 当我们在函数中声明一个类并创建该类的变量时,该类的对象是被推到堆栈还是堆上 您的术语不正确,这可能是您困惑的根源: 类的声明不会导致分配任何空间。。。除了用于表示代码、静态等的空间的一次性分配之外,在加载和初始化类时也会发生这种情况 Java有方法,而不是函数 在方法(即局部变量

当我们在函数中声明一个类并创建该类的变量时,该类的对象是被推到堆栈还是堆上?在与内部类的上下文中使用final关键字时,我有一些困惑?如果堆栈上同时存在变量和类对象,那么为什么我们需要将变量命名为final

亲切的问候

当我们在函数中声明一个类并创建该类的变量时,该类的对象是被推到堆栈还是堆上

您的术语不正确,这可能是您困惑的根源:

类的声明不会导致分配任何空间。。。除了用于表示代码、静态等的空间的一次性分配之外,在加载和初始化类时也会发生这种情况

Java有方法,而不是函数

在方法(即局部变量)中声明变量时,变量本身的空间在堆栈上分配。如果声明静态或实例变量,则该空间将是堆节点的一部分

创建类实例(即对象)时,会在heap1上分配该实例的空间。该实例的引用可分配给先前分配的变量。。。在方法中局部变量的堆栈上或静态或实例变量的堆上。。。但它也可以立即丢弃。无论哪种方式,引用的空间分配都独立于实例的创建

在与内部类的上下文中使用final关键字时,我有一些困惑?如果堆栈上同时存在变量和类对象,那么为什么我们需要将变量命名为final

最后一个是必需的,因为Java不支持正确的闭包。当内部类引用封闭范围中的局部变量时,会发生什么情况?变量的值会传递给内部类并存储在隐藏变量中。final允许编译器对应用程序有效地隐藏它。由于应用程序无法更改变量的内容,因此无法判断变量2是否有两个副本

1-这有点过于简单化。如果您感兴趣,请阅读逃逸分析


2-这是局部变量存储在堆栈上的规则的例外。在这种情况下,变量的副本也存储在内部类实例的堆节点中。然而,这是一个实现细节。。。就像所有堆栈与堆的东西一样。如果JVM架构被更改为支持闭包,情况可能会有所不同。

1每个问题问一个问题,或者至少问相关问题。你试过用谷歌搜索这个吗?或者读取文档?Java中存储在堆栈上的惟一内容是原语和引用。对象总是存储在堆上。我不理解你所说的当你创建一个类的实例(即对象)时,该实例的空间是在堆1上分配的。该实例的引用可分配给先前分配的变量。。。在方法中的局部变量堆栈或静态或实例变量堆上,我使用标准Java术语和简单英语。如果你不明白,你需要给我一些你不明白的线索。