经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java中不得不谈的值传递和地址传递
来源:cnblogs  作者:如果可以,我选择忘记  时间:2018/10/29 10:04:04  对本文有异议

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

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

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

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

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

  1. 1 我们如何判断一个类中它采用的值传递还是引用传递呢,我们要看类中的形参。
  2. 2 如果形参的数据是基本数据类型,那么我们就可以断定他是值传递,
  1. eg.
    本包中的People.java Human.java 中有对值传递的介绍;
  1. package com.baidu;
  2. public class People {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. Human human = new Human("dengchunlai");
  6. //human.yang(); 不能这样使用,因为 String yang是定义的字符串类型的类(变量),不是方法;
  7. //human.yang;//不能这样使用;
  8. String ming = human.yang;
  9. System.out.println(human.yang); //但可以这样使用;
  10. System.out.println(ming);
  11. }
  12. }
  1. package com.baidu;
  2. public class Human {
  3. String yang;
  4. public Human(String st1) {
  5. // TODO Auto-generated constructor stub
  6. yang = st1;
  7. }
  8. }

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

那什么是引用传递呢?

  1. 如果形参里的数据为 那么我们就断定他是引用传递;
  2. (*)按引用传递参数时,被调用的方法中的代码将直接访问原始对象  ->[按引用传递的基础]
  1. package com.baidu;
  2. class Data {
  3. String msg;
  4. public Data(String str) {
  5. // TODO Auto-generated constructor stub
  6. this.msg = str;
  7. }
  8. // public Data() {
  9. //
  10. // }
  11. }
  1. package com.baidu;
  2. public class DataPrinter {
  3. void print(Data d) {
  4. System.out.println(d.msg);
  5. }
  6. public void setMsg(Data d) {
  7. d.msg = "Hello to Java ! ";
  8. }
  9. }
  1. public class MethodCallDemo2 {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. Data data = new Data("Hello from Java !"); //创建了一个Data类对象的一个引用data,同时new了一个有参的构造函数;
  5. DataPrinter dp = new DataPrinter();
  6. // System.out.println("第一次输出结果;"+ data.msg);
  7. dp.setMsg(data);
  8. System.out.println("第二次输出结果:"+data.msg);
  9. }
  10. }

 

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

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

言归正传:

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

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号