`
showtime520
  • 浏览: 88729 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

关于JAVA中传值还是传引用的自我思考

    博客分类:
  • JAVA
阅读更多
最近一个朋友问起我一道这样的题目
public class Test{
    public static void change(String str){
         str="123";

    }

     public static void main(String[] args){
        String word="abc";
        change(word);
        System.out.println(word);
    }
}

这个输出的结果是什么?
我想了下,String是对象,word指向的是JVM中String常量池中"abc"对象,随口一答:123.
结果错了,回想起来这样的JAVA基础问题都回答了真是汗颜.
这几天仔细思考了下,把我这几天想的写下来,如果有错请大家拍砖.


要了解方法传参是传值还是传引用,我们首先要了解JAVA中对方法的处理过程:
当调用一个方法时,JAVA中会为这个方法专门开辟一个方法内存块,并实例化所有的局部变量(这就是局部变量能保证线程安全的本质所在).
而方法的传入参数则会以以下方式来处理,以上面例子来说明:
当上面的main方法调用chang(String str);函数时,程序实际上在做这样的事情:
1.change(word);
把"abc"引用传给change方法,change方法被JVM分配方法内存块
2.String str=word;
change方法内存快被开辟后,在栈中开辟一个str,"abc"的引用就被赋予入参str,这时可以明显的分析出word与str已经毫无关系
3.str="123";
这时候只是把str的引用指向了"123"

从这段分析可以得出我们想要的结果.

对于基本类型都是按值传递的,是值之间的COPY,所以答案显而一见.

但是对于对象类型的入参是怎么样呢?
 public class RefTest{
    public static void changeUser(User user){
      user=new User();
      user.setName("none");
    }
    public static void changeUserName(User user){
      user.setName("showtime");
    }

   public static void main(String[] args){
       User userMain=new User();
       userMain.setName("lan");
       changeUserName(userMain);
       System.out.println(userMain.getName());
       changeUser(userMain);
       System.out.println(userMain.getName());
    }
}

class User{
    private String name;
    public void setName(){
       this.name=name;
    }
    public String getName(){
       return this.name;
     }
}


读懂了上面的关于String的同学,我相信对于方法changeUser肯定会得出正确答案:不会更改对象.

但是对于changeUserName()这个方法会不会呢?
我们继续分析,

1.changeUser(user);
把user引用传给changeUser方法,change方法被JVM分配方法内存块
2.String str=word;
changeUser方法内存快被开辟后,在栈中开辟一个user,main方法中的userMain的引用就被赋予入参user
3.关键一步来了,user.setName("showtime");
第2步中说了把userMain对象的引用给了user,所以说当调用对象的方法的时候是起作用的,名字最后会被更改为showtime.



后记:这是第一次在JAVAEYE上发一个自己写的东西,先从容易的下手,呵呵,希望大家支持我,看完了记得顶我.我会给大家带来更多我的思考与经验.
分享到:
评论

相关推荐

    java中传值与传引用

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

    Java中的传值与传引用实现过程解析

    "Java中的传值与传引用实现过程解析" Java中的传值与传引用是Java编程语言中的一种基础概念,它们是Java函数中参数传递的两种方式。 Java中的传值是指函数参数的值被复制到函数内部,在函数内部对参数的修改不会...

    lotus domnio java代理传值

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

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

    虽然Java语言不直接支持引用传递,但由于所有对象都是通过引用访问的,所以在某种意义上,Java中的对象参数传递可以被认为是一种“引用传递”。当我们将对象传递给一个方法时,实际上是将该对象引用的副本传递给了...

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

    - **通过JSP表达式语言(EL)**:使用EL表达式,如 `${javaVariable}`,可以直接在JavaScript代码中引用JavaBean或作用域内的变量。 2. **JavaScript到Java的传值**: - **表单提交**:通过JavaScript修改表单字段的...

    java中页面传值的简单操作

    本文将详细讲解如何在Java中通过表单(Form)进行页面传值的简单操作。 首先,我们需要了解HTML中的表单元素。一个基本的表单通常由`<form>`标签定义,其中包含各种输入元素如`<input>`、`<textarea>`、`<select>`...

    Java SE程序 界面传值问题

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

    Java中引用类型传值的代码清单.pdf

    在Java编程语言中,引用类型变量实际上是对象的引用或指针,而非对象本身。当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1....

    浅谈Java中方法的参数传值.pdf

    在Java中,数据类型分为基本数据类型和引用数据类型。基本数据类型包括布尔型(boolean)、字节型(byte)、短整型(short)、整型(int)、长整型(long)、字符型(char)、单精度浮点型(float)、双精度浮点型...

    传值传名传地址.zip

    例如,在C++或Java等语言中,基本类型的参数传递就是传值。这种机制保证了函数内部的修改不会对外部环境产生副作用,但同时也意味着无法直接通过形参改变实参的值。 其次,**传名**(也称为传引用)的概念。在某些...

    struts2传值

    本文将深入探讨Struts2中两种不同的传值方式,并结合实例解析如何在JSP页面中使用Struts2标签进行数据访问。 首先,传值问题在Struts2中主要涉及到Action类和JSP页面之间的交互。在Action类中,有两种方式可以将值...

    java中的引用问题

    Java中的引用问题主要涉及到对象作为参数传递时的行为。在Java中,有两类数据类型:基本类型(如int、char)和引用类型(如类实例、数组)。对于基本类型,Java采用值传递的方式,而对于引用类型,则是传递引用的...

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

    引用传递类似于Java中的引用,但它不像Java那样创建引用副本,而是直接提供原始对象的别名。这意味着对引用参数的任何修改都会影响原始对象,如`ByRef`函数所示。指针传递则是传递对象地址,`ByPointer`函数通过解...

    42.传值和传引用.doc-综合文档

    这在一定程度上类似于引用传递,但程序员无法直接控制参数是传值还是传引用,LabVIEW会根据安全性优先、效率其次的原则自动决定。 为提高程序效率,LabVIEW程序员可以通过设计程序结构来引导LabVIEW识别哪些部分...

    android activityIntent 传值 传对象

    在Android开发中,Activity是应用程序的基本组件,Intent则充当了Activity之间通信的桥梁。当我们需要在不同的Activity之间传递数据时,Intent就起到了至关重要的作用。本文将深入探讨如何使用Intent在Activity之间...

    java 之方法调用 方法传参 值传递还是引用传递字节码

    本文将深入探讨Java中的方法调用、值传递与引用传递,并通过字节码分析来进一步理解这些概念。 首先,我们来看方法调用。在Java中,方法是一组完成特定任务的代码块,可以通过方法名来调用执行。方法调用的基本语法...

    Android NDK底层和java代码相互传值调用(实用经典Demo)

    例如,Java的`int`对应C/C++的`int32_t`,`long`对应`int64_t`,`float`和`double`保持不变,而字符串通常通过`char*`或`std::string`在C++中表示,Java中则使用`String`类。 2. **JNI接口定义** 要实现Java与C++...

    java中文传值乱码问题的解决方法

    Java中的中文乱码问题是一个常见的困扰开发者的问题,尤其是在进行数据传输和存储时。本文将详细介绍如何解决Java中文传值乱码的问题。 首先,我们需要理解乱码产生的原因。乱码通常发生在字符编码不一致的情况下,...

    简单的网页传值

    网页传值是Web开发中的基本操作,用于在不同的页面间传递数据,使用户的状态得以保持。本主题将深入探讨两种常见的方法:Cookie和Session。理解并掌握这两种技术对于构建动态和交互性强的网站至关重要。 首先,我们...

Global site tag (gtag.js) - Google Analytics