工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊。

一、形参

形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间。因此仅在方法内有效。

public void swap(int a, int b) {

int temp = a;

a = b;

b = temp;

}

这里a,b就是形参,方法结束时,在栈空间就会被销毁。

二、实参

调用上面方法swap(6, 8); 其中6 8就是实参。

三、值传递和引用传递

值传递:方法调用时,实际参数将它的值传递给形式参数,函数就收到的是原始值的副本,此时内存中存在两个相同的基本类型,若方法中对形参执行处理操作,并不会影响实际参数的值。

引用传递:方法调用时,实际参数的引用(指内存地址,不是参数的值)被传递给方法中相应的形式参数,函数接受到的是原始值的内存地址,在方法中,形参和实参的内容(地址)相同,方法中对形参的处理会影响实参的值。

public class People {

private String name;

private String age;

public People(String name, String age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}

public class Base1 {

public static void main(String[] args) {

int a = 10;

// 按值传递

test1(a);

System.out.println("main a==" + a);

People p = new People("rose", "18");

// 按引用传递

test2(p);

System.out.println("main name==" + p.getName() +", age==" + p.getAge());

}

public static void test1(int a) {

a = 20;

System.out.println("test1 a==" + a);

}

public static void test2(People p) {

p.setName("jack");

p.setAge("19");

System.out.println("test2 name==" + p.getName() +", age==" + p.getAge());

}

}

输出结果:

test1 a==20

main a==10

test2 name==jack, age==19

main name==jack, age==19

结论:

形参为基本类型时,对形参的处理不会影响实参。

形参为应用类型时,对形参的处理会影响实参。

String、Integer、Double等immutable类型,因为本身没有提供修改函数的操作,每次操作都是生成一个新对象,所以要特殊对待,可以理解为值传递,形参操作不会影响实参对象。

四、java对象及引用

以上面的People为例,构建一个对象:People p1 = new People("jack", "19");

其实这个对象包含四个动作。

右边的new People,是以People类为模板,在堆空间创建一个People类对象。

末尾的("jack", "19"),指的是对象创建后,调用的构造函数,对刚生成的对象进行初始化。

左边的People p1创建了一个People类引用变量,所谓People类引用,就是以后可以用来指向People对象的引用。

= 操作符使对象引用指向刚创建的People对象。

People p1;

p1 = new People("jack", "19");

上面两条语句等价于 People p1 = new People("jack", "19");

这样看就很明白,一个是对象应用变量,一个是对象实体。

如果只执行第一条,还没执行第二条此时创建的p1还没指向任何一个对象,它的值是null。

再来一句:

People p2;

p2 = p1;

这里发生了复制行为,对象本身没有复制,被复制的只是对象的引用。结果是p2也指向了p1的对象。

再来一句:

p2 = new People("rose", "18");

此时p2指向了第二个对象,此时得出结论:

一个对象引用可以指向0个或者1个对象。

一个对象可以有N个引用指向它。

再来一句:

p1 = p2;

此时p1指向p2这个对象,至于之前的p1这个对象,它已成为垃圾回收机制的处理对象。

四、java中方法参数的引用传递

“当一个对象被当作参数传递到一个方法”,这就是所谓的引用传递。

public class Base2 {

public static void main(String[] args) {

People p = new People("jordon","23");

// changePeople1(p);

changePeople2(p);

System.out.println(p.getName() + "===" + p.getAge());

}

public static void changePeople1(People p) {

p.setName("kobe");

p.setAge("24");

}

public static void changePeople2(People p) {

p.setName("kobe");

p.setAge("24");

p = new People("james", "24");

}

}

以上代码调用changePeople1和changePeople2都是输出

kobe===24

我们来分析下为什么了??

标签:java,name,People,对象,age,传递,实参,public,String

来源: https://www.cnblogs.com/wudiffs/p/11573314.html

java实参传空_java形参、实参、值传递、引用传递相关推荐

  1. java中是值传递引用传递_Java是按值传递而不是按引用传递

    java中是值传递引用传递 One of the biggest confusion in Java programming language is whether java is Pass by V ...

