`
chinagdvea
  • 浏览: 132327 次
  • 性别: Icon_minigender_1
  • 来自: 韶关
社区版块
存档分类
最新评论

JAVA中的传值调用(Call by Value)

    博客分类:
  • JAVA
阅读更多
传值调用是指方法在调用参数时,不是对原参数进行操作,而是创建参数的拷贝并对进行操作,这种调用有利于保护数据.其在JAVA中的实现如下:

public class TestSwap {
	public static void main(String[] args) {
		int a = 0;
		int b = 1;
		System.out.println("a : " + a + " b : " + b);
		swap(a, b);
		System.out.println("a : " + a + " b : " + b);
	}

	public static void swap(int i, int j) {
		int temp = i;
		i = j;
		j = temp;
	}
}


  程序输出结果:   
    a : 0 b : 1   
    a : 0 b : 1   

也就是说,其实方法的运行并没有改变a,b的值,让我们深入JVM的内存中看看是怎么回事:   先看看JVM的存储区


对于swap(a, b)的方法调用,可以这样理解,a,b两个引用存储在Heap内,他们的int值0和1存储在Stack内,在调用swap方法时,新建了i,j两个引用   
i,j也指向int值0和1,在方法内互换的是i,j所指向的值,所以a,b所指向的并未发生改变 JAVA中的方法,只能对封装在类内部的变量的值进行操作,例子:

1.MyClass类封装variable
public class MyClass {

	int variable = 0;

	public void setVariable(int i) {

		variable = i;

	}

}


2.测试类Test

public class Test {

  public static void main(String[] args) {

    MyClass mc1 = new MyClass();

    MyClass mc2 = new MyClass();

    mc2.setVariable(1);  // mc2.variable的值设为1



    swapOne(mc1, mc2);  // 这行代码等于无效

    System.out.println("mc1's variable is " + mc1.variable);

    System.out.println("mc2's variable is " + mc2.variable);



    swapTwo(mc1, mc2); //  这行代码交换了mc1和mc2的variable的值

    System.out.println("mc1's variable is " + mc1.variable);

    System.out.println("mc2's variable is " + mc2.variable);

  }



  public static void swapOne(MyClass mc1k, MyClass mc2k) {

    MyClass temp = mc1k;

    mc1k = mc2k;

    mc2k = temp;

  }



  public static void swapTwo(MyClass mc1k, MyClass mc2k) {

    int temp = mc1k.variable;

    mc1k.variable = mc2k.variable;

    mc2k.variable = temp;

  }

}


程序输出结果 :   
mc1's variable is 0   
mc2's variable is 1   

mc1's variable is 1   
mc2's variable is 0   

解析:方法的拷贝出mc1和mc2的引用mc1k和mc2k.   
mc1与mc1k指向同一个实例MyClass(其中实例内的variable == 0);   
mc2与mc2k指向同一个实例MyClass(其中实例内的variable == 1);
  
swapOne方法交换了mc1k和mc2k所指向的对象,但是mc1k和mc2k在方法结束后被JVM回收了,mc1和mc2为改变   
swapTwo方法通过mc1k和mc2k互换了指向的对象MyClass里面的变量variable的值,mc1和mc2的指向的实例并未改变,但是指向的实例内的变量的值改变了,所以看起来好像是mc1和mc2所指向的实例互换了.
分享到:
评论

相关推荐

    C++传值调用与引用调用区别实例代码

    当一个函数被调用时,可以通过不同的方式传递参数,其中最常见的是传值(call by value)和传引用(call by reference)两种方法。这两种方式在内存管理、性能影响以及数据修改能力上有着显著的不同。 #### 1. 传值调用...

    lotus domnio java代理传值

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

    C语言中的三种调用中的其中一种-传值调用.c

    传值调用

    对Java中传值调用的理解分析

    在Java编程语言中,"传值调用"是指在函数或方法调用时,参数的值被复制并传递到函数内部。这意味着,当一个变量作为参数传递时,函数内部的操作不会影响到函数外部的原始变量。这个概念与C++中的"传引用调用"有所...

    Flex中函数传值调用Demo

    在Flex编程中,函数传值调用是日常开发中的常见操作。Flex是一种基于ActionScript的开源框架,主要用于构建富互联网应用程序(RIA)。本Demo主要展示了如何在Flex中进行函数之间的参数传递,以便实现不同功能模块...

    详解Java的call by value和call by reference

    在Java中,基本数据类型(primitive types)采用call by value方式传递参数。这意味着,当我们将一个基本数据类型的变量传递给一个方法时,实际上是将该变量的值传递给方法,而不是变量本身。这样,在方法内部对参数...

    java代码-使用java解决webservice接口call调用方式的源代码

    java代码-使用java解决webservice接口call调用方式的源代码 ——学习参考资料:仅用于个人学习使用!

    java用JNA调用dll实例,包含各种参数调用

    你需要定义一个接口,该接口的每个方法对应DLL中的一个函数,然后使用`NativeLibrary`类加载DLL,并将接口实例化,这样就可以在Java中直接调用DLL函数了。 1. **基本数据类型**:JNA支持Java的基本数据类型如int、...

    Flash老虎机源文件 Asp.net传值调用源码 Asp.net连Access库

    包含内容: 1.Flash8.0制作的老虎机计数器源文件,脚本版本为ActionScript2.0,功能为滚动停止后显示外传参数的数值 2.Html对Flash文件的传值调用...3.Asp.net对Flash文件的传值调用 4.Asp.net连接Access数据库读取数据

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

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

    java调用soap接口案例

    Java调用SOAP(Simple Object Access Protocol)接口是Web服务交互中的常见操作,SOAP是一种基于XML的协议,用于在Web上交换结构化的和类型化的信息。本案例主要关注如何使用Java来实现SOAP请求并获取响应,具体我们...

    service_java接口远程调用_get、post、带参数远程调用_

    在Java编程中,远程接口调用是分布式系统中常见的通信方式,它允许不同的服务之间进行数据交换和功能调用。本篇文章将详细讲解如何使用Java实现GET和POST方法的远程接口调用,以及如何处理带有参数的情况。 首先,...

    fragment之间用eventbus进行传值调用方法

    在Android开发中,Fragment是应用界面的重要组成部分,它允许我们在一个Activity中展示多个可交互的视图。在处理复杂的用户界面时,Fragment之间的通信成为了一个关键问题。EventBus是一个发布/订阅事件总线库,它...

    JAVA通过JNI调用C#dll的整个项目工程

    在本项目工程中,Java应用会通过JNI来调用C# DLL中的方法,实现功能的融合。 1. **JNI基础**: JNI为Java开发者提供了一种方式来编写本地代码,这些本地代码可以与Java虚拟机(JVM)交互。JNI接口包括一系列的函数...

    在Java程序中调用Matlab函数

    在Java程序中调用Matlab函数,介绍了在java中怎样调用matlab函数来进行矩阵的分析操作

    easyUi弹出window窗口传值与调用父页面的方法,子页面给父页面赋值

    在IT行业中,前端开发经常会遇到页面间的交互问题,如数据传递和函数调用。EasyUI是一个基于jQuery的UI框架,提供了丰富的组件,其中包括用于创建弹出窗口(window)的功能。在EasyUI中,我们可能会遇到需要在弹出...

    Java RPC调用示例

    Java RPC(Remote Procedure Call)调用是分布式系统中常见的通信方式,它允许一个程序在不关心远程系统具体实现的情况下调用另一个网络上的程序。在这个Java RPC调用示例中,我们将探讨RPC的基本概念、实现机制以及...

    java中两种方式调用其他.exe可执行程序

    Java 中两种方式调用其他.exe 可执行程序 Java 是一种广泛应用于企业级应用开发的编程语言,可以调用其他.exe 可执行程序,实现一些特殊的功能。在 Java 中有两种方式可以调用其他.exe 可执行程序,即使用 `Desktop...

    GMSSL的java调用(JNI库和调用实例).zip

    在这个“GMSSL的java调用(JNI库和调用实例).zip”压缩包中,我们主要探讨如何在Java环境中通过JNI(Java Native Interface)来调用GMSSL库,以便利用这些国密算法进行数据加解密和哈希运算。 首先,我们需要了解...

Global site tag (gtag.js) - Google Analytics