java局部变量 int a =1是存放在哪里
1.基本类型的 变量 a 和他所指向的值 1是存在栈里还是方法区的常量池中。
2.a中存的是1的值还是地址?
说来惭愧,竟然都有些模糊了,一个方法中的变量名和变量值(这是两个概念)一般都是存在方法栈的本地变量数组中,有一种情况就是当变量的值为-128~127时,变量的值不会新建内存而是直接引用方法区常量池中的值。
所以你上面的第一个问题是,a这个变量名在栈的本地变量数组中,1这个值是直接引用方法区常量池中的值
第二个问题是,a中存的是1这个字面值,因为执行了int a = 1这个赋值操作
这个问题我想再补充下。
lz陷入一种悖论中。因为不知道,所以要提问,然后面对各种矛盾的回答,你不知道相信谁。最后,你还是不知道。
这种情况下,lz无非两个选择:
(1)采用“投票”的方式,看哪种说法的回答多,就相信谁。
大部分的人为什么永远没有办法进步就是在于此,一方面他想从菜鸟的群体中脱离出来,另一方面他只接受菜鸟中大多数人的意见。并且顽固地认为这才是正确的认知方式。
(2)加上自己的思考、判断和求证。
求证的方式很简单,只要按照你的要求写个程序,反编译下java字节码,然后你就看到结论了。这是解决问题的终极方式。这个问题可以这么解决。
思考和判断是更进阶的方式。
可以教你一个简单的思想方法,我们把它叫做"奥卡姆剃刀原理"。简单来说就是八个字,如无必要,勿增实体。如果有两个理论都可以解释同一个事物,那么简单的那个取胜。
运用这个原理,你可以把自己想象成java语言的发明者和jvm的设计者。然后倒推这个问题。
为什么java要分为什么常量、简单类型、引用类型等等,显然java并非是为了考试和刁难它的使用者而徒增这些概念的。唯一的动机就是增加复杂性换取性能
。那么如果不换取性能,最简单的方式是什么呢,显然就是一切变量都是引用类型,这是最简单的。一个引用类型可以概括java里所有的东西。
那么简单类型和常量是什么,它是特例。用特例换取性能。对于整数来说,它频繁参与到计算中,如果用定义一个类,并且使用一个指针的方式来使用它,就会浪费很多性能。所以才有了简单类型。而常量是怎么回事?它是对大量重复使用的引用类型的一种性能优化,用共享对象的方式,来将大量相同的对象合并存储唯一的一份。搞清楚了这些,再回过头来看你的问题,就很简单了。
首先明确a是int类型,基本类型,所以问题2的答案很明显,a中存的是1的值,因为是局部变量,所以是在a和1均在方法区中
如果是写在函数里的,那么a放在堆栈上。存储的就是值。
Integer(1)放在常量池中
问题二 a存的值是1,但他的内存地址指向常量池1,
1.a是变量,所以方法执行的时候a和它的值在栈中,方法执行完后a就销毁了
2.a中存的是1的值。
局部变量存在栈中。类中常量和静态变量等放在常量池中。
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
楼主弄明白了嘛 最近复习的时候也遇到了这个问题 现在的理解是 int a 这个a变量存在栈中 但是这个代表值的1不知道是怎么算的 假如有个int b =1 那这俩个1在实际内存中的地址不知道是不是一致的 望解答