  2. java null转空_Java对象为空时,将null转换为 保存值为空的属性

    Java对象为空时,不显示该对象属性,或者将null转换为"" 第一种方法: @JsonInclude(JsonInclude.Include.NON_NULL) private ...

  3. java判断栈空_java中栈的应用-判断分隔符是否合理

    栈是软件系统应用最广泛的数据结构之一,只要涉及先进后出的处理特征都可以使用栈结构. 例如:函数递归调用中的地址和参数值的保存,文本编辑器中序列的保存,在编译软件设计中的括号匹配及表达式求值,网页访问历 ...

  4. java不可变类型_Java中的值类型:为什么它们不可变?

    java不可变类型 值类型不必是不变的. 但是他们是. 在上一篇文章中,我讨论了Java中指针与引用之间的区别以及如何传递方法参数(按值传递或按引用传递). 这些与Java中尚不存在的值类型密切相关( ...

  5. xsl调用java方法传参_Java中的XSL转换:一种简单的方法

    xsl调用java方法传参 XSL转换 (XSLT)是将一个XML文档转换为另一个XML文档的强大机制. 但是,在Java中,XML操作相当冗长和复杂. 即使是简单的XSL转换,也必须编写几十行代码- ...

  6. java map 允许重复_java中key值可以重复的map:IdentityHashMap

    在Java中,有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 ...

  7. java构造函数传参_java 构造函数 , 参数传递 , lamda表达式

    1.  java 子类中必须显式或者隐式的调用父类的构造方法,原因是双亲委派机制.java 在创建一个对象是,会在构造方法中依次向上调用父类的构造方法. 为了找到父类的构造方法,所以子类应显式或者隐式 ...

  8. java 值传递 引用传递_Java小白进阶之值传递-引用传递

    class ClassA{ int value;//成员变量 } public class TestClassA{ public static void main(String args[]){ in ...

  9. java 参数传递为空_java 参数传递 空对象 null

    前两天,写程序时候,想传递一个数组名给一个函数,然后给数组new一下,并初始化数据,这样就使用非return,获得了一个初始化过对象,但是运行程序报"NullPointerException ...

  10. 值传递 引用传递(传地址,传引用)的区别

    传值      是把实参的值赋值给行参      那么对行参的修改,不会影响实参的值           传地址      是传值的一种特殊方式,只是他传递的是地址,不是普通的如int      那么 ...

最新文章

  1. Dubbo基础专题——第四章(Dubbo整合Nacos分析细节点)
  2. 009_jQuery链式编程
  3. sql-labs page2(21~38) 解题过程记录
  4. 实战渗透 | 向吃鸡外挂站开炮
  5. JMX的Hello World
  6. Java 中的 String 真的是不可变的吗
  7. Maximum Flow(2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E)
  8. 探索Windows命令行系列(7):通过命令编译C#类和Java类
  9. java线程中断和终止线程运行
  10. 解决VB6.0中不能加载MSCOMCTL.OCX的错误提示
  11. ADO SQL手写分页
  12. java秒杀项目总结
  13. Tomcat乱码情况完美解决
  14. Linux Block Driver - 1
  15. 雨林木风四大绝笔系统下载
  16. 【原创】全文搜索引擎技术原理入门
  17. Unity小游戏教程系列 | 创建小型太空射击游戏(三)
  18. 国美易卡管理云平台,国美易卡系统有扩展点
  19. swap分区,lvm的管理及计划任务
  20. 银河麒麟操作系统添加新硬盘后流程

热门文章

  1. 【图论】【二分图匹配】[POJ 3041]I'm Telling the Truth
  2. Android Service使用需要注意事项
  3. 已知二叉树先序和中序,求后序。
  4. [小知识] 关于Excel中行列的固定
  5. sudo和su命令简介
  6. Docker 提供外部访问
  7. 浅析Vue源码(二)—— initMixin(上)
  8. 从 LinkedIn 的数据处理机制学习数据架构
  9. 奇虎360-数据可视化
  10. 常用响应式web UI框架搜集整理