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

一、形参

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

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形参_java形参、实参、值传递、引用传递相关推荐

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

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

  2. C专家编程--指针和数组(三) 值传递 指针传递 引用传递

    可以先看下这两篇文章 http://blog.csdn.net/yusiguyuan/article/details/12357381 http://blog.csdn.net/yusiguyuan/ ...

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

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

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

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

  5. c语言值传递 地址传递 引用传递参数,C++参数传递(值传递,引用传递)

    值传递 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 在函数结束返回后,形参被丢弃释放,实参的内容不会被改变 数据值传递和地址值传递 数 ...

  6. 继承,封装,多态和值传递引用传递

    面向过程思想(线性): 1. 步骤清晰简单,第一步做什么,第二步做什么- 2. 面对过程适合处理一些较为简单的问题 面向对象思想: 1. 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类, ...

  7. Python:值传递,引用传递?不存在的,是赋值传递

    Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...

  8. Python进阶:值传递,引用传递?不存在的,是赋值传递

    Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...

  9. php函数间参数传递(值传递/引用传递)

    为什么80%的码农都做不了架构师?>>>    函数间的参数传递包括值传递和引用传递. php:函数间的参数传递 1.值传递 复制代码代码如下: <?php  function ...

最新文章

  1. 结合不同的模型进行集成学习
  2. MD5+Base64加密(密码常用加密方式)
  3. Action 参数的取值及其含义
  4. Felgo简介--Qt开发者的福音
  5. 大智慧找不到服务器,【图】大智慧官方居然没有全推服务器请老师解决_股票软件,股票指标,炒股,股票论坛,选股公式_股票软件技术交流论坛_理想论坛 - 股票论坛...
  6. Element UI 中table的验证
  7. php 控制台打印_php调试利器:FirePHP的安装与使用
  8. jquery的一些常用方法
  9. Centos6.4系统局域网服务之DHCP
  10. MySQL 效能监控工具--mysqlreport -转
  11. python--贝壳租房爬虫及数据可视化
  12. vue页面引用百度地图怎么让百度logo不显示
  13. [量化-038]python代码-根据roe估算公司的pb值
  14. 让TQ2440也用上设备树 (device tree 操作实例3_重要,对于移植很有参考价值_code)
  15. linux如何上传数据到百度网盘,Linux命令行上传文件到百度网盘
  16. LINUX centos7.6修改静态IP与配置参数NM_CONTROLLED
  17. Windows系统电脑常用快捷键
  18. 手机html怎样取消,手机怎么取消wifi隐藏_手机如何取消隐藏wifi?-192路由网
  19. java用户界面课程设计_java课程设计《消息公布体系》用户界面设计模板.doc
  20. 项管(十六)——文档管理、配置管理、知识管理、变更管理

热门文章

  1. c++ 无穷大0x7FFFFFFF+0x7FFFFFFF 是多少
  2. 杰理之关于蓝牙天线串联15P电感,15pH?【篇】
  3. 私彩视频开奖动画直播源码内部核心技术解析及修改可增加后台操控-持续更新文章!
  4. github小工具之fscan
  5. Python单线程爬取QQ空间说说存入MySQL并生成词云(超详细讲解,踩坑经历)
  6. HTML上传图片并实时更新显示
  7. Mybatis与Spring集成(易百教程)
  8. bootstrap丰富的html标签和css类(一)网格系统、文本排版、代码块显示、表格显示
  9. 借身份证给别人办理流量卡有风险吗?这些情况你必须要知道!
  10. html局部刷新数据,局部刷新.html