当前位置: 首页 > 编程笔记 >

详解Java的call by value和call by reference

储阳曦
2023-03-14
本文向大家介绍详解Java的call by value和call by reference,包括了详解Java的call by value和call by reference的使用技巧和注意事项,需要的朋友参考一下

题目如下:

Java传参的两种方式

  • call by value(值传递):传递的是值(针对基本数据类型),如传递一个整型数值。实际上,按值传递在方法调用方法中,参数只是实际参数的一份拷贝。
  • call by reference(引用传递):传递的是对象的引用(针对对象),即传递的是对象的地址。实际上,引用按传递时候会产生一份新的引用拷贝,新旧两份引用同时指向同一个地址。

代码示例

public class TestJavaCallBy {

 

 // 测试值传递

 public static void testCallByValue(int value) {

  value *= 10;

 }

 

 // 测试引用传递

 public static void testCallByReference(StringBuilder sb) {

  sb.append(" - " + ZonedDateTime.now());

 }

 

 public static void main(String[] args) {

 

  // 测试值变量

  int param = 1;

  // 测试引用对象

  StringBuilder sb = new StringBuilder("666");

 

  // 测试

  System.out.println(param);

  testCallByValue(param);

  System.out.println(param);

 

  System.out.println(sb.toString());

  testCallByReference(sb);

  System.out.println(sb.toString());

 }

}

 

控制台输出结果

1

// 结果仍为1,因为参数传递的是实参的一份拷贝,对实参不造成影响

1 

 

666

// 传递的是引用的拷贝,新旧两个引用指向同一个对象(地址),因此append操作是作用在该对象上

666 - 2019-03-16T01:25:57.933038500+08:00[Asia/Shanghai]

那么就能得出一下结论:

  • call by value不会改变实参的值
  • call by reference不能改变实参的参考地址
  • call by reference能改变实参的内容

那么这道题的答案就是这样。

 类似资料:
  • 本文向大家介绍详解Java 中的UnitTest 和 PowerMock,包括了详解Java 中的UnitTest 和 PowerMock的使用技巧和注意事项,需要的朋友参考一下 学习一门计算机语言,我觉得除了学习它的语法外,最重要的就是要学习怎么在这个语言环境下进行单元测试,因为单元测试能帮你提早发现错误;同时给你的程序加一道防护网,防止你的修改破坏了原有的功能;单元测试还能指引你写出更好的代码

  • 本文向大家介绍详解Java中int和Integer的区别,包括了详解Java中int和Integer的区别的使用技巧和注意事项,需要的朋友参考一下 基本数据类型和引用类型 Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是I

  • 本文向大家介绍Java中堆和栈的区别详解,包括了Java中堆和栈的区别详解的使用技巧和注意事项,需要的朋友参考一下 当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.

  • 本文向大家介绍java中ArrayList和LinkedList的区别详解,包括了java中ArrayList和LinkedList的区别详解的使用技巧和注意事项,需要的朋友参考一下 ArrayList和LinkedList都实现了List接口,有以下的不同点: 1、ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList

  • 本文向大家介绍详解Java中HashSet和TreeSet的区别,包括了详解Java中HashSet和TreeSet的区别的使用技巧和注意事项,需要的朋友参考一下 详解Java中HashSet和TreeSet的区别 1. HashSet HashSet有以下特点: 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null 当向HashSet集合中存入一

  • 本文向大家介绍java中SynchronizedList和Vector的区别详解,包括了java中SynchronizedList和Vector的区别详解的使用技巧和注意事项,需要的朋友参考一下 前言 Vector是java.util包中的一个类。 SynchronizedList是java.util.Collections中的一个静态内部类。 在多线程的场景中可以直接使用Vector类,也可以使

  • 本文向大家介绍Java中的迭代和递归详解,包括了Java中的迭代和递归详解的使用技巧和注意事项,需要的朋友参考一下 前言 最近在看书的时候看到这一内容,感觉还是蛮有收获的。迭代使用的是循环(for,while,do...wile)或者迭代器,当循环条件不满足时退出。而递归,一般是函数递归,可以是自身调用自身,也可以是非直接调用,即方法A调用方法B,而方法B反过来调用方法A,递归退出的条件为if,e

  • 本文向大家介绍Java Comparable 和 Comparator 的详解及区别,包括了Java Comparable 和 Comparator 的详解及区别的使用技巧和注意事项,需要的朋友参考一下 Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下。