Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 - Fatal编程技术网

Java中类的静态块中声明的非静态变量存储在哪里?

Java中类的静态块中声明的非静态变量存储在哪里?,java,Java,Java中类的静态块中声明的非静态变量存储在哪里?从逻辑上看,它们似乎必须存储在堆上——即使它们是基本变量。对吗?如果没有,它们存放在哪里 [编辑:] 考虑这个代码: import java.io.*; class book { static { int a = 1; // Where does this variable get stored? pen p = new pen(); // Where does this reference ge

Java中类的静态块中声明的非静态变量存储在哪里?从逻辑上看,它们似乎必须存储在堆上——即使它们是基本变量。对吗?如果没有,它们存放在哪里

[编辑:] 考虑这个代码:

import java.io.*;
class book
{
    static 
    {
        int a = 1; // Where does this variable get stored?
        pen p = new pen(); // Where does this reference get stored?
        System.out.println(a);
    }
}
class pen
{
    public int p;    
    public pen()
    {
        System.out.println("A pen has been created!");
    }
}
class GFG 
{
    public static void main (String[] args) 
    {
        book b = new book();
    }
}
我的问题是,在上面的代码中,变量ap存储在哪里?它们是存储在堆上还是堆栈上


因为静态块不是任何函数的主体,所以我认为变量应该存储在堆上。我想知道我是对的还是错的。

堆栈内存用于静态内存分配,它将具有特定于方法的基元值和对堆中对象的引用(从方法引用)。静态块中的所有内容都将存储在堆栈上

请提供一个可编译的示例。为什么要将它们存储在堆上?甚至还没有对象。你是说静态块中使用的局部变量吗?它们以与方法中使用的局部变量相同的方式存储在堆栈中。我认为这是不正确的。静态方法和块存储在Metaspace中,Metaspace是堆的一个特殊区域,您不能在那个里谈论堆栈内存。我想局部非静态变量也将存储在元空间中,您无法访问它,因为它的作用域在该块中开始和结束。这是一个非常有趣的问题,我认为不应该关闭它。@Marctizzano谢谢!为了澄清我的理解,静态方法的局部非静态变量是否也存储在堆上(即元空间上),还是像其他方法或函数一样存储在堆栈上?正如我所说,静态块存储在元空间中,没有为其创建的堆栈。静态块中的所有内容都将位于该空间堆区域,以及您在其中定义的本地非静态变量。