java关于参数传递的思考
2016-05-02 12:15
232 查看
首先思考一个问题
Please write the output result 。
1234
welcome
空
不确定
首先,Java方法调用中,只存在值传递调用。
实参str是引用变量,指向字符串常量“1234”,由于java方法调用是值传递,所以形参str得到的是实参str的一个拷贝。此时形参str和实参str均指向字符串"1234"。
然后,在changeStr方法中,形参str指向了一个新的字符串"welcom",而后方法结束,形参str被销毁。而实参str仍然指向字符串"1234"。
再看下面的例子:
public class TestDemo
{
public static void changeStr(Demo d)
{
System.out.println("我是形参"+d);
d=new Demo();
System.out.println("我是形参"+d);
}
public static void main(String[] args)
{
Demo d=new Demo();
System.out.println("我是实参"+d);
changeStr(d);
System.out.println("我是实参"+d);
}
}
打印结果为
我是实参com.chris.test2.Demo@139a55
我是形参com.chris.test2.Demo@139a55
我是形参com.chris.test2.Demo@1db9742
我是实参com.chris.test2.Demo@139a55
得到的结果与第一个例子一样
实参d是引用变量,指向对象Demo@139a55,由于java方法调用是值传递,所以形参d得到的是实参d的一个拷贝。此时形参d和实参d均指向对象Demo@139a55
然后,在changeStr方法中,形参d指向了一个新的对象Demo@1db9742,而后方法结束,形参d被销毁。而实参str仍然指向对象Demo@139a55
那么在什么情况下才能通过改变形参从而改变实参呢?
答案是:如果形参是普通类,则可以通过改变形参中的属性变量,来改变实参的属性变量,因为都指向相同的对象
如果形参是数组或者,集合,则可改变数组或集合中元素的内容,来改变实参,因为都指向相同的对象
但是如果让形参指向了另一个类,则此时形参和实参就指向了不同的对象,他们就没有关系了。
(1)通过改变形参中的属性变量,来改变实参的属性变量
public class TestDemo
{
public static int i=0;
public static void changeStr(TestDemo d)
{
System.out.println("我是形参"+d.i);
d.i=2;
System.out.println("我是形参"+d.i);
}
public static void main(String[] args)
{
TestDemo d=new TestDemo();
System.out.println("我是实参"+d.i);
changeStr(d);
System.out.println("我是实参"+d.i);
}
}
打印结果为
我是实参0
我是形参0
我是形参2
我是实参2
这样就能通过改变形参中的属性变量,来改变实参的属性变量了。
(2)通过改变数组或集合中元素的内容,来改变实参
public class TestDemo
{
public static void changeStr(List<String> list)
{
System.out.println("我是形参"+list.size());
list.add(0, "hellokit");
System.out.println("我是形参"+list.size());
}
public static void main(String[] args)
{
List<String> list = new ArrayList();
System.out.println("我是实参"+list.size());
changeStr(list);
System.out.println("我是实参"+list.size());
}
}
打印结果:
我是实参0
我是形参0
我是形参1
我是实参1
这样就能通过改变数组或集合中元素的内容,来改变实参了。
总结:
如果让形参指向了另一个类,则此时形参和实参就指向了不同的对象,他们就没有关系了。
如果形参是普通类,则可以通过改变形参中的属性变量,来改变实参的属性变量,因为都指向相同的对象
如果形参是数组或者,集合,则可改变数组或集合中元素的内容,来改变实参,因为都指向相同的对象
1234
welcome
空
不确定
首先,Java方法调用中,只存在值传递调用。
实参str是引用变量,指向字符串常量“1234”,由于java方法调用是值传递,所以形参str得到的是实参str的一个拷贝。此时形参str和实参str均指向字符串"1234"。
然后,在changeStr方法中,形参str指向了一个新的字符串"welcom",而后方法结束,形参str被销毁。而实参str仍然指向字符串"1234"。
再看下面的例子:
public class TestDemo
{
public static void changeStr(Demo d)
{
System.out.println("我是形参"+d);
d=new Demo();
System.out.println("我是形参"+d);
}
public static void main(String[] args)
{
Demo d=new Demo();
System.out.println("我是实参"+d);
changeStr(d);
System.out.println("我是实参"+d);
}
}
打印结果为
我是实参com.chris.test2.Demo@139a55
我是形参com.chris.test2.Demo@139a55
我是形参com.chris.test2.Demo@1db9742
我是实参com.chris.test2.Demo@139a55
得到的结果与第一个例子一样
实参d是引用变量,指向对象Demo@139a55,由于java方法调用是值传递,所以形参d得到的是实参d的一个拷贝。此时形参d和实参d均指向对象Demo@139a55
然后,在changeStr方法中,形参d指向了一个新的对象Demo@1db9742,而后方法结束,形参d被销毁。而实参str仍然指向对象Demo@139a55
那么在什么情况下才能通过改变形参从而改变实参呢?
答案是:如果形参是普通类,则可以通过改变形参中的属性变量,来改变实参的属性变量,因为都指向相同的对象
如果形参是数组或者,集合,则可改变数组或集合中元素的内容,来改变实参,因为都指向相同的对象
但是如果让形参指向了另一个类,则此时形参和实参就指向了不同的对象,他们就没有关系了。
(1)通过改变形参中的属性变量,来改变实参的属性变量
public class TestDemo
{
public static int i=0;
public static void changeStr(TestDemo d)
{
System.out.println("我是形参"+d.i);
d.i=2;
System.out.println("我是形参"+d.i);
}
public static void main(String[] args)
{
TestDemo d=new TestDemo();
System.out.println("我是实参"+d.i);
changeStr(d);
System.out.println("我是实参"+d.i);
}
}
打印结果为
我是实参0
我是形参0
我是形参2
我是实参2
这样就能通过改变形参中的属性变量,来改变实参的属性变量了。
(2)通过改变数组或集合中元素的内容,来改变实参
public class TestDemo
{
public static void changeStr(List<String> list)
{
System.out.println("我是形参"+list.size());
list.add(0, "hellokit");
System.out.println("我是形参"+list.size());
}
public static void main(String[] args)
{
List<String> list = new ArrayList();
System.out.println("我是实参"+list.size());
changeStr(list);
System.out.println("我是实参"+list.size());
}
}
打印结果:
我是实参0
我是形参0
我是形参1
我是实参1
这样就能通过改变数组或集合中元素的内容,来改变实参了。
总结:
如果让形参指向了另一个类,则此时形参和实参就指向了不同的对象,他们就没有关系了。
如果形参是普通类,则可以通过改变形参中的属性变量,来改变实参的属性变量,因为都指向相同的对象
如果形参是数组或者,集合,则可改变数组或集合中元素的内容,来改变实参,因为都指向相同的对象
相关文章推荐
- java学习--冒泡排序
- Spark-Avro学习7之Java Avro使用(生成code方式)
- 码农小汪-Spring MVC 处理器拦截器详解
- Java错误提示:Syntax error, insert "}" to complete Block
- RxJava与Retrofit结合学习
- SpringData 学习(3)—— 通过“规范”的方法实现查询
- Ubuntu Android 开发(一) JDK 安装
- Java File类的使用
- MyEclipse配置SVN
- 【Java学习-J.160430.0.15】笔记8-使用JDBC连接数据库
- Java 正则表达式
- spring boot 静态资源处理
- Java 自定义注解
- java循环
- jAVA接口回调
- Spring之DI简述
- Java 编译时多态和运行时多态
- Loadrunner中java Vuser协议脚本开发
- Hibernate hbm2java meta标签学习
- java学习-数组2