对于值传递和引用传递的理解

javaC#的传递机制是一样的,都是拷贝,不是传递,是拷贝,只不过对于基本类型,拷由的是RAM中的内容,而对于引用类型,拷贝的是对象的引用值,这类似于C语言的指针。

对于基本类型,变量名存取的是内存的值。

对于引用类型,变量名存取的是指针名,指针指向的是内存的值

基本类型

int num=5;

定义一个类:

Class MyClass {

Int num=5;//定义了一个属性

}

myClass是这个类的一个对象

 

变量名

指针

内存值

num

5

myClass

1451

5等关于类的内容

看以下试验:

程序1:

package mypackage;

import java.util.*;

public class Test {

    int age;//定义Tets的一个属性age

    /**

     * 用于两个对象交换(此处换的是对象的引用)

     * @param test1:对象1

     * @param test2:对象2

     */

    public static void swap(Test t1,Test t2){

       int temp;

       temp=t1.age;

       t1.age=tt2.age;

       t2.age=temp; 

    }

    public static void main(String[] args) {

       Test test1=new Test();

       test1.age=1;

       Test test2=new Test();

       test2.age=2;

       Test.swap(test1, test2);//交换

       System.out.println("tes1.age="+test1.age);//输出Test1的年龄

       System.out.println("tes2.age="+test2.age);//输出Test1的年龄

    }

}

 

 

以下是输出结果:

tes1.age=2

tes2.age=1

程序2

package mypackage;

import java.util.*;

public class Test {

    static Scanner input=new Scanner(System.in);

    int age;//定义Tets的一个属性age

    /**

     * 用于两个对象交换(引处换的是对象的属性)

     * @param test1:对象1

     * @param test2:对象2

     */

    public static void swap(Test t1,Test t2){

       Test temp;

       temp=t1;

       t1=t2;

       t2=temp;

       System.out.println("swap方法内:t1.age="+t1.age);

    }

    public static void main(String[] args) {

       Test test1=new Test();

       test1.age=1;

       Test test2=new Test();

       test2.age=2;

       Test.swap(test1, test2);

       System.out.println("swap方法外:test1.age="+test1.age);

    }

}

以下是结果:

swap方法内:t1.age=2

swap方法外:test1.age=1

程序1的过程是:

假设test1的指针是1151,test2的指针是1251

Test.swap(test1, test2),把test1的指针(该指针指的是内存区域)拷贝一份,传递给swap方法, 于是t1就存储了test1的指针1151,t2就存储了test2的指针1251 test1.age就是获取或设置1151内的内存值,test2.age就是获取或设置1251内的内存值,

双方置换了内存中的age(注意是内存中的值变化了),然后从此函数中出来,再输出test1.age是,test1的指针还是1151(为什么?因为它开始是把指针拷贝过去的,是拷贝!),它还是指向那片内在区域,但是内存的值我们给换了(这是关键),所以输出

tes1.age=2

tes2.age=1

程序2的过程:

假设test1的指针是1151,test2的指针是1251

Test.swap(test1, test2)后,把test1的指针1151拷贝一份传给swap函数,于是t1就存储了指针1451,同理,t2存储了指针1251,然后在swap方法里两者的指针发生了置换,于是t1存储了指针1251t2存储了指针1151,输出t1.age时,由于t1存储的是1251,所以输出t1.age=2;

方法完成后,又回到了主方法。最后输出test1.agetest1对应的指针是哪个?(1251!,还是那句话,拷贝)1251存储的age的值是1,所以输出

test1.age=1;

test2.age=2

经验:只要方法不动内存里的值出来此方法后就不会对拷贝指针给它的对象产生影响,改变了内存的值就会指南针给它的对象产生影响。现实中的判断就是方法内的对象只要不使用.运算符使用能对象的属性或方法就不产生影响,反之,就是产生影响.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值