本文由广州疯狂软件java培训分享:
关于java的方法的参数传递,根据参数类型不同,对于方法的实参的改变也是不同的。
程序的运行结果
/**
* main方法
*/
public static void main(String[] args) {
// int
int num = 1;
System.out.println("int:改变前的值:" + num);
changeValue(num);
System.out.println("int:改变后的值:" + num);
// Integer
Integer num2 = new Integer(1);
System.out.println("Integer:改变前的值:" + num2);
changeValue(num2);
System.out.println("Integer:改变后的值:" + num2);
// String
String str = "hello";
System.out.println("String:改变前的值:" + str);
changeValue(str);
System.out.println("String:改变后的值:" + str);
// StringBuilder
StringBuilder sb = new StringBuilder("hello");
System.out.println("StringBuilder:改变前的值:" + sb);
changeValue(sb);
System.out.println("StringBuilder:改变后的值:" + sb);
}
/**
* 改变传入的int类型参数的值.
*/
static void changeValue(int num) {
num++;
}
/**
* 改变传入的Integer类型参数的值.
*/
static void changeValue(Integer num2) {
num2++;
}
改变传入的String类型参数的值.
static void changeValue(String str) {
str.concat(" world!");
}
/**
* 改变传入的StringBuilder类型参数的值.
*/
static void changeValue(StringBuilder sb) {
sb.append(" world!");
}
上面程序的运行结果是:
int:改变前的值:1
int:改变后的值:1
Integer:改变前的值:1
Integer:改变后的值:1
String:改变前的值:hello
String:改变后的值:hello
StringBuilder:改变前的值:hello
StringBuilder:改变后的值:hello world!
运行结果的分析
从上面的结果可以看出,只有StringBuilder类型的实参的值被改变了,其他的都没有改变。
我的理解是这都和变量的作用域有关系,main方法中的变量和被调用的方法的变量的作用域是独立于它们所在的方法的。
当方法执行完了,变量随之被销毁。所以实参的值不应该有变化。
但是问题就出来了,为什么StringBuilder的值会改变?
这是因为当参数是对象的引用的时候,传递给方法的也是一个引用的拷贝,并不是这个引用所对应的值。
方法结束,引用被销毁,但是这个引用对应的值在堆(heap)中是没有被销毁的。堆(heap)的清理是靠垃圾回收器。
所以实参的值就被改变了。
可是第二个问题又出来了,String和Integer传递的不也是引用吗?
这是没有错的,但是,它们是特殊的,String对象是不可变的,也就是说,当你改变String对象所对应的引用的时候,因为对象值的不可变化,所以就会重新建立一个新的对象关联上这个引用。
所以啊,方法外和方法内是两个不同的对象,实参的值也就不会被改变了。
疯狂软件教育中心依托开发团队的强大技术实力,把企业最新技术融入实训课程,打造金牌的品质,才能给予学员黄金的未来,疯狂软件凭借过硬的技术实力与丰富的项目开发经验,赢得了社会的肯定。疯狂软件Java培训师资力量强大,课程内容深入,为学员高薪就业做了很好的铺垫,拥有丰富就业指导经验的就业团队也成为了学员高薪就业的先天优势。地址:广州天河区车陂沣宏大厦3楼。