在java中类的初始化和对象的实例化有哪些区别,是先执行哪一步?

另外,String str = "abc",这个"abc"存放在哪里,是栈里还是堆里?
2024-11-28 18:44:37
推荐回答(3个)
回答1:

问题一:在程序RUN的一瞬间,什么类啊,静态的东西啊(静态块,静态方法,静态属性),刷刷刷的就在内存中加载(你可以看作初始化)了,只加载一次,然后main方法开始运行(这就是为什么main方法必须是静态的原因),然后执行main中的代码语句,执行到new对象时,才会实例化对象,记住:类加载,只执行一次,即只有有一个类对象(注意不是实例对象),无论你以后怎么个new法,新new的都是实例对象

问题二:heap(堆):用来动态生成内存的,如,属性,基本new出来的东西都在这里
stack(栈):局部变量
data segment(数据区):静态的变量,常量,包括字符串常量
code segment(代码区):编译后的代码http://zhidao.baidu.com/question/122739035.html和http://zhidao.baidu.com/question/121174275.html?fr=qrl&cid=1073&index=2&fr2=query
String str = "abc"。。。我也不好说 看情况吧,堆或者data segment,你可以参考

回答2:

类初始化,有了类才能有对象
系统内存一般情况来说分为四个
heap 堆 放 对象 也就是new 出来的东西
stack 栈 放局部变量
static segment 静态区 用来放 静态变量 和字符串常量
data segement 代码区 用来放代码的

如果 一个字符串是 String s = "abc";它放在栈里
如果一个字符串 用创建对象的方式 String s = new String("abc");
那它是放在了 堆里 而如果单纯的 一个 "abc" 这个输入字符串常量 是放在static segement里

回答3:

方法区 中的常量静态池
建议楼上先去了解清楚内存的结构以及实例对象的创建,别误人子弟!!
先在缓存中创建"abc" 当遇到new的时候,再直接从缓存中提取该实例,放入堆中,如果再次遇到new还是从缓存中提取.缓存中只创建1次.而且这里不是new!!