这个问题一直以来都有误区。本质原因是那些写书的人,喜欢用“传引用”的这个概念,从而混淆Java传值的本质。
Java中参数的传递只有传值方式。
首先必须搞清楚,普通变量和引用变量。
普通变量:其内存单元即存的是值本身。如int值,其内存值只是自己的值。
引用变量:其内存单元存储的是一块内存的地址。其概念与指针是一样的。
在Java调用函数传递值的时候,函数外变量总是把自己的值赋给函数的参数变量。注意参数变量和函数外变量其内存单元的地址是不一样的,两个是不同的东西。
函数外变量传值给函数参数,函数参数的值发生改变,不影响到函数外部变量的值。
public class StringArg { //Java中总是使用传值调用。 public static String cao ="cao!"; public static MyFinal final1 = new MyFinal(); public static MyUnFinal final2 = new MyUnFinal(); public static int int1 = 1; public static void m1(String arg){ System.out.println("m1方法执行,输入参数为:"+arg); arg = "123"; System.out.println("m1方法结束,输出参数为:"+arg); } public static void m2(MyFinal arg){ System.out.println("m2方法执行,输入参数为:"+arg.toString()); arg = new MyFinal(); System.out.println("m2方法结束,输出参数为:"+arg.toString()); } public static void m3(MyUnFinal arg){ System.out.println("m3方法执行,输入参数为:"+arg.toString()); arg = new MyUnFinal(); System.out.println("m3方法结束,输出参数为:"+arg.toString()); } public static void m4(int arg){ System.out.println("m4方法执行,输入参数为:"+arg); arg = 2; System.out.println("m4方法结束,输出参数为:"+arg); } public static void main(String[] args) { m1(cao); System.out.println("main方法中调用m1方法之后的参数值:"+cao); System.out.println(); m2(final1); System.out.println("main方法中调用m2方法之后的参数值:"+final1); System.out.println(); m3(final2); System.out.println("main方法中调用m3方法之后的参数值:"+final2); System.out.println(); m4(int1); System.out.println("main方法中调用m4方法之后的参数值:"+int1); System.out.println(); } } final class MyFinal{} class MyUnFinal{}
以上代码输出的结果为:
m1方法执行,输入参数为:cao! m1方法结束,输出参数为:123 main方法中调用m1方法之后的参数值:cao! m2方法执行,输入参数为:MyFinal@61de33 m2方法结束,输出参数为:MyFinal@14318bb main方法中调用m2方法之后的参数值:MyFinal@61de33 m3方法执行,输入参数为:MyUnFinal@ca0b6 m3方法结束,输出参数为:MyUnFinal@10b30a7 main方法中调用m3方法之后的参数值:MyUnFinal@ca0b6 m4方法执行,输入参数为:1 m4方法结束,输出参数为:2 main方法中调用m4方法之后的参数值:1
可以看出函数方法无法影响到函数外部变量的值。
说明:
1、对于m1(String arg)字符串参数传递的问题,该问题非常经典。经常出现在面试中。
2、对于m2()和m3()方法,参数在函数内部重新分配了新的内存地址,即函数的参数有了新的值。但是外部变量的值没有变化。
之前一直会把以上问题与下面这个例子搞混掉
public class StringArg { public static MyObject myObject = new MyObject("cao!"); public static void m5(MyObject arg){ System.out.println("m5方法执行,输入参数为:"+arg.name); arg.name = "123"; System.out.println("m5方法结束,输出参数为:"+arg.name); } public static void main(String[] args) { m5(myObject); System.out.println("main方法中调用m5方法之后的参数值:"+myObject.name); System.out.println(); } } class MyObject{ public String name = ""; public MyObject(String name){ this.name = name; } }
输出当然是:
m5方法执行,输入参数为:cao! m5方法结束,输出参数为:123 main方法中调用m5方法之后的参数值:123
该例中,参数变量并没有重新与新对象绑定,即没有获得新值。在原值所指向的内存区域将对象进行修改。
相关推荐
### Java传值中的乱码问题及最简易的解决方法 在Java Web开发中,经常会遇到一个令人头疼的问题:客户端向服务器传递数据时出现乱码。这种情况不仅会影响用户体验,还可能导致程序逻辑错误。本文将深入探讨Java传值...
JAVA传值与传引用[整理].pdf
根据标题和描述,我们将深入探讨Java中传值与引用的区别,以及它们在实际编程中的应用。 首先,Java是一种“总是按值传递”的语言。这意味着无论是基本类型还是引用类型,当作为参数传递时,都会有一个副本被创建并...
"lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理之间传递参数。 首先,让我们了解一下Lotus Domino Java代理的基本概念。在Lotus Domino Designer中,Java代理是用Java语言...
1. **Java到JavaScript的传值**: - **通过HTML标签属性**:Java代码可以通过设置HTML元素的属性来传递值。例如,`<input type="hidden" id="myValue" value="<%= javaVariable %>">`,这里的`javaVariable`是Java...
### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...
Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE...
### Java 文件路径获取方法详解 #### 一、引言 在Java开发中,经常会遇到需要获取文件路径的情况,尤其是在处理配置文件、图片等资源时。本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好...
在Java编程语言中,"传值与传值后的改变"是一个关键的概念,涉及到函数调用时参数的传递方式。在Java中,有两种基本的数据类型:原始类型(如int, double, char等)和引用类型(如类实例、数组)。它们在函数调用时...
Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...
在Java Web开发中,页面传值是不可或缺的一部分,主要用于用户在网页上填写信息后提交到服务器进行处理。本文将详细讲解如何在Java中通过表单(Form)进行页面传值的简单操作。 首先,我们需要了解HTML中的表单元素...
第一次使用int实验: public class TTEST { private static List<UserEntity> mList = new LinkedList(); public static void main(String[] args) { int a = 0; changeA(a); System.out.println("a = "+a);...
### Flex与Java通过实体传递数据 #### 背景介绍 在现代Web应用开发中,前端与后端之间的数据交互是必不可少的一部分。Flex作为一种流行的富客户端技术,常用于构建复杂的用户界面;而Java则因其强大的服务器端处理...
### JAVA中传值与引用问题详解 #### 一、引言 在计算机编程领域,特别是对于面向对象语言如Java而言,“传值”与“传引用”的概念是理解数据传递机制的关键所在。Java作为一种广泛使用的高级编程语言,在设计之初就...
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...
invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法示例 localVariable.java 演示局部变量 ...
Flex与Java远程传值是Web开发中的一个重要技术组合,它允许富互联网应用程序(RIA)如Flex客户端与服务器端的Java应用进行数据交换。本示例是一个综合性的项目,包括两个模块:一个基于Flex的前端应用和一个基于Java...
在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...
Ajax传值到Java方法中的实现 Ajax技术是当前Web开发中最流行的技术之一,能够实现页面的异步刷新和数据交互。但是,Ajax传值到Java方法中的实现却不是那么简单,需要了解Ajax的原理和Java的Web开发机制。 首先,...