运行结果你是什么。。

hunhunabc 2013-12-04 09:16:10
public class MyMain{
public static void main(String[] args) throws Exception {
String a = "s";
StringBuffer b = new StringBuffer("sb");
int[] c = {1};
Integer d = new Integer(5);
getRes(a);
getRes(b);
getRes(c);
getRes(d);
System.out.println(a+"--"+b.toString()+"--"+c[0]+"--"+d);
}

public static void getRes(String a) { a = a+"sssss";}
public static void getRes(StringBuffer b){ b.append("sb");}
public static void getRes(int[] c) { c[0] = c[0]+1;}
public static void getRes(Integer d) { d = d+1;}
}
...全文
769 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
haihai20134 2013-12-05
  • 打赏
  • 举报
回复
shenmedoumeiyouchuxian
fenglinjun1214 2013-12-05
  • 打赏
  • 举报
回复
引用 37 楼 magi1201 的回复:
[quote=引用 36 楼 fudongrifdr 的回复:] 元首,java的值传递,你说的我明白了。
public static void getRes(String a) { //这传的是一份地址的拷贝
		a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
	}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?[/quote] 其实这个问题应该这样理解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指向的存储单元改变,值改变
姜小白- 2013-12-05
  • 打赏
  • 举报
回复
引用 38 楼 fudongrifdr 的回复:
[quote=引用 37 楼 magi1201 的回复:] [quote=引用 36 楼 fudongrifdr 的回复:] 元首,java的值传递,你说的我明白了。
public static void getRes(String a) { //这传的是一份地址的拷贝
		a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
	}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?[/quote] a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。[/quote]元首,讲讲String和Integer不创建对象的原因,顺便元首还知道哪些包装类像这样传不创建对象
末日哥 2013-12-05
  • 打赏
  • 举报
回复
引用 37 楼 magi1201 的回复:
[quote=引用 36 楼 fudongrifdr 的回复:] 元首,java的值传递,你说的我明白了。
public static void getRes(String a) { //这传的是一份地址的拷贝
		a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
	}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?[/quote] a = a+"sssss"会创建新对象啊,StringBuffer的append方法不会产生新对象。。
姜小白- 2013-12-05
  • 打赏
  • 举报
回复
引用 36 楼 fudongrifdr 的回复:
元首,java的值传递,你说的我明白了。
public static void getRes(String a) { //这传的是一份地址的拷贝
		a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
	}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
还没明白,String 指向新对象了,Integer指向新对象了,StringBuffer没有,这个怎么判断,String和Integer对象不可变吗?
末日哥 2013-12-05
  • 打赏
  • 举报
回复
引用 35 楼 u011935764 的回复:
[quote=引用 28 楼 fudongrifdr 的回复:] JAVA中的参数传递全是以值传递的。是基本类型,就copy一个基本类型传进方法;是引用,就拷贝一个引用地址传进去方法,而并不是直接把地址交给他
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++引用传递
元首,java的值传递,你说的我明白了。
public static void getRes(String a) { //这传的是一份地址的拷贝
		a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
	}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧[/quote]
时光清浅 2013-12-05
  • 打赏
  • 举报
回复
引用 28 楼 fudongrifdr 的回复:
JAVA中的参数传递全是以值传递的。是基本类型,就copy一个基本类型传进方法;是引用,就拷贝一个引用地址传进去方法,而并不是直接把地址交给他
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++引用传递
元首,java的值传递,你说的我明白了。
public static void getRes(String a) { //这传的是一份地址的拷贝
		a = a + "sssss"; //这里a+"ssss"赋值给"a"后,此时的a是一个新对象
	}
但是StringBuffer 操作的是同一地址的"内容(sb)",是这样吧
灰祥的奇迹 2013-12-05
  • 打赏
  • 举报
回复
除了public static void getRes(StringBuffer b){ b.append("sb");} public static void getRes(int[] c) { c[0] = c[0]+1;} 这两个的值会发生改变,其他的没影响!
末日哥 2013-12-05
  • 打赏
  • 举报
回复
引用 32 楼 magi1201 的回复:
引用 31 楼 fudongrifdr 的回复:
至于他这个StringBuffer为什么会打印sbsb,是因为把sb的地值copy传过去了,但仍然指向的是同一个对象,并未指定新的对象,所有看上去向是传的地址,实际是引用的值的拷贝
那哪些对象仍然指向的是同一个对象,这个如何判断呢?
这得看你执行的操作有没有new新对象吧,反正记住引用记录了对象的地址,而给方法传引用类型参数,实际是把这个地址值的copy传过去了
姜小白- 2013-12-05
  • 打赏
  • 举报
回复
引用 31 楼 fudongrifdr 的回复:
至于他这个StringBuffer为什么会打印sbsb,是因为把sb的地值copy传过去了,但仍然指向的是同一个对象,并未指定新的对象,所有看上去向是传的地址,实际是引用的值的拷贝
那哪些对象仍然指向的是同一个对象,这个如何判断呢?
末日哥 2013-12-05
  • 打赏
  • 举报
回复
引用 26 楼 magi1201 的回复:
引用 25 楼 fudongrifdr 的回复:
这根final不final没有关系、、
那该如何解释呢,元首,看我哪里又给理解错啦
引用 27 楼 u011935764 的回复:
引用 25 楼 fudongrifdr 的回复:
这根final不final没有关系、、
String是final的,当你在方法中传递String时是引用传递,但是你不能改变这个String对象的值. 我一直是这么理解的 那应该咋回事?
至于他这个StringBuffer为什么会打印sbsb,是因为把sb的地值copy传过去了,但仍然指向的是同一个对象,并未指定新的对象,所有看上去向是传的地址,实际是引用的值的拷贝
KieLeo 2013-12-05
  • 打赏
  • 举报
