前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中的引用传递

Java中的引用传递

作者头像
wust小吴
发布2019-07-08 16:42:26
2.7K0
发布2019-07-08 16:42:26
举报
文章被收录于专栏:风吹杨柳风吹杨柳

我觉得引用传递  真的很好理解,不知道为什么大家觉得这么难,你只要掌握这几点就可以了

在Java机制中他自己提供的那些数据类型(String ,Object等)要这样理解:

1)在Java中  引用  说的就是  地址指针,或者叫地址变量,

2)引用传递  一般发生在函数调用的时候,最明显的特征就是  函数参数

3)如果引用传递  实用过程中  ,函数没有返回值,这个叫真正的引用传递,没有改变对象的真实值,一切只发生在函数内部,离开函数就无效,一切只对函数内部有影响;说白了:这个时候参数其实是变量地址的一个拷贝,一个副本,只是给你用,你是不能改变我真正的面目,但是我的副本你想怎么玩就怎么玩。也不用还给我!但是,请你记住一点,如果你改变了我的副本的值,对不起,你可能在你函数内部使用的过程中再也无法正确的调用我指向的内容值了,请认真对待这个问题。

4)如果引用传递 实用过程中,函数有返回值,且返回值的类型和参数是一致的,那么在外部 通过调用函数进行重新赋值,就会改变 对象的真实值,我一般把它叫做假的引用传递,

看懂了上面的4点,关于引用传递就没有问题了

看代码:

代码语言:javascript
复制
	public static void main(String[] args) {
        Object o = new Object();
        System.out.println(o);
        o = change2(o);
        System.out.println(o);
    }
	
    public static void change(Object o){
        o = null;
        System.out.println(o);
    }
    
    public static Object change2(Object o){
    	o = null;
    	System.out.println(o);
    	return o;
    }

这个main函数执行的结果是这样的:

java.lang.Object@2a139a55 null null

再看一代代码,把main函数里面的执行函数换下:

代码语言:javascript
复制
	public static void main(String[] args) {
        Object o = new Object();
        System.out.println(o);
        //o = change2(o);
        change(o);
        System.out.println(o);
    }
	
    public static void change(Object o){
        o = null;
        System.out.println(o);
    }
    
    public static Object change2(Object o){
    	o = null;
    	System.out.println(o);
    	return o;
    }

运行结果是这样的:

java.lang.Object@2a139a55 null java.lang.Object@2a139a55

在Java机制中自己定义的数据类型,也就是通常意义上的  类    要这样理解:

他传递进去的也是引用传递,在函数里面如果调用了set方法或者.方法进行重新赋值,那么自定义的实例化对象的内容值一定发生了变化。

Java是按引用传递的,在函数里面可以修改对象的值

代码语言:javascript
复制
    String a = "123";    
    
    public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public static void change(ClassReferenceTransferTest test) { 
    	test.setA("abc");
        //test.a="abc"; 
        
    }
    public static void main(String[] args) { 
    	ClassReferenceTransferTest test1=new ClassReferenceTransferTest(); 
        System.out.println(test1.a); 
        System.out.println(test1.getA());
        change(test1);
        System.out.println(test1.a); 
        System.out.println(test1.getA());
    } 

其实关于  为什么传递  自己定义的类的时候,是可以改变值,而传递的是String对象或者Object 对象,就不能了, 把上面的代码改成这样的,你就明白了:

代码语言:javascript
复制
    String a = "123";    
    
    public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public static void change(ClassReferenceTransferTest test) { 
    	//test.setA("abc");
        //test.a="abc"; 
		test = null;
        
    }
    public static void main(String[] args) { 
    	ClassReferenceTransferTest test1=new ClassReferenceTransferTest(); 
        System.out.println(test1.a); 
        System.out.println(test1.getA());
        change(test1);
        System.out.println(test1.a); 
        System.out.println(test1.getA());
    } 

输出结果全是123;

相信看完你就知道了,如果你去改变对象(这个对象指的是class)的值,那么一定可以改变,

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年12月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档