`

Java的传值

 
阅读更多

这个问题一直以来都有误区。本质原因是那些写书的人,喜欢用“传引用”的这个概念,从而混淆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传值中的乱码问题及最简易的解决方法 在Java Web开发中,经常会遇到一个令人头疼的问题:客户端向服务器传递数据时出现乱码。这种情况不仅会影响用户体验,还可能导致程序逻辑错误。本文将深入探讨Java传值...

    JAVA传值与传引用[整理].pdf

    JAVA传值与传引用[整理].pdf

    Java传值还是引用

    根据标题和描述,我们将深入探讨Java中传值与引用的区别,以及它们在实际编程中的应用。 首先,Java是一种“总是按值传递”的语言。这意味着无论是基本类型还是引用类型,当作为参数传递时,都会有一个副本被创建并...

    lotus domnio java代理传值

    "lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理之间传递参数。 首先,让我们了解一下Lotus Domino Java代理的基本概念。在Lotus Domino Designer中,Java代理是用Java语言...

    JSP中java代码与js之间的传值

    1. **Java到JavaScript的传值**: - **通过HTML标签属性**:Java代码可以通过设置HTML元素的属性来传递值。例如,`<input type="hidden" id="myValue" value="<%= javaVariable %>">`,这里的`javaVariable`是Java...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    ### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...

    Java SE程序 界面传值问题

    Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE...

    java文件路径获取

    ### Java 文件路径获取方法详解 #### 一、引言 在Java开发中,经常会遇到需要获取文件路径的情况,尤其是在处理配置文件、图片等资源时。本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好...

    java的传值与传值后的改变

    在Java编程语言中,"传值与传值后的改变"是一个关键的概念,涉及到函数调用时参数的传递方式。在Java中,有两种基本的数据类型:原始类型(如int, double, char等)和引用类型(如类实例、数组)。它们在函数调用时...

    Java参数传递PPT

    Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...

    java中页面传值的简单操作

    在Java Web开发中,页面传值是不可或缺的一部分,主要用于用户在网页上填写信息后提交到服务器进行处理。本文将详细讲解如何在Java中通过表单(Form)进行页面传值的简单操作。 首先,我们需要了解HTML中的表单元素...

    Java传值和通过引用传递

    第一次使用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通过实体传递数据

    ### Flex与Java通过实体传递数据 #### 背景介绍 在现代Web应用开发中,前端与后端之间的数据交互是必不可少的一部分。Flex作为一种流行的富客户端技术,常用于构建复杂的用户界面;而Java则因其强大的服务器端处理...

    JAVA中传值与引用问题

    ### JAVA中传值与引用问题详解 #### 一、引言 在计算机编程领域,特别是对于面向对象语言如Java而言,“传值”与“传引用”的概念是理解数据传递机制的关键所在。Java作为一种广泛使用的高级编程语言,在设计之初就...

    Java是传值还是传址引用

    ### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...

    Java开发技术大全(500个源代码).

    invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法示例 localVariable.java 演示局部变量 ...

    flex与java远程传值demo

    Flex与Java远程传值是Web开发中的一个重要技术组合,它允许富互联网应用程序(RIA)如Flex客户端与服务器端的Java应用进行数据交换。本示例是一个综合性的项目,包括两个模块:一个基于Flex的前端应用和一个基于Java...

    java中传值与传引用

    在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...

    Ajax传值到java的方法中

    Ajax传值到Java方法中的实现 Ajax技术是当前Web开发中最流行的技术之一,能够实现页面的异步刷新和数据交互。但是,Ajax传值到Java方法中的实现却不是那么简单,需要了解Ajax的原理和Java的Web开发机制。 首先,...

Global site tag (gtag.js) - Google Analytics