回复
s--sbsb--2--5
sliwey 2013-12-05
  • 打赏
  • 举报
回复
java还有引用传递?不都是值传递吗?
末日哥 2013-12-05
  • 打赏
  • 举报
回复
引用 26 楼 magi1201 的回复:
那该如何解释呢,元首,看我哪里又给理解错啦
引用 27 楼 u011935764 的回复:
String是final的,当你在方法中传递String时是引用传递,但是你不能改变这个String对象的值. [/img]
JAVA中的参数传递全是以值传递的。是基本类型,就copy一个基本类型传进方法;是引用,就拷贝一个引用地址传进去方法,而并不是直接把地址交给他
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++引用传递
时光清浅 2013-12-05
  • 打赏
  • 举报
回复
引用 25 楼 fudongrifdr 的回复:
这根final不final没有关系、、
String是final的,当你在方法中传递String时是引用传递,但是你不能改变这个String对象的值. 我一直是这么理解的 那应该咋回事?
姜小白- 2013-12-05
  • 打赏
  • 举报
回复
引用 25 楼 fudongrifdr 的回复:
这根final不final没有关系、、
那该如何解释呢,元首,看我哪里又给理解错啦
末日哥 2013-12-05
  • 打赏
  • 举报
回复
引用 16 楼 u011935764 的回复:
引用 14 楼 magi1201 的回复:
[quote=引用 13 楼 u011935764 的回复:] [quote=引用 12 楼 fudongrifdr 的回复:] [quote=引用 10 楼 u011935764 的回复:] [quote=引用 9 楼 magi1201 的回复:] [quote=引用 8 楼 u011935764 的回复:] 这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。 我在DEBUG看一下[/quote]
    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
[/quote] 元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了, 但是
public static void getRes(Integer d) {//传过来的时候id=27
		d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
	}
[/quote]刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了[/quote] final 的啊,我擦。龙套了[/quote] 这根final不final没有关系、、
fenglinjun1214 2013-12-05
  • 打赏
  • 举报
回复
引用 16 楼 u011935764 的回复:
引用 14 楼 magi1201 的回复:
[quote=引用 13 楼 u011935764 的回复:] [quote=引用 12 楼 fudongrifdr 的回复:] [quote=引用 10 楼 u011935764 的回复:] [quote=引用 9 楼 magi1201 的回复:] [quote=引用 8 楼 u011935764 的回复:] 这个我也很纠结啊,以前都不知道,看看大神怎么说
如果自己解包为int,那就好解释了,直接值传递,6为方法内的,没有带出方法,main中的依然为5
为什么在这里会自动解包啊。这里传的是个Integer 对象吧。 我在DEBUG看一下[/quote]
    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
[/quote] 元首,我刚才DEBUG了,发现传值的时候,确实把地址传过去了, 但是
public static void getRes(Integer d) {//传过来的时候id=27
		d = d + 1; // 这时id=37,说明这是一个新对象,原对象的值未改变
	}
[/quote]刚洗澡想通了 public final class Integer extends Numberimplements Comparable<Integer> 这货跟String 一样是final的,全通了[/quote] final 的啊,我擦。龙套了[/quote] 不是因为final的原因,你可以自己写一个类,定义成final的,当传入的时候一样会改变,不存在不可变类对象传递就不会改变,这跟可变不可变没关系
姜小白- 2013-12-05
  • 打赏
  • 举报
回复
引用 48 楼 hunhunabc 的回复:
[quote=引用 47 楼 magi1201 的回复:] [b] 觉得还是从可变类和不可变类的角度来理解更好懂一点,因为是不可变类,所以参加运算时,就新 new 了对象。导致新的结果不能存在之前的内存地址,原来的值依然存在。
“可变类和不可变类”没听过这种定义,是不是把final理解错了 fianl修饰类,只说明类不可被继承。final类的所有方法默认是final的,不可重写,因为类不能继承,就不肯能重写。如String。 fianl修饰变量,表示变量所指向的地址不可修改,即指向的对象不可变。对象里的属性是可变的。 [/quote]恩 是的 我之前对类前面的final理解不到位,造成了理解的错误。不可变类,一旦创建,变不可再修改其值,所以String Integer等类new出的对象参加运算时,都会生成新的对象,不可修改之前传入的对象值。final 只强调该引用指向的内存地址不可改变,如试图改变final修饰的对象的内存地址,编译报错。
hunhunabc 2013-12-05
  • 打赏
  • 举报
回复
引用 47 楼 magi1201 的回复:
[b] 觉得还是从可变类和不可变类的角度来理解更好懂一点,因为是不可变类,所以参加运算时,就新 new 了对象。导致新的结果不能存在之前的内存地址,原来的值依然存在。
“可变类和不可变类”没听过这种定义,是不是把final理解错了 fianl修饰类,只说明类不可被继承。final类的所有方法默认是final的,不可重写,因为类不能继承,就不肯能重写。如String。 fianl修饰变量,表示变量所指向的地址不可修改,即指向的对象不可变。对象里的属性是可变的。
加载更多回复(28)

67,517

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