java方法中的参数传值
来源:互联网 发布:上古世纪战魔捏脸数据 编辑:程序博客网 时间:2024/06/04 23:34
refer to :
http://xiaolu123456.iteye.com/blog/768520
今天看了一下别人到blog关于java方法中到参数传值到问题,突然仔细想了一下,原来自己一直也没弄懂。看下面到例子:
程序运行到结果是:
=====inner a=======9;
3;
这个是参数直接传递基本类型的例子。
还有一个例子是参数传递对象的:
程序运行到结果是:
abc
两个传参一个是基本类型,一个对象,总结网上很多说法,但是还是没有清楚到给出它们的
底层内存分配运行是的状况。但是有如下共识:
对于基本类型,在方法体内对方法参数进行重新赋值,并不会改变原有变量的值。
对于引用类型,在方法体内对方法参数进行重新赋予引用,并不会改变原有变量所持有的引用。
方法体内对参数进行运算,不影响原有变量的值。
方法体内对参数所指向对象的属性进行运算,将改变原有变量所指向对象的属性值。
再例子:
public class MyMap extends HashMap{
public static void main(String[] arg) {
MyTest obj = new MyTest();
System.out.println("obj hash code:"+obj.hashCode());
call (obj) ;
System.out.println("obj"+obj.getName());
}
static public MyTest call(MyTest t){
MyTest t2 = new MyTest();
t2.setName("cba");
t.setName("abc"); t 的值改变
System.out.println("t2 hash code:"+t2.hashCode());
System.out.println("t hash code:"+t.hashCode());
t = t2 ; //局部起作用
return t2;
}
}
class MyTest{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出:
obj hash code:8567361
t2 hash code:9584176 函数内的局部对象
t hash code:8567361 函数内接收到的形参对象,和外面(第一行)一样
obj abc
对jvm的具体分配目前还不懂,但是目前我们可以这样理解,对传递基本类型的时候,我们把形参当成一个局部变量,传递基本类型的时候,就是传递值的拷贝,对形参进行赋值,只影响到局部变量,离开作用域,该局部变量失效。对传递引用类型的时候,一样形参是个局部变量,传递引用类型,传递是引用的一个拷贝。对形参进行赋值,也同样改变了该局部变量的引用地址。离开作用域,局部变量失效,原来的变量没有任何变化,对下面的这中情况,可能有疑问。例如:
运行的结果是,9999,对此解释是,数组是对象,我们在方法中改变的是引用所指向的对象的值,所以局部变量即使失效后,它堆上的内容发生改变了,所以到后来就变了,所以我们对对象传递参数时,必须很清楚的知道自己改变了的是对象的引用改变了,还是在堆上的引用所指向的对象的值改变了,这个很重要,因为这样才能达到我们的目的了!
- public class cl{
- private int a=3,b=4;
- public void swap(int a,int b){
- int c=9;
- a=c;
- System.out.println("=====inner a======="+a);
- }
- public static void main(String args[]){
- cl c=new cl();
- c.swap(c.a,c.b); //形参,与实参。
- System.out.println(c.a);
- }
- }
程序运行到结果是:
=====inner a=======9;
3;
这个是参数直接传递基本类型的例子。
还有一个例子是参数传递对象的:
- public void call(Test t) {
- Test t2 = new Test();
- t2.setName("cba');
- t.setName("abc");
- t = t2 ;
- }
- public static void main(String[] arg) {
- Test obj = new Test();
- call (obj) ;
- System.out.println("obj"+obj.getName());
- }
abc
两个传参一个是基本类型,一个对象,总结网上很多说法,但是还是没有清楚到给出它们的
底层内存分配运行是的状况。但是有如下共识:
对于基本类型,在方法体内对方法参数进行重新赋值,并不会改变原有变量的值。
对于引用类型,在方法体内对方法参数进行重新赋予引用,并不会改变原有变量所持有的引用。
方法体内对参数进行运算,不影响原有变量的值。
方法体内对参数所指向对象的属性进行运算,将改变原有变量所指向对象的属性值。
再例子:
public class MyMap extends HashMap{
public static void main(String[] arg) {
MyTest obj = new MyTest();
System.out.println("obj hash code:"+obj.hashCode());
call (obj) ;
System.out.println("obj"+obj.getName());
}
static public MyTest call(MyTest t){
MyTest t2 = new MyTest();
t2.setName("cba");
t.setName("abc"); t 的值改变
System.out.println("t2 hash code:"+t2.hashCode());
System.out.println("t hash code:"+t.hashCode());
t = t2 ; //局部起作用
return t2;
}
}
class MyTest{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出:
obj hash code:8567361
t2 hash code:9584176 函数内的局部对象
t hash code:8567361 函数内接收到的形参对象,和外面(第一行)一样
obj abc
对jvm的具体分配目前还不懂,但是目前我们可以这样理解,对传递基本类型的时候,我们把形参当成一个局部变量,传递基本类型的时候,就是传递值的拷贝,对形参进行赋值,只影响到局部变量,离开作用域,该局部变量失效。对传递引用类型的时候,一样形参是个局部变量,传递引用类型,传递是引用的一个拷贝。对形参进行赋值,也同样改变了该局部变量的引用地址。离开作用域,局部变量失效,原来的变量没有任何变化,对下面的这中情况,可能有疑问。例如:
- public static void swap(int a[])
- {
- a[0]=9999;
- }
- public static void main(String args[])
- {
- int c[]={3};
- swap(c);
- System.out.println(c[0]);
- }
运行的结果是,9999,对此解释是,数组是对象,我们在方法中改变的是引用所指向的对象的值,所以局部变量即使失效后,它堆上的内容发生改变了,所以到后来就变了,所以我们对对象传递参数时,必须很清楚的知道自己改变了的是对象的引用改变了,还是在堆上的引用所指向的对象的值改变了,这个很重要,因为这样才能达到我们的目的了!
- java方法中的参数传值
- Java方法中的可变参数
- [Java] Java中的可变参数方法
- java中的方法参数传递机制---值传递
- JAVA 参数传方法
- JAVA方法中的参数 final 的误区
- Java如何获取方法参数中的名称
- Java方法中的参数传递方式
- Java方法中的参数String... args
- java中的方法参数的传递机制
- JAVA参数在方法中的传递过程
- Java参数在方法中的传递
- Java参数在方法中的传递
- Java中方法参数传值问题
- Java方法.参数传递.传(值/地址)
- Java技术——Java中的参数传值方式
- Java 方法参数 值传递
- intent.setFlags方法中的参数值含义
- linux下的各个目录的含义
- Coding的极致
- Hadoop InputFormat浅析
- SQL Server 2008无监听服务器的镜像安装(工作组)
- 中国历朝历代规则表
- java方法中的参数传值
- extern "C"的用法解析
- 未来5年
- 闲来无事
- android为什么不需要太多的剩余内存
- grep用法详解:grep与正则表达式
- 希腊新民这党派大选获胜,非美跳空高开
- CKFinder2.1破解的方法(删除This is the demo version of CKFinder)
- linux下一个网卡配置多个ip