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

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

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

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

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

 我们如何判断一个类中它采用的值传递还是引用传递呢,我们要看类中的形参。
 如果形参的数据是基本数据类型,那么我们就可以断定他是值传递,
  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;

Java中不得不谈的值传递和地址传递的更多相关文章

  1. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  2. C语言:值传递,地址传递和引用传递(example:值交换)

    于C语言中值传递.地址传递和引用传递的我个人理解. 通过一个例子:swap(交换两个整型变量的值)来表现! #include <stdio.h> void swap1(int* a,int ...

  3. “equals”有值 与 “==”存在 “equals”只是比较值是否相同,值传递,==地址传递,null==a,避免引发空指针异常,STRING是一个对象==null,对象不存在,str.equals("")对象存在但是包含字符‘''

    原文链接:http://www.cnblogs.com/lezhou2014/p/3955536.html "equals" 与 "==" "equa ...

  4. C语言 值传递和地址传递

    不少同学在学到C语言的指针部分时感到很困惑,对经常提到的"值传递"和"地址传递"两个概念弄不 明白.实际上,因为地址本身也可以作为一个特殊的"值&qu ...

  5. C语言参数传递(值传递、地址传递)+二级指针

    参数传递 C语言参数传递一般分为:值传递和地址传递(本质上只有值传递) (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上 ...

  6. C#函数的参数传递方式1(值传递与地址传递)

    using System; namespace class1 { class program { static void Main(string[] args) { //值传递引用,实际参数不会变化 ...

  7. c语言进阶9-值传递与地址传递

    一.  函数的值传递 函数的值传递是指参数为基本类型时,如整型.浮点型.字符型(特指单字符型)时,参数传递时是从实参拷贝一份值传给形参,形参的变化不会影响实参的值. 1.        基本类型做参数 ...

  8. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  9. Java中的值传递和地址传递(传值、传引用)

    首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...

随机推荐

  1. Java异常与处理机制

    Java的异常层次体系 Java的所有异常对象都派生自Throwable类,下层有两个分支:error和exception. Error分支描述Java运行时系统内部错误或资源耗尽错误,遇到派生自Er ...

  2. Node.js socket 双向通信

    使用场景:  聊天室:大量数据常驻交互: 技术栈: Node.js,     Vue.js || 原生JS 服务端代码: const app = require('http').createServe ...

  3. css inline-block 水平居中

    给父元素添加text-align: center即可. body { text-align: center; background-color: black; } #outer { margin: 1 ...

  4. Java创建线程的两个方法

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  5. python课堂整理21---初识装饰器

    一.装饰器: 本质就是函数,功能:为其他函数添加附加功能 原则: 1.不能修改被装饰函数的源代码 2.不能修改被修饰函数的调用方式 一个简单的装饰器 import time def timmer(fu ...

  6. java练习---12

    public class L1106 { public static void main(String[] args) { // TODO Auto-generated method stub Tes ...

  7. 入门MySQL——基础语句篇

    前言:  前面几篇文章,我们介绍了MySQL的基础概念及逻辑架构.相信你现在应该有了自己的一套MySQL环境,接下来我们就可以开始练习MySQL了.本文将从MySQL最基础的语句出发,为你展示出创建及 ...

  8. Thymeleaf 模板 springboot集成使用

    一.Thymeleaf是什么? 简单说, Thymeleaf 是一款用于渲染XML/XHTML/HTML5内容的模板引擎,类似我之前用过的FreeMarker .由于它支持 html 原型,然后在 h ...

  9. Python中的inf与nan

    Python中可以用如下方式表示正负无穷 >>> float('inf') # 正无穷,inf不区分大小写,float('InF')一样可以. inf >>> fl ...

  10. HashMap、Hash Table、ConcurrentHashMap

    这个这个...本王最近由于开始找实习工作了,所以就在牛客网上刷一些公司的面试题,大多都是一些java,前端HTML,js,jquery,以及一些好久没有碰的算法题,说实话,有点难受,其实在我不知道的很 ...