`
jackleechina
  • 浏览: 587339 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

java传值方式

    博客分类:
  • java
 
阅读更多
当你问大多数程序员Java是传值还是传引用的时候,你可能会得到两种答案之一:(1)Java传递原始类型数据时使用的是传值方式;传递对象时则使用传引用方式;String类型的数据采用的是传值方式,因为字符串是不可变的。(2)Java传递所有参数都使用传值方式。

只有第二个答案是正确的。理解传值和传引用的区别的关键是要记住,当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。

证明
如果Java通过传引用方式传递对象,那么执行下面的代码就会交换保存在两个变量a和b中的引用,而相应的输出应该如下:

a: 4
b: 100
Swapped!
a: 100
b: 4

其实真正的动作是在方法的参数o1和o2中的引用,它并不影响原始变量a和b。下面是其实际输出:

a: 4
b: 100
Swapped!
a: 4
b: 100

public class SwapTip {
    public static void main(String []args) {
        Integer a = new Integer(4);
        Integer b = new Integer(100);

        System.out.println("a: " + a);
        System.out.println("b: " + b);

        swap(a, b);

        System.out.println("Swapped!");
        System.out.println("a: " + a);
        System.out.println("b: " + b);
    }

    public static void swap(Object o1, Object o2) {
        Object t = o1;
        o1 = o2;
        o2 = t;
    }
}

为什么说这个争论的答案是有意义的?
很多参与过争论传递参数的方式的程序员最后都会说:“只是语义不同而已”或者是“没有关系,因为都理解它真正的工作原理。”

对于有经验的程序员来说这可能是一个语义问题,但是对于那么没有什么经验的程序员来说,情况就不一样了。对于程序员来说一个语言的黑拿越少,他们在用那种语言写程序的时候就能做得越好。

一个类比

对象引用与实例的关系就像遥控器与电视机的关系,引用控制对象就像遥控器控制电视机一样。如果一个遥控器的复制品给了另一个人,那么那个人也可以控制电视机。复制的遥控器对电视机的动作(比如说调节音量、改换频道或者调节时钟)对于它本身和原装遥控器来说都是可见的。如果那个人改装了复制的遥控器去控制另外一台电视机,那么原来的遥控器不会受到影响。

诚然,Java是通过传值还是传引用的方式来传递参数只是一个学术上的区别,只要我们知道期望哪种行为即可。但是有时候知道台后的事情也是重要的。

Java只有一种参数传递方式,那就是传值。它简单、有文档可查并且确实是如此。所以在下次你听到这个问题的时候你就会知道正确答案。

摘自:http://www.blogjava.net/zsh118/articles/24564.html


留意以下代码的执行结果
public class SwapTip {
    public static void main(String []args) {
        Test1 test=new Test1(1,2);

        System.out.println("a: " + test.getA());
        System.out.println("b: " + test.getB());

        swap(test);

        System.out.println("Swapped!");
        System.out.println("a: " + test.getA());
        System.out.println("b: " + test.getB());
    }

    public static void swap(Object o1, Object o2) {
        Object t = o1;
        o1 = o2;
        o2 = t;
    }
    public static void swap(Object o) {
    	Test1 t=(Test1)o;
        int temp = t.getA();
        t.setA(t.getB());
        t.setB(temp);
    }
}

class Test1{
	private int a;
	private int b;


	public Test1(int a,int b){
		this.a=a;
		this.b=b;
	}
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}	
}

执行结果如下
a: 1
b: 2
Swapped!
a: 2
b: 1

此结果说明,当程序只是更改了对象引用的拷贝本身的值时,对原对象引用和原对象引用没有影响。而当程序利用对象引用的拷贝去修改了对象的值时,则会更改对象本身。
分享到:
评论

相关推荐

    java传值中的乱码

    ### Java传值中的乱码问题及最简易的解决方法 在Java Web开发中,经常会遇到一个令人头疼的问题:客户端向服务器传递数据时出现乱码。这种情况不仅会影响用户体验,还可能导致程序逻辑错误。本文将深入探讨Java传值...

    lotus domnio java代理传值

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

    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中,有两种基本的数据类型:原始类型(如int, double, char等)和引用类型(如类实例、数组)。它们在函数调用时...

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

    - Java端可以使用JSON库(如Jackson或Gson)将Java对象转换为JSON字符串,然后通过上述方式传递给JavaScript。 - JavaScript可以使用JSON.parse()解析接收到的JSON字符串,将其转换回JavaScript对象。 4. **Web...

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

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

    java中页面传值的简单操作

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

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

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

    Struts2的三种传值方式比较(附demo)

    在本篇文章中,我们将详细探讨Struts2的三种主要的传值方式,并通过一个简单的Demo来加深理解。 1. **Action属性传值** Struts2的核心是Action类,每个Action类都代表一个特定的业务逻辑。我们可以通过在Action类...

    Android Intent多种传值方式

    本文将深入探讨Android Intent的多种传值方式。 1. **基本类型传值** - 使用`putExtra()`方法:Intent提供了`putExtra(String name, boolean value)`、`putExtra(String name, char value)`等方法,可以用来传递...

    JAVA中传值与引用问题

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

    Java是传值还是传址引用

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

    几种JSP页面传值方式.txt

    ### 几种JSP页面传值方式详解 在Java Web开发中,JSP(Java Server Pages)是一种常用的技术,用于创建动态网页。JSP页面之间的数据传递是实现前后端交互的关键环节之一。本文将详细介绍几种常见的JSP页面传值方式...

    引用类型传值方法

    本篇文章将详细探讨引用类型的传值方式。 首先,理解引用类型的概念至关重要。引用类型包括类(classes)、接口(interfaces)、数组以及委托(delegates),它们在内存中的存储方式与值类型截然不同。对于引用类型...

    java中传值与传引用

    首先,对于Java的基本数据类型(如int、char、byte、short、boolean、float、double),函数调用时是按照传值方式进行的。这意味着当一个基本类型的变量作为参数传递到函数时,函数接收的是这个变量的副本,而不是...

    flex与java远程传值demo

    Flex与Java远程传值是Web开发中...通过这种方式,开发者可以创建出功能丰富的Web应用,同时享受到Flex的交互性和Java的后端处理能力。在实际开发中,这可以应用于各种场景,如实时数据展示、用户交互和业务流程控制等。

    Ajax传值到java的方法中

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

    Java参数传递PPT

    本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。在Java中,类(Class)是对象的蓝图,它定义了对象可能具有的属性(如name、age、gender)和方法...

Global site tag (gtag.js) - Google Analytics