JAVA2核心技术阅读笔记(一)

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

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

public   class  Person  {
    String name;
    
int age;
    
    
public Person(String name,int age){
        
this.name = name;
        
this.age = age;
    }

    
    
public int getAge() {
        
return age;
    }

    
public void setAge(int age) {
        
this.age = age;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }


}


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

public   class  PersonUtil  {

    
public static void personSwap(Person a, Person b) {
        
/*
         * 传入的对象引用,这里指向的对象和在传入前的是一样的 
         * 打印结果
         * ------------------swapbegin------------------ 
         * Person a:Person@11b86e7 name:aaa age:1 
         * Person b:Person@35ce36 name:bbb age:2
         
*/

        System.out.println(
"------------------swap begin------------------");
        System.out.println(
"Person a:" + a + " name:" + a.getName() + " age:"
                
+ a.getAge());
        System.out.println(
"Person b:" + b + " name:" + b.getName() + " age:"
                
+ b.getAge());
        System.out.println();

        
/*
         * 开始交换对象 
         * 打印结果
         * ------------------swap reference------------------
         *  Person a:Person@35ce36 name:bbb age:2 
         *  Person b:Person@11b86e7 name:aaa age:1
         
*/

        System.out
                .println(
"------------------swap reference------------------");
        Person tmp1 
= a;
        a 
= b;
        b 
= tmp1;
        System.out.println(
"Person a:" + a + " name:" + a.getName() + " age:"
                
+ a.getAge());
        System.out.println(
"Person b:" + b + " name:" + b.getName() + " age:"
                
+ b.getAge());
        System.out.println();
        
        
/*
         * 交换对象中name字段的值 
         * 打印结果 
         * ------------------swap field value------------------ 
         * Person a:Person@35ce36 name:aaa age:2 
         * Person b:Person@11b86e7 name:bbb age:1
         
*/

        System.out
                .println(
"------------------swap field value------------------");
        String tmp2 
= a.getName();
        a.setName(b.getName());
        b.setName(tmp2);
        System.out.println(
"Person a:" + a + " name:" + a.getName() + " age:"
                
+ a.getAge());
        System.out.println(
"Person b:" + b + " name:" + b.getName() + " age:"
                
+ b.getAge());
        System.out.println();
        
        
/*
         * 交换完成后 
         * 打印结果 
         * ------------------swap end------------------
         * Persona:Person@35ce36 name:aaa age:2 
         * Person b:Person@11b86e7 name:bbb age:1
         
*/

        System.out.println(
"------------------swap end------------------");
        System.out.println(
"Person a:" + a + " name:" + a.getName() + " age:"
                
+ a.getAge());
        System.out.println(
"Person b:" + b + " name:" + b.getName() + " age:"
                
+ b.getAge());
        System.out.println();
    }


    
public static void main(String[] args) {
        Person a 
= new Person("aaa"1);
        Person b 
= new Person("bbb"2);

        
/*
         * 生成两个对象,对象引用为a、b 
         * 在交换前的初始数据 
         * 打印结果
         * ------------------before swap------------------ 
         * Person a:Person@11b86e7 name:aaa age:1 
         * Person b:Person@35ce36 name:bbb age:2
         
*/

        System.out.println(
"------------------before swap------------------");
        System.out.println(
"Person a:" + a + " name:" + a.getName() + " age:"
                
+ a.getAge());
        System.out.println(
"Person b:" + b + " name:" + b.getName() + " age:"
                
+ b.getAge());
        System.out.println();

        PersonUtil.personSwap(a, b); 
// 调用方法,进入方法体

        
/*
         * 方法调用结束,返回main() 打印结果 
         * ------------------after swap------------------
         * Person a:Person@11b86e7 name:bbb age:1 
         * Person b:Person@35ce36 name:aaa age:2
         
*/

        System.out.println(
"------------------after swap------------------");
        System.out.println(
"Person a:" + a + " name:" + a.getName() + " age:"
                
+ a.getAge());
        System.out.println(
"Person b:" + b + " name:" + b.getName() + " age:"
                
+ b.getAge());
    }


}


其结果很明显,java的对象引用传递并不是直接把引用传递进去的,否则,在离开personSwap方法后,a和b所指向的对象应该对调了才是。应该说,core java2所说的传递 引用拷贝是正确的,换言之,JAVA是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值