注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

昆明帆妈的博客

生活的点点滴滴,被我这样记录着。。。。

 
 
 

日志

 
 

【转载】Java 引用类型的学习  

2013-05-10 14:46:04|  分类: 工作 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自蒋委员长《Java 引用类型的学习》

首先看一个例子:赋值的应用
public class TestOne{
int i;
public static void main(String args[]){
   TestOne n1 = new TestOne();
   TestOne n2 = new TestOne();
   n1.i = 9;
   n2.i = 47;
   System.out.println( "赋值前 n1.i的值:" +n1.i+ "  n2.i的值:" +n2.i );
   n1=n2; //如果这样赋值,那么n1和n2指向同一个对象
   System.out.println( "赋值后 n1.i的值:" +n1.i+ "  n2.i的值:" +n2.i );
   n2.i = 27; //如果这里改成n1.i最后的结果一样。因为n1和n2都指向相同的对象
   System.out.println( "n2.i赋值27再打印  n1.i的值:" +n1.i+ "  n2.i的值:" +n2.i );
  }
}

运行以后结果是:

赋值前 n1.i的值:9  n2.i的值:47
赋值后 n1.i的值:47  n2.i的值:47
n2.i赋值27再打印  n1.i的值:27  n2.i的值:27

总结:

原因就是:n1=n2 这句话不是简单的赋值,而是引用类型。
在内存中n1和n2分别指向不同的地方,如果使用=等号赋值,
他们就指向一个相同的地方,所以再次赋值时将改变他们2个输出结果。
n1原来指向的对象将不在被任何指针引用,所以也不可能改变它的值。


例子二:参数传值的应用

class Letter{
  char c;
}
public class TestTwo{
  static void f(Letter y){ //Letter y 实际是一个对象,如果函数不用static 则下面f(le);将无法传值引用
    y.c='z'; //将‘z’赋值给对象y中元素c
  }
  public static void main(String args[]){
        Letter le = new Letter();
        le.c = 'a';
        System.out.println( "第一次 Letter :" +le.c );


        /*f(le);将le传到f()中,实际相当于y=le;
         此时le和y都指向一个对象,对象中的char c值为'a'。
         y.c='z';会改变le.c的值。此时不同于C++中的拷贝构造,
         C++中实际有2个不同对象,Jave中2个对象都指向同一个对象*/


        f(le); //f这个函数中参数是一个对象
        System.out.println( "第二次 Letter :" +le.c );
      }
}

输出的结果是:

第一次 Letter :a
第二次 Letter :z

 

f(le);参数传入的是一个值,而不是地址。所以直接可以进行操作。

  评论这张
 
阅读(4)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017