`
xiongzhenhui
  • 浏览: 205642 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

java引用类型和值类型

阅读更多

Java传值还是传引用终极解释,还是看老外解释的清楚啊。

    博客分类:
    java开发

JavaIBMHTMLSUN

by http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Does Java pass by reference or pass by value?
Why can't you swap in Java?
By Tony Sintes, JavaWorld.com, 05/26/00
Q:If Java uses the pass-by reference, why won't a swap function work?
A:Your question demonstrates a common error made by Java language newcomers. Indeed, even seasoned veterans find it difficult to keep the terms straight.

Java does manipulate objects by reference, and all object variables are references. However, Java doesn't pass method arguments by reference; it passes them by value.

Take the badSwap() method for example:
Java代码  收藏代码

    public void badSwap(int var1, int var2) 
     
     int temp = var1; 
     var1 = var2; 
     var2 = temp; 



When badSwap() returns, the variables passed as arguments will still hold their original values. The method will also fail if we change the arguments type from int to Object, since Java passes object references by value as well. Now, here is where it gets tricky:
Java代码  收藏代码

     public void tricky(Point arg1, Point arg2) 
    { 
      arg1.x = 100; 
      arg1.y = 100; 
      Point temp = arg1; 
      arg1 = arg2; 
      arg2 = temp; 
    } 
    public static void main(String [] args) 
    { 
      Point pnt1 = new Point(0,0); 
      Point pnt2 = new Point(0,0); 
      System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);  
      System.out.println("X: " + pnt2.x + " Y: " +pnt2.y); 
      System.out.println(" "); 
      tricky(pnt1,pnt2); 
      System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);  
      System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);   
    } 
     
                        

If we execute this main() method, we see the following output:
Java代码  收藏代码

     X: 0 Y: 0 
    X: 0 Y: 0 
    X: 100 Y: 100 
    X: 0 Y: 0 

The method successfully alters the value of pnt1, even though it is passed by value; however, a swap of pnt1 and pnt2 fails! This is the major source of confusion. In the main() method, pnt1 and pnt2 are nothing more than object references. When you pass pnt1 and pnt2 to the tricky() method, Java passes the references by value just like any other parameter. This means the references passed to the method are actually copies of the original references. Figure 1 below shows two references pointing to the same object after Java passes an object to a method.
Figure 1. After being passed to a method, an object will have at least two references

Figure 1. After being passed to a method, an object will have at least two references



Java copies and passes the reference by value, not the object. Thus, method manipulation will alter the objects, since the references point to the original objects. But since the references are copies, swaps will fail. As Figure 2 illustrates, the method references swap, but not the original references. Unfortunately, after a method call, you are left with only the unswapped original references. For a swap to succeed outside of the method call, we need to swap the original references, not the copies.

Figure 2. Only the method references are swapped, not the original ones

Author Bio

Tony Sintes is a principal consultant at BroadVision. Tony, a Sun-certified Java 1.1 programmer and Java 2 developer, has worked with Java since 1997.O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'" As a result, you cannot write a standard swap method to swap objects.
分享到:
评论

相关推荐

    值类型和引用类型的区别

    值类型和引用类型的区别: 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%. 言归正传,咱还是先来探讨探讨这二者...

    JAVA中值类型和引用类型的区别

    在java开发中经常会遇到值类型和引用类型知识,但是有很多朋友不清楚java中值类型和引用类型的区别,今天小编通过本文给大家介绍下

    引用类型传值方法

    引用类型不像值类型传值那样直接,那么引用类型是怎么样传值的呢?答案就在此文档中。

    java值传递与引用传递

    不管是按值传递还是按引用传递,都是把栈中的数据备份了一份给参数变量,只不过值类型备份的是具体的数值,而引用类型备份的是内存地址

    【Java基础】判断引用类型相等

    在Java中,判断值类型的变量是否相等可以使用==。但是,判断引用类型的变量是否相等,==表示“引用是否相等”,或者说,是否指向同一个对象。例如,下面的两个String类型,它们的内容是相同的,但是,分别指向不同的...

    java笔试题 大学生应聘

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类,booleanBoolean,charCharacter,byte...

    详解Java引用类型的参数也是值传递

    主要介绍了Java引用类型的参数也是值传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java中的值传递和引用传递

    当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递...  3、Strng比较特殊,它虽然是引用类型,但是却是值传递  通过一下例子来理解:  Student.java package com.tianjf; public cla

    Java中int与integer的区别(基本数据类型与引用数据类型)

     基本数据类型:变量名指向具体的数值引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值 2、从内存构建方面来说  基本数据类型:变量在声明之后java就会立刻分配给他内存空间  引用数据类型:

    JAVA程序员面试宝典

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    Java虚拟机(四)——Java引用对象4种类型

    引用类型是一个对象类型,引用类型的值是指向内存空间的引用,也就是地址,所指向的内存中保存着变量所表示的一个值或者一组值。 Java的4种引用类型: 他们分别是强引用(StrongReference),软引用(SoftReference),...

    C#类和接口、虚方法和抽象方法及值类型和引用类型的区别等等.........

    这里有好多比较好的资料,很适合正在学习Java和对Java想进一步了解的朋友. ... 一.C#类和接口、虚方法和抽象方法及值类型和引用类型的区别 二 .C#中 接口与抽象类 的区别 三.浅谈java封装思想 四.抽象类和接口的区别

    Java中值类型和引用类型的比较与问题解决

    主要给大家介绍了关于Java中值类型和引用类型的比较与问题解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    无法解析类型 java.util.Map$Entry。从必需的 .class 文件间接引用了它

    这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家

    java笔试题大汇总

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    125条常见的java面试笔试题大汇总

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    Java 自学宝典 第二章 数据类型

    基本数据类型和引用的缺省值 6 2. 1. 3. 字面量 7 2. 1. 4. 惊讶!让你的Java溢出 7 2. 1. 5. 显示默认初始值 8 2. 2. 布尔 9 2. 2. 1. java.lang.Boolean 9 2. 2. 2. 布尔字面量 10 2. 2. 3. 布尔变量 10 2. 2. 4....

    java的传值与传引用详解

     Java 方法的参数是简单类型的时候,是按值传递的 (pass by value)。这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void...

    史上最全Java面试题目大集合

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    JAVA_API1.6文档(中文)

    javax.management.openmbean 提供开放数据类型和 Open MBean 描述符类。 javax.management.relation 提供 Relation Service 的定义。 javax.management.remote 对 JMX MBean 服务器进行远程访问使用的接口。 ...

Global site tag (gtag.js) - Google Analytics