欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中不得不谈的值传递和地址传递

程序员文章站 2022-05-11 15:09:27
个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... 今天学习Java的时候,看见书中提及方法参数传递 有按值传递 和按地址传递; 上面的源代码是Java中的按值传递: 那什么是引用 ......

个人的一些认识,希望能对初学java的你,或者困惑于方法参数传递的你祈祷一丝帮助!

下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持...

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

今天学习java的时候,看见书中提及方法参数传递

有按值传递 和按地址传递;

1 我们如何判断一个类中它采用的值传递还是引用传递呢,我们要看类中的形参。
2 如果形参的数据是基本数据类型,那么我们就可以断定他是值传递,
  eg.
本包中的people.java 和human.java 中有对值传递的介绍;
package com.baidu;

public class people {

    public static void main(string[] args) {
        // todo auto-generated method stub
    human human = new human("dengchunlai");
    //human.yang();    不能这样使用,因为 string yang是定义的字符串类型的类(变量),不是方法;
    
    //human.yang;//不能这样使用;
    string ming = human.yang;
    system.out.println(human.yang);        //但可以这样使用;
    system.out.println(ming);
    }

}
package com.baidu;

public class human {

    string yang;
    public human(string st1) {
        // todo auto-generated constructor stub
        yang = st1;
    }
}

上面的源代码是java中的按值传递:

那什么是引用传递呢?

如果形参里的数据为 类 ; 那么我们就断定他是引用传递;

(*)按引用传递参数时,被调用的方法中的代码将直接访问原始对象  ->[按引用传递的基础]
package com.baidu;

class data {
    string msg;
    public data(string str) {
        // todo auto-generated constructor stub
        this.msg = str;
    }
//    public data() {
//        
//    }
}
package com.baidu;

public class dataprinter {
    void print(data d) {
        system.out.println(d.msg);
    }
    public void setmsg(data d) {
        d.msg = "hello to java ! ";
    }

}
public class methodcalldemo2 {

    public static void main(string[] args) {
        // todo auto-generated method stub
        data data = new data("hello from java !");        //创建了一个data类对象的一个引用data,同时new了一个有参的构造函数;
        dataprinter dp = new dataprinter();
//        system.out.println("第一次输出结果;"+ data.msg);
        dp.setmsg(data);
        system.out.println("第二次输出结果:"+data.msg);
    }

}

 

证明()里是一个无参的构造方法:

[个人心得]:在编写代码的时候发现 data data = new data("hello from java !"); 
        在使用这句语句的时候我在data 我们需要在类中建立一个带字符串型的形参的构造方法;
          由于在之前单独使用创建的时候是调用无参的构造函数,我在想他放到构造一个默认的无参的构造函数呢,于是我在data类中构造了一个无参的
          但事实证明,程序出现报错,由此可证明()中确实是一个构造函数,但为什么不显示他的构造函数呢,第一句语句new的是一个构造函数,且并不显示,可能由于系统默认吧!

言归正传:

这个代码的核心就是   dp.setmsg(data);  
我们怎么理解呢,dataprinter类中的设置器中的形参是data d;      他这么设置形参的原因是什么呢,可能由于主方法的  dp.setmsg(data);  
是要求data类,所以引用传递,由于(按引用传递参数时,被调用的方法中的代码将直接访问原始对象),所以setmsg()这个方法里面的代码
可以直接访问data这个原始类的原始对象string msg;