Core Java2 7th 阅读笔记(一)

第四章里面讨论到JAVA的方法参数到底是值传递还是引用传递, 作者认为JAVA使用的是值传递,而在Thinking in JAVA中关于传递貌似说的是引用传递(我有点记不清了,刚才也没翻到),在网上搜了一下,更是说法纷纭,让人越看越迷糊。没办法,只好自己想办法写例子来实验一下。

先构建一个Person类,有name和age两个字段

java 代码
  1. public class Person ...{   
  2.     String name;   
  3.     int age;   
  4.        
  5.     public Person(String name,int age)...{   
  6.         this.name = name;   
  7.         this.age = age;   
  8.     }   
  9.        
  10.     public int getAge() ...{   
  11.         return age;   
  12.     }   
  13.     public void setAge(int age) ...{   
  14.         this.age = age;   
  15.     }   
  16.     public String getName() ...{   
  17.         return name;   
  18.     }   
  19.     public void setName(String name) ...{   
  20.         this.name = name;   
  21.     }   
  22.   
  23. }   

然后再设计一个personSwap方法,传入两个Person对象引用,先对这两个对象引用进行对象交换操作,然后再对两个对象中的name字段值进行交换操作。最后,在main中调用方法。最后生成的结果我都写在了注释中

java 代码
  1. public class PersonUtil ...{   
  2.   
  3.     public static void personSwap(Person a, Person b) ...{   
  4.         /** 
  5.          * 传入的对象引用,这里指向的对象和在传入前的是一样的   
  6.          * 打印结果  
  7.          * ------------------swapbegin------------------   
  8.          * Person a:Person@11b86e7 name:aaa age:1   
  9.          * Person b:Person@35ce36 name:bbb age:2  
  10.          */  
  11.         System.out.println("------------------swap begin------------------");   
  12.         System.out.println("Person a:" + a + " name:" + a.getName() + " age:"  
  13.                 + a.getAge());   
  14.         System.out.println("Person b:" + b + " name:" + b.getName() + " age:"  
  15.                 + b.getAge());   
  16.         System.out.println();   
  17.   
  18.         /**  
  19.          * 开始交换对象   
  20.          * 打印结果  
  21.          * ------------------swap reference------------------  
  22.          *  Person a:Person@35ce36 name:bbb age:2   
  23.          *  Person b:Person@11b86e7 name:aaa age:1  
  24.          */  
  25.         System.out   
  26.                 .println("------------------swap reference------------------");   
  27.         Person tmp1 = a;   
  28.         a = b;   
  29.         b = tmp1;   
  30.         System.out.println("Person a:" + a + " name:" + a.getName() + " age:"  
  31.                 + a.getAge());   
  32.         System.out.println("Person b:" + b + " name:" + b.getName() + " age:"  
  33.                 + b.getAge());   
  34.         System.out.println();   
  35.            
  36.         /**  
  37.          * 交换对象中name字段的值   
  38.          * 打印结果   
  39.          * ------------------swap field value------------------   
  40.          * Person a:Person@35ce36 name:aaa age:2   
  41.          * Person b:Person@11b86e7 name:bbb age:1  
  42.          */  
  43.         System.out   
  44.                 .println("------------------swap field value------------------");   
  45.         String tmp2 = a.getName();   
  46.         a.setName(b.getName());   
  47.         b.setName(tmp2);   
  48.         System.out.println("Person a:" + a + " name:" + a.getName() + " age:"  
  49.                 + a.getAge());   
  50.         System.out.println("Person b:" + b + " name:" + b.getName() + " age:"  
  51.                 + b.getAge());   
  52.         System.out.println();   
  53.            
  54.         /**  
  55.          * 交换完成后   
  56.          * 打印结果   
  57.          * ------------------swap end------------------  
  58.          * Persona:Person@35ce36 name:aaa age:2   
  59.          * Person b:Person@11b86e7 name:bbb age:1  
  60.          */  
  61.         System.out.println("------------------swap end------------------");   
  62.         System.out.println("Person a:" + a + " name:" + a.getName() + " age:"  
  63.                 + a.getAge());   
  64.         System.out.println("Person b:" + b + " name:" + b.getName() + " age:"  
  65.                 + b.getAge());   
  66.         System.out.println();   
  67.     }   
  68.   
  69.     public static void main(String[] args) ...{   
  70.         Person a = new Person("aaa"1);   
  71.         Person b = new Person("bbb"2);   
  72.   
  73.         /**  
  74.          * 生成两个对象,对象引用为a、b   
  75.          * 在交换前的初始数据   
  76.          * 打印结果  
  77.          * ------------------before swap------------------   
  78.          * Person a:Person@11b86e7 name:aaa age:1   
  79.          * Person b:Person@35ce36 name:bbb age:2  
  80.          */  
  81.         System.out.println("------------------before swap------------------");   
  82.         System.out.println("Person a:" + a + " name:" + a.getName() + " age:"  
  83.                 + a.getAge());   
  84.         System.out.println("Person b:" + b + " name:" + b.getName() + " age:"  
  85.                 + b.getAge());   
  86.         System.out.println();   
  87.   
  88.         PersonUtil.personSwap(a, b); // 调用方法,进入方法体   
  89.   
  90.         /**  
  91.          * 方法调用结束,返回main() 打印结果   
  92.          * ------------------after swap------------------  
  93.          * Person a:Person@11b86e7 name:bbb age:1   
  94.          * Person b:Person@35ce36 name:aaa age:2  
  95.          */  
  96.         System.out.println("------------------after swap------------------");   
  97.         System.out.println("Person a:" + a + " name:" + a.getName() + " age:"  
  98.                 + a.getAge());   
  99.         System.out.println("Person b:" + b + " name:" + b.getName() + " age:"  
  100.                 + b.getAge());   
  101.     }   
  102.   
  103. }   

其结果很明显,java的对象引用传递并不是直接把引用传递进去的,否则,在离开personSwap方法后,a和b所指向的对象应该对调了才是。应该说,core java2所说的传递引用拷贝是正确的,换言之,JAVA是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值