java值传递和引用传递(附实例)

  • 1.数据类型
    • 1.1 基本数据类型
    • 1.2 引用数据类型
  • 2.形参与实参
    • 2.1 函数中使用
    • 2.2 调用
  • 3.值传递和引用传递
    • 3.1 定义
    • 3.2 例子
    • 3.3 结论

观前提示:

本文所使用的IDEA版本为ultimate 2019.1,JDK版本为1.8.0_141。

1.数据类型

1.1 基本数据类型

基本数据类型包括数值型(整数型和浮点型),字符型和布尔型

  1. 整数型:byte,short,int,long
  2. 浮点型:float,double
  3. 字符型:char
  4. 布尔型:boolean

以下程序代码展示了这些基本数据类型的位数、包装类、最大值、最小值。

package testBasicDataType;public class Test {public static void main(String[] args) {//byteSystem.out.println("数据类型为 :" + Byte.TYPE);System.out.println("二进制位数 :" + Byte.SIZE);System.out.println("包装类为 :" + Byte.class);System.out.println("最大值为 :" + Byte.MAX_VALUE);System.out.println("最小值为 :" + Byte.MIN_VALUE);System.out.println("\n");//shortSystem.out.println("数据类型为 :" + Short.TYPE);System.out.println("二进制位数 :" + Short.SIZE);System.out.println("包装类为 :" + Short.class);System.out.println("最大值为 :" + Short.MAX_VALUE);System.out.println("最小值为 :" + Short.MIN_VALUE);System.out.println("\n");//intSystem.out.println("数据类型为 :" + Integer.TYPE);System.out.println("二进制位数 :" + Integer.SIZE);System.out.println("包装类为 :" + Integer.class);System.out.println("最大值为 :" + Integer.MAX_VALUE);System.out.println("最小值为 :" + Integer.MIN_VALUE);System.out.println("\n");//longSystem.out.println("数据类型为 :" + Long.TYPE);System.out.println("二进制位数 :" + Long.SIZE);System.out.println("包装类为 :" + Long.class);System.out.println("最大值为 :" + Long.MAX_VALUE);System.out.println("最小值为 :" + Long.MIN_VALUE);System.out.println("\n");//floatSystem.out.println("数据类型为 :" + Float.TYPE);System.out.println("二进制位数 :" + Float.SIZE);System.out.println("包装类为 :" + Float.class);System.out.println("最大值为 :" + Float.MAX_VALUE);System.out.println("最小值为 :" + Float.MIN_VALUE);System.out.println("\n");//DoubleSystem.out.println("数据类型为 :" + Double.TYPE);System.out.println("二进制位数 :" + Double.SIZE);System.out.println("包装类为 :" + Double.class);System.out.println("最大值为 :" + Double.MAX_VALUE);System.out.println("最小值为 :" + Double.MIN_VALUE);System.out.println("\n");//charSystem.out.println("数据类型为 :" + Character.TYPE);System.out.println("二进制位数 :" + Character.SIZE);System.out.println("包装类为 :" + Character.class);System.out.println("最大值为 :" + (int) Character.MAX_VALUE);System.out.println("最小值为 :" + (int) Character.MIN_VALUE);System.out.println("\n");//booleanSystem.out.println("数据类型为 :" + Boolean.TYPE);System.out.println("包装类为 :" + Boolean.class);System.out.println("真值为 :" + Boolean.TRUE);System.out.println("假值为 :" + Boolean.FALSE);}
}

运行结果如下


1.2 引用数据类型

包括类、接口类型、数组类型、枚举类型、注解类型,字符串型

2.形参与实参

2.1 函数中使用

  1. 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

  2. 实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

2.2 调用

  1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。

  2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

3.值传递和引用传递

3.1 定义

  1. 值传递
    在方法调用时,传递的参数是按值的拷贝传递。

  2. 引用传递
    在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

3.2 例子

例1

package testTransfer;public class Test {public static void main(String[] args) {int num = 10;num = 100;System.out.println(num);String str = "ab";str = "bd";System.out.println(str);}
}

运行结果如下

解析如下

基本数据类型是直接赋值,引用类型是重新开辟了一块新地址,并将新地址赋值回来。

例2

package testTransfer;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {int num = 10;System.out.println("num改变前:" + num);changeNum(10);System.out.println("num改变后:" + num);String str = "ab";System.out.println("str改变前:" + str);changeStr(str);System.out.println("str改变后:" + str);List<String> list = new ArrayList<>();list.add("a");list.add("b");System.out.println("list.get(1)改变前:" + list.get(1));changeList(list);System.out.println("list.get(1)改变后:" + list.get(1));String[] strings = new String[]{"a", "b"};System.out.println("strings[1]改变前:" + strings[1]);changeStrArray(strings);System.out.println("strings[1]改变后:" + strings[1]);User user = new User();user.name = "张三";user.age = 30;System.out.println("user.name改变前:" + user.name);System.out.println("user.age改变前:" + user.age);changeUserName(user);changeUserAge(user);System.out.println("user.name改变后:" + user.name);System.out.println("user.age改变后:" + user.age);}private static void changeNum(int num){num = 100;}private static void changeStr(String str){str = "abcd";}private static void changeList(List<String> list){list.set(1,"cd");}private static void changeStrArray(String[] strings){strings[1] = "cd";}private static void changeUserName(User user){user.name = "李四";}private static void changeUserAge(User user){user.age = 31;}
}class User{String name;int age;
}

