`

方法中对传入参数的修改对参数对象的影响

 
阅读更多

 

public class Test{
	public static void main(String[] arg){
		Person aaaaaaaaaaaaa = new Person();
		change(aaaaaaaaaaaaa);
	}
	
	public static void change(Person p)
	{
		p.name = "mao";
	}
}

public class Person{
	String name;
}

 对上面Test编译产生如下java指令

 

 

Classfile /F:/Test.class
  Last modified 2017-5-26; size 419 bytes
  MD5 checksum b3b57626cd3396f8e3ce811d3b6a54ee
  Compiled from "Test.java"
public class Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #8.#19         // java/lang/Object."<init>":()V
   #2 = Class              #20            // Person
   #3 = Methodref          #2.#19         // Person."<init>":()V
   #4 = Methodref          #7.#21         // Test.change:(LPerson;)V
   #5 = String             #22            // mao
   #6 = Fieldref           #2.#23         // Person.name:Ljava/lang/String;
   #7 = Class              #24            // Test
   #8 = Class              #25            // java/lang/Object
   #9 = Utf8               <init>
  #10 = Utf8               ()V
  #11 = Utf8               Code
  #12 = Utf8               LineNumberTable
  #13 = Utf8               main
  #14 = Utf8               ([Ljava/lang/String;)V
  #15 = Utf8               change
  #16 = Utf8               (LPerson;)V
  #17 = Utf8               SourceFile
  #18 = Utf8               Test.java
  #19 = NameAndType        #9:#10         // "<init>":()V
  #20 = Utf8               Person
  #21 = NameAndType        #15:#16        // change:(LPerson;)V
  #22 = Utf8               mao
  #23 = NameAndType        #26:#27        // name:Ljava/lang/String;
  #24 = Utf8               Test
  #25 = Utf8               java/lang/Object
  #26 = Utf8               name
  #27 = Utf8               Ljava/lang/String;
{
  public Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>
":()V
         4: return
      LineNumberTable:
        line 1: 0
		
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: new           #2                  // class Person
         3: dup
         4: invokespecial #3                  // Method Person."<init>":()V
         7: astore_1
         8: aload_1
         9: invokestatic  #4                  // Method change:(LPerson;)V
        12: return
      LineNumberTable:
        line 3: 0
        line 4: 8
        line 5: 12

  public static void change(Person);
    descriptor: (LPerson;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: ldc           #5                  // String mao
         3: putfield      #6                  // Field Person.name:Ljava/lang/St
ring;
         6: return
      LineNumberTable:
        line 9: 0
        line 10: 6
}

 第一:我们看不到任何的“aaaaaaaaa”变量名的影子,因为这个变量其实就是一个内存地址,变量名是为了程序员好操作这块地址,而任何对这个地址存储数据的操作编译器都能找到对应地址。

 

第二:astore_1表示将栈顶引用型数值存入第二个本地变量,aload_1意思是将第二个引用类型本地变量推送至栈顶,也就是把存在第二个本地变量中的指向堆中新建Person对象的地址放到栈顶,change方法第一个指令就是aload_0(将第一个引用类型变量置于栈顶),所以change方法中的p.name="mao"就是修改堆中的新建person对象,main方法中的变量“aaaaaaaaa”指向同一个对象就受影响

但是如果change方法内是p = new Person()那就是方法的第一个引用类型变量指向另一个person对象,main中的“aaaaaaaa”变量就无所谓了

分享到:
评论

相关推荐

    AOP修改方法的参数

    3. **修改参数值**:在 `invoke` 方法内部,可以获取到方法的参数列表,并对其进行修改。 #### 三、代码示例 下面通过具体的代码示例来演示整个过程: ```java package org.amigo.proxy; public interface ...

    Qt中connect函数不能传递参数的两种解决方法 - aRooooooba的博客 - CSDN博客1

    然而,如果需要在`connect`中传递参数,通常的标准语法不支持直接传参。下面我们将详细讨论两种解决方法来解决这个问题。 **方法一:使用槽函数的默认参数** 在C++中,槽函数可以拥有默认参数。这样,即使信号没有...

    走进Java中方法的参数传递.pdf

    在给出的`changeName`方法中,虽然传递的是`Car`对象`c`的引用副本,但对`cnCar.name`的修改会影响到`main`方法中`C.name`的值,因为它们都指向同一个`Car`实例。 总结起来,Java中的参数传递机制遵循以下规则: 1....

    JNI 参数传递 Android 自定义对象

    本篇文章将深入探讨JNI中参数传递的基本数据类型、自定义对象以及系统对象。 一、基本数据类型的参数传递 在JNI中,基本数据类型如int、float、char等的传递相对简单。Java中的基本类型在C/C++中都有对应的类型。...

    JAVA编程:要领调用传对象参数

    而在`third(v)`中,再次为局部变量`v`分配新对象,与`TestValue`类中的`third()`方法类似,对新`v`的修改同样不会影响到类属性的`v`。 这里涉及到几个关键知识点: - **对象引用传递**:Java中参数传递总是按引用...

    java修改请求参数

    3. **处理逻辑内修改**:如果修改参数的逻辑比较单一,也可以选择在具体处理请求的方法中,先读取原始参数,修改后再进行后续操作。但这种方法通常不推荐,因为它打破了请求的封装性,可能导致代码难以维护。 篡改...

    对参数 对象的理解方法

    - **按引用传递**:对于对象参数,则是传递对象的引用,因此方法内部对对象的任何修改都会影响到原始对象。 #### 三、对象的方法调用 对象不仅拥有属性,还拥有与其相关的行为,即方法。方法是用来实现特定功能的...

    对象作为函数参数

    在函数内部对`temp`的任何操作(如调用`set`方法修改其内容)只会影响到这个临时副本,不会改变传入的对象`a`的状态。因此,当我们调用`input(a)`后,可以看到原对象`a`的值并未改变。 #### 二、对象引用做参数(传...

    delphi对象参数调用

    默认情况下,对象参数是按引用传递的,这意味着在函数或方法内部对对象的修改会影响到原始对象。例如: ```delphi procedure ModifyObject(AObj: TMyClass); begin AObj.Property := NewValue; end; var MyObj: ...

    java web 修改request携带的参数信息

    在这个方法中,我们可以对Request和Response对象进行操作。以下是一个简单的Filter示例: ```java public class ParameterModifyFilter implements Filter { @Override public void init(FilterConfig ...

    Java数组传递及可变参数操作实例详解

    这意味着,方法中对数组的修改将会影响原数组。在 Java 中,所有对象都是通过引用进行操作的,而数组也是一种对象。当把数组作为参数传递给方法时,传递的实际上就是数组对象的引用。 Java 可变参数是指在方法中...

    java参数的传递与返回值

    这意味着方法内部对参数的修改不会影响到原始数据。例如: ```java public class ValuePassExample { public static void main(String[] args) { int x = 10; changeValue(x); System.out.println("x after ...

    java语言中的参数传递

    - 方法内部对参数对象的任何改变都会反映到方法外部,因为它们都指向同一块内存区域。 - `t3` 方法中,数组 `arr` 的地址被传递,所以在方法内部修改 `array[0]` 的值后,外部的 `arr[0]` 也会随之改变,因此输出...

    为什么传递进来的参数会自动变为空的?

    5. 使用`const`关键字来防止函数内部无意修改参数。 通过仔细检查代码,理解和遵循MFC中对象生命周期的规则,以及合理地使用指针和引用,你可以避免这种参数莫名变空的问题。对于MFC开发人员来说,深入理解这些概念...

    浅析Java引用类型和方法参数传递

    本文将深入探讨Java中的引用类型及其如何影响方法参数的传递机制。通过具体实例,我们将揭示值类型与引用类型之间的差异,并解释在实际编程过程中可能遇到的一些常见困惑。 #### 二、Java的数据类型 Java语言支持两...

    Java方法参数传递机制原理解析

    Java方法参数传递机制是指在Java中,方法调用时传递参数的机制。参数传递机制可以分为两种:值传递和引用传递。 值传递是指基本数据类型的参数传递,值传递的体现是数值的传递。在值传递中,方法调用时传递的参数值...

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

    总结来说,Java中的方法参数传递涉及到值传递(对于基本类型)和对象引用的值传递(对于对象类型)。理解这些概念有助于编写更高效、可维护的代码。在实践中,要注意区分对象状态的修改和对象引用的改变,以及如何...

    参数传递的总结——构造函数

    本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递。在编程中,当我们调用一个函数或方法时,我们可以向其提供一些值,...

    winform 方法参数的引用传递源码

    因此,方法内对`instance.Value`的修改会直接影响到`myInstance`对象。 了解并熟练掌握参数传递机制对于编写高效、无误的WinForm应用至关重要。通过分析提供的源码,开发者可以深入理解如何在实践中运用这些概念,...

    Java参数传递PPT

    Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。...因此,当在方法中处理对象参数时,必须谨慎操作,因为任何对对象属性的修改都会直接影响到原始对象。

Global site tag (gtag.js) - Google Analytics