Java使用按值传递的函数调用方式,这往往使我感到迷惑。因为在基础数据类型和对象的传递上,我就会纠结于到底是按值传递,还是按引用传递。其实经过学习,Java在任何地方,都一直发挥着按值传递的本色。
首先,让我们看一看基础数据类型是如何按值传递的。
public static void main(String[] args) { int a = 2; calculate(a); System.out.println(a); } public static void calculate(int param) { param += 3; System.out.println(param); }
输出结果为:
5 2
这样的结果根据按值传递,并不难理解。
其次,让我们来看看复杂的对象时如何保持自己的“贞操”,而仅仅是把引用这个“才艺”展示给人们。
public static void main(String[] args) { // 包装类型,不可变类型 Integer b = new Integer(2); calculate2(b); System.out.println(b); // 日期类型,目标方法改变对象值,当前日期2013-09-24 Date d1 = new Date(); claculate3(d1); System.out.println(d1); // 日期类型,目标方法仅读取对象值,当前日期2013-09-24 Date d2 = new Date(); calculate4(d2); System.out.println(d2); } public static void calculate2(Integer param) { param += 3; System.out.println(param); } public static void claculate3(Date date) { date.setDate(date.getDate() + 1); System.out.println(date); } public static void calculate4(Date date) { date = new Date(date.getYear(), date.getMonth(), date.getDate() + 1); System.out.println(date); }
输出结果为:
5 2 Wed Sep 25 20:24:32 CST 2013 Wed Sep 25 20:24:32 CST 2013 Wed Sep 25 00:00:00 CST 2013 Tue Sep 24 20:24:32 CST 2013
从结果可以看出:
一、包装类型作为不可变的对象,原有的Integer对象并没有改变,所以输出与基础类型的一样。
二、日期类型是可变对象,当仅仅是读取原有对象中的值时,没有问题,调用函数中的打印结果不改变,和当前日期保持一致,只是目标函数中打印的是新对象的值,所以两次打印结果不同;当在目标方法中将原有对象改变,那么两次打印的都是原有对象的值,所以结果相同,并且与初始的new Date()不一样。
所以说呢,基础数据类型按值传递很容易理解,但是对于对象,Java也是按值传递,只不过传递的时候不是直接传递对象,而是传递引用的值,引用指向的对象相同而已。
以我的水平就能写这么多,希望大牛们觉得不对的地方,给我指出来。。。
相关推荐
综上所述,在Java中,对于基本数据类型的参数传递实际上是按值传递,而对于对象类型的参数传递则是按引用传递的一种特殊形式——传递的是对象引用的副本,但由于这些副本指向同一个对象,因此对对象的修改会影响到...
例如,`java jni调用so中的函数api.txt`中可能包含了具体的JNI函数调用示例。 其次,JNA是一种更高级的接口,它提供了更简洁的方式来调用本地库,无需编写C/C++代码。JNA通过映射Java方法到本地函数,减少了编程...
本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递。在编程中,当我们调用一个函数或方法时,我们可以向其提供一些值,...
学习如何定义和调用方法,理解参数传递机制,以及如何使用返回值,有助于提高代码的可读性和可维护性。 异常处理是Java程序中不可忽视的一部分。通过try-catch-finally语句,你可以捕获并处理可能出现的错误,保证...
7. **方法**:函数的定义与调用,参数传递,方法重载和重写。 8. **异常处理**:理解异常的产生,学习try-catch语句块,以及finally块的使用。 9. **IO流**:学习输入输出流,包括文件操作,字符流与字节流,以及...
- **方法的定义与调用**:函数(方法)的概念,参数传递方式,返回值类型等。 - **异常处理**:try-catch-finally语句块的使用,自定义异常类的创建。 ### 3. 面向对象编程基础 - **类与对象的概念**:类的定义,...
API(Application Programming Interface)是一组预定义的函数、类或协议,允许开发者通过特定方式与软件系统进行交互。在这个例子中,我们关注的是百度的人脸识别服务,它提供了对比和识别人脸的功能。为了使用这些...
### Java调用存储过程——传入集合参数:深入解析与实践 #### 核心知识点概览 在Java应用中,调用数据库存储过程时,往往需要处理复杂的参数传递,特别是当参数为集合类型时,这一过程变得更加具有挑战性。本文将...
2. **参数传递**:Java支持两种参数传递方式——按值传递(primitive types)和按引用传递(对象)。按值传递意味着函数接收的是变量的副本,而按引用传递则允许函数修改原始对象的状态。 3. **返回值**:函数可以...
这就涉及到我们今天要讨论的主题——如何用JAVA调用Tuxedo服务。 首先,我们需要理解的是Java调用Tuxedo服务的基础:Jolt(Java to Tuxedo)。Jolt是一个Java接口,它提供了连接到Tuxedo服务的桥梁,使得Java开发者...
然后将这个对象传递给`Thread`的构造函数,通过`Thread`来启动线程。 - 实现`Callable`接口:配合`FutureTask`使用,可以返回计算结果并能抛出异常的线程。 2. **线程的生命周期**: - 新建(New):线程对象被...
### 函数调用大全——JNI调用详解 #### 核心知识点:JNI(Java Native Interface) JNI,即Java Native Interface,是一种允许Java代码调用本地应用程序接口(Native APIs)和库的标准方法,反之亦然。这为Java...
7. **错误处理和优化**: 处理可能的异常,如DLL加载失败、函数调用错误等。此外,根据实际需求优化性能,例如通过多线程处理多个音频流,或者缓存部分识别结果以减少重复计算。 在提供的压缩包文件中,`路径说明....
线性规划是运筹学中的一种基础优化方法,主要用于解决在一组线性约束条件下,如何最大化或最小化一个线性目标函数的问题。在Java编程环境下,我们可以构建一个线性规划算法来解决这些问题。以下是关于线性规划算法...
- **寻址方式**:在 JDK 1.8 及以后的版本中,`HashMap` 的寻址方式仅依赖于键(Key)的哈希值来确定元素的存储位置。这减少了冲突的可能性,提高了查询速度。 - **并发问题**:由于 `HashMap` 在 JDK 1.7 和 JDK ...
7. **闭包**:JavaScript的函数能够访问并操作其定义时的作用域,即使在函数调用后,这种特性称为闭包,常用于实现私有变量和模块化。 8. **高阶函数**:接受函数作为参数或者返回函数的函数,例如`map`、`filter`...
在Java编程环境中,有时我们需要与JavaScript交互,例如执行一些动态脚本...开发者可以轻松地在Java程序中执行JavaScript代码,调用JavaScript函数,甚至传递Java对象到JavaScript环境,从而实现两者之间的协同工作。