运行结果如下

解析如下

  1. 基本数据类型形参所传递的值,是这个实际值的拷贝,所以无论对这个拷贝赋其他任何值,都不会改变原值。

  2. 引用类型(除String外),传递的都是存储值的引用地址的拷贝(也就是传递前和传递后的引用相同),改变这个拷贝的引用地址指向的值,会改变原来值的内容。

3.3 结论

  1. 基本数据类型的操作都是值传递。由于原始内容和副本都是存储实际值,并且是在不同的栈区,因此形参的操作,不影响原始内容。

  2. 引用类型的数据进行操作,基本上(String除外)都是“引用传递”(对引用的地址的传递)。 分两种情况,一种是形参和实参保持指向同一个对象地址,则形参的操作,会影响实参指向的对象的内容。一种是形参被改动指向新的对象地址(如重新赋值引用),则形参的操作,不会影响实参指向的对象的内容。

java值传递和引用传递(附实例)相关推荐

  1. java值传递和引用传递的例子,Java中的值传递和引用传递实例介绍

    代码如下: package Object.reference; public class People { private String name; private int age; public P ...

  2. Java中的值传递和引用传递

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?      答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为 ...

  3. java引用传递106_(转载)java的值传递与引用传递

    1 说明:本文的适用对象为java初学者.如果有读者发现文章中有叙述不妥之处,请指正.2 3 今天在论坛上有人提了一个关于java中调用函数时有没有引用传递的问题,可谓是吵的不可开交.有人说java只 ...

  4. 多图证明,Java到底是值传递还是引用传递?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见 ...

  5. java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

    java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java编程语言只有值传递参数. 当一个对象实 ...

  6. 【重难点】【Java基础 04】值传递和引用传递、序列化和反序列化

    [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 文章目录 [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 一.值传递和引用传递 1.对比 二.序列化 1.基本概 ...

  7. java 地址传递 返回值_Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  8. string 引用没有设置为 string 的实例。 参数名: s_Java中的值传递和引用传递,看完这篇终于终于明白了!...

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数 ...

  9. 这一次,彻底解决Java的值传递和引用传递

    本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...

最新文章

  1. OSSIM系统的安装教程(超详细)
  2. linux下织梦cms安装环境配置文件,Mac本地环境配置以及安装织梦CMS,增加新的坑解决办法...
  3. 数据挖掘流程(四):建模调参
  4. Impala:新一代开源大数据分析引擎--转载
  5. 能量项链(NOIP 2006 提高组)
  6. 图形裁剪算法matlab,MATLAB裁剪图片
  7. 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
  8. LeetCode 102. 二叉树的层次遍历(递归)(迭代)
  9. 【转载】linux tail命令的使用方法详解
  10. (转)Astar寻路教程
  11. 图文介绍 Presto + Velox 整合
  12. 手机连接Wi-Fi不能上网之DNS异常
  13. c语言考研必刷题小程序,小程序推荐:大学生必备刷题小程序,内容涵盖各种证书考试题型...
  14. 判断质数、分解质因数
  15. 敏捷项目管理 第2版[JimHighsmith](一)
  16. C++ 打印表格到屏幕或文件
  17. TEST | 运用position:absolute做一张太极图
  18. Ghost超级技巧一家亲
  19. 学习笔记(3):EXCEL VBA编程进阶-2.9 综合应用(多工作表的条件筛选)
  20. python篮球比赛预测数据分析统计服_用python基于2015-2016年的NBA常规赛及季后赛的统计数据分析...

热门文章

  1. php yii2框架教程,Yii2框架使用快速入门
  2. 《算法导论》第23章-最小生成树 23.1-最小生成树的形成
  3. 注解 “@Deprecated” 的含义与作用
  4. idea调试常用的快捷键
  5. ps 历史记录画笔工具 实现抠图效果 实例 利用蒙版工具
  6. 主---谓---宾 和 主---谓---间接宾语---直接宾语 学习笔记
  7. 使用3DMAX制作“黄房子”教程(四)
  8. php对接百家云回放,百家云直播
  9. 视频如何拼接?建议收藏这些方法
  10. 申请大学用的是IB预估分?