还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗? a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。
还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗? a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。元首,讲讲String和Integer不创建对象的原因,顺便元首还知道哪些包装类像这样传不创建对象
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}
是滴,从某个角度来说,java中就只存在值传递
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了final 的啊,我擦。龙套了
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了final 的啊,我擦。龙套了
不是因为final的原因,你可以自己写一个类,定义成final的,当传入的时候一样会改变,不存在不可变类对象传递就不会改变,这跟可变不可变没关系
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。我在DEBUG看一下
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了,
但是public static void getRes(Integer d) {//传过来的时候id=27
d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
}刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了final 的啊,我擦。龙套了
这根final不final没有关系、、
String是final的,当你在方法中传递String时是引用传递,但是你不能改变这个String对象的值.我一直是这么理解的那应该咋回事?
public final class A {
int x =10;
public static void p(A a) {
a = new A();
a.x = 5;
}
public static void main(String args[]) {
A a = new A();
System.out.println(a.x);
p(a);
System.out.println(a.x);
}
}
我定义了一个final的A,穿进去把a重新指向了一个新的对象。改变他的属性值,而方法执行之后,打印a还是指向之间那个对象,说明我们传的是引用的值。而不是类似C++引用传递
public static void getRes(int[] c) { c[0] = c[0]+1;}
这两个的值会发生改变,其他的没影响!
元首,java的值传递,你说的我明白了。public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
元首,java的值传递,你说的我明白了。public static void getRes(String a) { //这传的是一份地址的拷贝
a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。
a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。元首,讲讲String和Integer不创建对象的原因,顺便元首还知道哪些包装类像这样传不创建对象
这里 d=d+1,d是一个新的引用,其实里面有se5里面的自动装箱和拆箱,其实真正的源码应该是d=new Integer(d+1);当然d+1也是拆箱,这里其实new了一个新对象,其实就是一个新的引用指向了真正的对象d+1的存储单元,在主程序的d引用其实没有改变,这不同于普通对象的传递,普通对象传入getRes(Entity e),e也是一个不同于主程序里面的另一个引用,但是用set修改属性时,始终指向的是原来的存储单元,所以主程序里面e指向的存储单元改变,值改变
可以参考 可变类与不可变类
如果你能够分析出来,才能说你的基础不错
如果你能够分析出来,才能说你的基础不错 java运行时的内存分配图,看过几次,现在就记住了对象堆栈的分配,还是要多看
其实这个问题应该这样理解public static void getRes(Integer d) { d = d+1;}
这里 d=d+1,d是一个新的引用,其实里面有se5里面的自动装箱和拆箱,其实真正的源码应该是d=new Integer(d+1);当然d+1也是拆箱,这里其实new了一个新对象,其实就是一个新的引用指向了真正的对象d+1的存储单元,在主程序的d引用其实没有改变,这不同于普通对象的传递,普通对象传入getRes(Entity e),e也是一个不同于主程序里面的另一个引用,但是用set修改属性时,始终指向的是原来的存储单元,所以主程序里面e指向的存储单元改变,值改变同意,应该就是这样吧.再底层的东西也没那能力研究......
String a="a";int b=1;//存储方式相同
String a=new String("a"); Integer b=new Integer(1);//存储方式相同
a+"aaa"; b+1;//在处理上应该是相同,都创建的新对象
“可变类和不可变类”没听过这种定义,是不是把final理解错了
fianl修饰类,只说明类不可被继承。final类的所有方法默认是final的,不可重写,因为类不能继承,就不肯能重写。如String。
fianl修饰变量,表示变量所指向的地址不可修改,即指向的对象不可变。对象里的属性是可变的。
“可变类和不可变类”没听过这种定义,是不是把final理解错了
fianl修饰类,只说明类不可被继承。final类的所有方法默认是final的,不可重写,因为类不能继承,就不肯能重写。如String。
fianl修饰变量,表示变量所指向的地址不可修改,即指向的对象不可变。对象里的属性是可变的。
恩 是的 我之前对类前面的final理解不到位,造成了理解的错误。不可变类,一旦创建,变不可再修改其值,所以String Integer等类new出的对象参加运算时,都会生成新的对象,不可修改之前传入的对象值。final 只强调该引用指向的内存地址不可改变,如试图改变final修饰的对象的内存地址,编译报错。