int a[]={100,200,300};
int b[]={10,11,12,13,14,15,16};
b=a;
System.out.println("数组a:"+a[0]+","+a[1]+","+a[2]);
b[0]=123456;
System.out.println("数组a:"+a[0]+","+a[1]+","+a[2]);
System.out.println("数组b:"+b[0]+","+b[1]+","+b[2]);
System.out.println("数组b的长度:"+b.length); int d=10;
int e=20;
e=d;
e=30;
System.out.println(d);
System.out.println(e);数组a:100,200,300
数组a:123456,200,300
数组b:123456,200,300
数组b的长度:3
d=10
e=30为什么把b[0]=123456;a[0]的值也发生了变化?
数组有这种情况,非数组却没有变化呢?
int b[]={10,11,12,13,14,15,16};
b=a;
System.out.println("数组a:"+a[0]+","+a[1]+","+a[2]);
b[0]=123456;
System.out.println("数组a:"+a[0]+","+a[1]+","+a[2]);
System.out.println("数组b:"+b[0]+","+b[1]+","+b[2]);
System.out.println("数组b的长度:"+b.length); int d=10;
int e=20;
e=d;
e=30;
System.out.println(d);
System.out.println(e);数组a:100,200,300
数组a:123456,200,300
数组b:123456,200,300
数组b的长度:3
d=10
e=30为什么把b[0]=123456;a[0]的值也发生了变化?
数组有这种情况,非数组却没有变化呢?
解决方案 »
- String String pool面试题疑惑 求高手解!
- javamail中,如何根据邮件的uid,获取邮件,有这个方法没?
- 如何写好多分支语句,条件是字符窜
- 关于dom读xml文件时,子节点数与实际文件中的节点数不一致的问题。多读了2个“#text”
- C:\BufferedImg.java:129: 'class' or 'interface' expected 错误??
- 求一段画时钟的代码?
- 征求一算法,关于从数据库中得到数据显示问题(在线等待,解决立即给分!不难)
- 请大侠给新手一个例子.
- 请问各位BufferedImage对象实现序列化了么?
- java 里有没有类似于 c 里面的引用参数(reference parameters)
- 请求高手:我想问一下这个语句public static void main(String a[]) 中的String a[]是什么意思
- java 把TextField内容通过按钮事件储存到文本文件中
2. 要想改b时不改a,建议使用b=a.clone()
数组a:100,200,300
数组b:123456,11,12
是我错了吗?
Java里基本类型只有8种,它们以及相应的包装类在Java里有特殊处理.
楼主拿其他的对象做实验吧.
Integer e=20;
这种情况也是上面的结果。
Integer e=Integer.valueof(20);
基本类型和基本类型的包装类是有特殊处理的,其实包装类这么做,也是为了兼容基本类型的语法.
不然哪儿还叫"包装"啊喵~~`
执行 b=a 之后 ,a 和 b 就指向了同一块内存
所以执行b=a;后a,b引用了同一个实例,所以改变b的值和改变a的值都会改变同一个被引用实例.
而d和e是值
执行e=d;后只是d的值与e的值相等,而不是保存在同一内存,所以改e后,d不会跟着改变!
int b[]={10,11,12,13,14,15,16};
b=a; //让B对象也指向A对象所指向的数组
System.out.println("数组a:"+a[0]+","+a[1]+","+a[2]);
b[0]=123456;
System.out.println("数组a:"+a[0]+","+a[1]+","+a[2]);
System.out.println("数组b:"+b[0]+","+b[1]+","+b[2]);
System.out.println("数组b的长度:"+b.length); a----->a数组
b----->B数组
b=a;
即:
a----->a数组
b----->a数组
b[0]=123456;
所以A对象所指向的数组也会变的int是分配在栈空间里
内存布局
int d=10; -------d:10
int e=20; -----e:20
e=d; ------d:10
e=30; ----e:30
他们是互不干预的
int是分配在栈空间里
内存布局
int d=10; -------d:10
int e=20; -----e:20
e=d; ------e:10
e=30; ----e:30
他们是互不干预的
2. 要想改b时不改a,建议使用b=a.clone()这个正解
此时b是指向a的引用~~
也就是a,b都引用同一地址,那就是a的地址·
a和b是数组是引用类型 那么他们就相当于标签。而数组中的实际值相当于盒子里的东西。
当 a= b 时 就是把a的标签贴到b的盒子上去,b[0]=123456就是把b的盒子里的东西换了。
然后a[0]取到就是b的盒子里的东西
当然 使用内存堆栈来解释更科学一点。
Integer e=Integer.valueof(20);
d=e
e=Integer.valueof(30);
输出后:
d=10
e=30楼下的能给详细的解释一下 这个与数组的存放机制有什么区别
以及java是如何处理integer这种引用类型处理 “输出后:d=10 e=30“内存存放和指针指向的地址?
基本类型不存在,它们的值存放在栈里的.
基本类型的包装类依然有引用,会在堆里占用内存空间喵~``
Integer d=Integer.valueof(10);
Integer e=Integer.valueof(20);
d=e
e=Integer.valueof(30);
输出后:
d=10
e=30 楼下的能给详细的解释一下 这个与数组的存放机制有什么区别
以及java是如何处理integer这种引用类型处理 “输出后:d=10 e=30“内存存放和指针指向的地址?
基本类型不存在,它们的值存放在栈里的.
基本类型的包装类依然有引用,会在堆里占用内存空间喵~`` Integer d=Integer.valueof(10);
Integer e=Integer.valueof(20);
d=e
e=Integer.valueof(30);
输出后:
d=10
e=30 楼下的能给详细的解释一下 这个与数组的存放机制有什么区别
以及java是如何处理integer这种引用类型处理 “输出后:d=10 e=30“内存存放和指针指向的地址?
它们所定义的变量,保存的其实是其对象的首地址.所以赋值语句b=a,相当于让变量b和a指向了同一个数组,即a所指向的数组.
所以结果会是这样,不知道这样说LZ是否能明白.