JAVA中函数调用参数传递的理解(值传递和引用传递的理解)
2016-06-26 16:47
621 查看
个人理解:JAVA语言总是按照值传递调用的,基本上所有的函数调用参数传递都是值传递。其实参数为对象的传递也是值传递,只是对象本身也是对堆区真实对象的引用,所以对象参数传递的结果是对象的引用的值拷贝(可以参照C++的指针去理解)。
(以上是我截至到目前我对JAVA值传递和引用传递的理解)。
下面做一系列测试验证我的理解:首先我定义一个要测试的类,考虑到深度拷贝,加上了clone的接口:
public class CloneClass implements Cloneable{ private int a; private int b; public CloneClass(){ this.a=10; this.b=5; } public int getA() { return a; } public void setA(int a) { this.a = a; } public int getB() { return b; } public void setB(int b) { this.b = b; } @Override protected Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } }
1.基本数据类型作为参数的传递
测试代码:public static void main(String[] args) { // TODO Auto-generated method stub /** * 1.测试值传递,JAVA中方法调用值,除了基本的数据类型int,char,boolean,long等为值传递调用,其余的对象传递其实也是值传递,只是对象的值是一个引用 */ CloneClass c1=new CloneClass(); System.out.println("c1:b的值为:"+c1.getB()); TestClone.testZhiChuan(c1.getB()); System.out.println("c1: b的值为:"+c1.getB()); } //测试基本类型的值传递 public static void testZhiChuan(int b){ b=100; }结果:
上面代码可以看出c1中的b的值并没有改变,所以基本数据类型是值传递
2.对象作为参数的传递
测试代码:public static void main(String[] args){ /** * 2.对象的传递 */ CloneClass c2=new CloneClass(); System.out.println("c2:a的值为:"+c2.getA()); TestClone.testYinyong(c2); System.out.println("c2: a的值为:"+c2.getA()); } //测试对象的值传递:拷贝的值为一个引用 public static void testYinyong(CloneClass cloneClass){ cloneClass.setA(20); }结果:
在这里我们看到的结果的的确确变成了类似于引用传递的效果,好多JAVA开发成员也把这种传递叫引用传递,实际上这种也是一种值传递。
3.对象克隆(深拷贝)
如何解决对象传参修改属性值的问题?使用对象克隆!!
/** * @param args */ public static void main(String[] args) throws CloneNotSupportedException{ // TODO Auto-generated method stub /** * 3.对象克隆解决修改对象值问题 */ CloneClass c3=new CloneClass(); System.out.println(c3); System.out.println("c3:a的值为:"+c3.getA()); TestClone.testClone(c3); System.out.println("c3: a的值为:"+c3.getA()); } //测试对象的深度拷贝,克隆的使用 public static void testClone(CloneClass cloneClass) throws CloneNotSupportedException{ System.out.println(cloneClass); CloneClass testClone=(CloneClass)cloneClass.clone(); System.out.println(testClone); testClone.setA(20); System.out.println("testClone a:"+testClone.getA()); }
结果:
写法建CloneClass类
相关文章推荐
- Java开发常用的在线工具
- 【DAY26】JAVA 基础回顾
- Java设计模式——观察者模式
- java基础(六)关键字/private/this/static/构造方法/
- 基于Lucene的Java搜索服务器Elasticsearch安装使用教程
- Java RMI 简介及其优劣势总结
- leetcode-java-136. Single Number
- java中线程池
- 关于java类加载器理解及畅谈
- 学习 Promise (结合 Rxjava)
- java中使用 正则 抓取邮箱
- JAVA邮件发送的简单实现
- 【Spring专题-④】拦截器浅析
- Java习惯用法
- java实现 逆时针打印二维数组
- java注释
- java web开发第一篇记录
- java关键字、标识符
- Activiti(四)流程变量
- [疯狂Java]面向对象:单例模式