java的内存分配问题
publicclassTest{publicstaticvoidmain(String[]args){intx=5;{Test2t=newTest2(5);if(t.x=...
public class Test {
public static void main(String[] args) {
int x=5;
{
Test2 t=new Test2(5);
if(t.x==x){
System.out.println("oh");
}
}
if(x==5){
System.out.println("ah");
}
}
}
class Test2{
public int x;
Test2(int i){
x=i;
}
}
我想问一下x存储在常量池,t是new出来的应该是存放在堆里,为什么第一个if会输出oh,“==”不是连内存地址都要相同吗?还有块{
Test2 t=new Test2(5);
if(t.x==x){
System.out.println("oh");
}
}
结束后会不会释放t,如果释放t,那t.x不就释放了,x与t.x内存地址相同不也就释放了,为什么x还等于5? 展开
public static void main(String[] args) {
int x=5;
{
Test2 t=new Test2(5);
if(t.x==x){
System.out.println("oh");
}
}
if(x==5){
System.out.println("ah");
}
}
}
class Test2{
public int x;
Test2(int i){
x=i;
}
}
我想问一下x存储在常量池,t是new出来的应该是存放在堆里,为什么第一个if会输出oh,“==”不是连内存地址都要相同吗?还有块{
Test2 t=new Test2(5);
if(t.x==x){
System.out.println("oh");
}
}
结束后会不会释放t,如果释放t,那t.x不就释放了,x与t.x内存地址相同不也就释放了,为什么x还等于5? 展开
展开全部
楼上不对。==是比较的内存地址,这点是毋庸置疑的。
首先,要明白,两个x的定义过程。
x的定义过程是:声明一个标量 int类型 x,然后在栈内存中寻找,看有没有5这个值,如果有,x指向5,如果没有,把5放进来,x指向这个5.
t.x也是一样的。
那么现在就很明了了。不管test2是不是new出来的。Test2中的x都会先在栈内存中寻找5这个值,经过寻找发现,确实有5,这个5已经在Test类中定义,这时候就直接指向了。所以“==”之后会得到true。因为他们指向的就是同一个内存地址。
如果还有不明白,请追问。
首先,要明白,两个x的定义过程。
x的定义过程是:声明一个标量 int类型 x,然后在栈内存中寻找,看有没有5这个值,如果有,x指向5,如果没有,把5放进来,x指向这个5.
t.x也是一样的。
那么现在就很明了了。不管test2是不是new出来的。Test2中的x都会先在栈内存中寻找5这个值,经过寻找发现,确实有5,这个5已经在Test类中定义,这时候就直接指向了。所以“==”之后会得到true。因为他们指向的就是同一个内存地址。
如果还有不明白,请追问。
更多追问追答
追问
也就是说x=t.x比较的不是x和t.x的地址,而是x的值跟t.x的值即5这个地址,因为5==5所以成立?
追答
5是有一个自己的栈内存地址的,x 跟 t.x只不过都是指向了这个地址。5对于咱们来说却是只是一个值,但是对于计算机来说就是内存空间中的一段特殊区域。
这样就明白了。x==t.x 其实就是同一个地址的比较。只是不同的引用而已。
举例说下:你跟你老婆有一个存折,一张银行卡,都用的是一个账户,里面有100w。你的存折的的钱跟银行卡的钱是一样的。因为你们用的是一个账户。
这个银行的账户就是内存地址。
你可能会问,那不还是钱数一样吗。错!因为是同一个账户,所以钱数一样。银行不会把我的100w给你取出去。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询