关于java中方法参数是值传递还是引用传递的一些看法

方法中参数的传递问题是每一门语言的基础,java中的参数传递问题虽然很基础但是这又是很容易搞错的问题,网上对于此也是议论纷纷,最近阅读了csdn上很多关于java中方法参数是值传递还是引用传递的文章,我觉得讲得一般都不错,但是过于复杂,基于此,我发表一些我自己的看法。
对于方法参数为基本数据类型这个比较简单,没什么可说的,就是值传递,也就是说在方法内部随便操作参数的值,不会引起实际传递的值的改变。附上代码:


```java
public class example_2 {
    public static void swap(int a, int b){
        int tmp=a;
        a=b;
        b=tmp;
    }

    public static void main(String[] args) {
        int a=3,b=2;
        swap(a,b);
        System.out.println(a+"   "+b);
    }
}

``
在本例中写了一个交换两个数的函数,调用这个方法后发现a,b的值并没有改变,这说明对于基本数据类型作为方法参数是只是复制了一下他们的值拷贝进去,所以方法内部的a和b和实际传进去的参数并没有关系

对于引用数据类型,有人说是值传递,有人说是引用传递,但是这两种说法都不能准确表达意思(至少对于初学者来说),我认为当方法参数为引用数据类型时是拷贝了一下实际参数所指向的地址,换句话说就是实际传进去的参数和在方法内部使用的参数的属性的地址是一样的,但是本身是不一样的,它只是实际参数的一个拷贝,所以这就造成了在方法内部修改参数的属性也就是修改了实际参数的属性。在此附上代码:

class Dog{
    int id;
    int age;
    String  name;

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public String  getName() {
        return name;
    }

    Dog(int id,int age,String  name){
        this.id=id;
        this.age=age;
        this.name=name;
    }

    public void Copy(Dog dog){
        dog=this;
    }

    public void Copy2(Dog dog){
        dog.id=id;
        dog.age=age;
        dog.name=name;
    }

    public String toString(){
        return this.id+"  "+this.age+"  "+this.name;
    }

    public void foo(String s){
        s=s+"123";
    }
}
public class example {
    public static void main(String[] args) {
        Dog dog1=new Dog(1,2,"ton");
        Dog dog2=new Dog(1,2,"TOm");
        dog1.Copy(dog2);
        System.out.println(dog2.toString());
        dog1.Copy2(dog2);
        System.out.println(dog2.toString());
        dog2=dog1;
        System.out.println(dog2.toString());
        String s="456";
        dog1.foo(s);
        System.out.println(s);
    }
}

程序输出为:在这里插入图片描述

由此可以看出当dog1调用Copy方法如果方法内部的dog就是实际参数dog2,那么把this付给dog2后dog2的属性应该就是dog1的属性,但是输出结果确是dog2的属性并没有改变,所以方法内部的dog不等于dog2.
在观察发现当dog1调用Copy2方法对方法内部的dog改变属性后dog2的属性也改变了,这不难发现,dog和dog2指向的内容地址是一样的,但是本身是不一样的。

由上诉结果我们可知当方法的参数是基本数据类型时参数传递形式是值传递,当方法的参数是引用数据类型时,并也相当于值传递(因为实际参数和方法内内部的参数的属性地址完全一样,但是他们本身不一样,他们在内存里面并不是一个东西)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在校大学生_程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值