频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
Java函数参数传递例子
2017-03-16 09:24:00      个评论    来源:abcd1101的专栏  
收藏   我要投稿
Java函数参数传递例子:Java中所操作的对象其实都是操作对象的引用,object本身保存在“堆”中,而对象的“引用“保存在寄存器或“栈”中。Java语言是按值传递参数,按引用传递对象的;(应该就是如果是原始类型就拷贝值,如果是对象就拷贝引用,而不是真正对象本身。

如果方法里面将其他引用赋值给他,其实改变的只是引用,不是对象本身。所以对象的值不变。如果方法里面改变他的值,那其实改变的就是对象本身。)实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值。另外,String类是final修饰的,不可变,它会在内存中在开辟一块新空间,所以最后的例子改不了string的值。

下面有两个例子:

1. 先定义一个类型Value

Java代码

publicstaticclassValue{

privateStringvalue="value";

publicStringgetValue(){returnvalue;}

publicvoidsetValue(Stringvalue){this.value=value;}

}

2. 写两个函数newValue和modifyValue:newValue会将入参指向一个新的对象,modifyValue会调用入参的setValue方法修改对象的value值。

Java代码

publicstaticvoidnewValue(Valuevalue){

value=newValue();

value.setValue("newvalue");

System.out.println("InnewValue,HashCode="+value.hashCode()+",value="+value.getValue());

}

publicstaticvoidmodifyValue(Valuevalue){

value.setValue("newvalue");

System.out.println("InmodifyValue,HashCode="+value.hashCode()+",value="+value.getValue());

}

3. 简单的测试代码

Java代码

publicstaticvoidmain(String[]args){

Valuevalue1=newValue();

System.out.println("Beforemodify,HashCode="+value1.hashCode()+",value="+value1.getValue());

//将value1指向新的Value对象

newValue(value1);

System.out.println("Aftermodify,HashCode="+value1.hashCode()+",value="+value1.getValue()+"\n");

Valuevalue2=newValue();

System.out.println("Beforemodify,HashCode="+value2.hashCode()+",value="+value2.getValue());

//使用object的set方法,修改对象的内部值

modifyValue(value2);

System.out.println("Aftermodify,HashCode="+value2.hashCode()+",value="+value2.getValue());

}

4. 执行结果日志:

Java代码

Beforemodify,HashCode=12677476,value=value

InnewValue,HashCode=33263331,value=newvalue

Aftermodify,HashCode=12677476,value=value

Beforemodify,HashCode=6413875,value=value

InmodifyValue,HashCode=6413875,value=newvalue

Aftermodify,HashCode=6413875,value=newvalue

示例2:

示例3:

public class Test3 {

public static void change(int []a){

a[0]=50;

}

public static void main(String[] args) {

int []a={10,20};

System.out.println(a[0]);

change(a);

System.out.println(a[0]);

}

}

显然输出结果为10 50。实际传递的是引用的地址值。

内存分析:

\

示例4:

class Emp {

public int age;

}

public class Test {

public static void change(Emp emp)

{

emp.age = 50;

emp = new Emp();//再创建一个对象

emp.age=100;

}

public static void main(String[] args) {

Emp emp = new Emp();

emp.age = 100;

System.out.println(emp.age);

change(emp);

System.out.println(emp.age);

System.out.println(emp.age);

}

}

输出为:100 50 50.

内存分析:

\

对于String类:

public class Test {

public static void change(String s){

s="zhangsan";

}

public static void main(String[] args) {

String s=new String("lisi");

System.out.println(s);

change(s);

System.out.println(s);

}

}

输出为:lisi lisi,由于String类是final修饰的,不可变,它会在内存中在开辟一块新空间。

点击复制链接 与好友分享!回本站首页
上一篇:蓝桥-基础练习29-高精度加法-java代码
下一篇:java原始类型
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站