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”变量就无所谓了
相关推荐
3. **修改参数值**:在 `invoke` 方法内部,可以获取到方法的参数列表,并对其进行修改。 #### 三、代码示例 下面通过具体的代码示例来演示整个过程: ```java package org.amigo.proxy; public interface ...
然而,如果需要在`connect`中传递参数,通常的标准语法不支持直接传参。下面我们将详细讨论两种解决方法来解决这个问题。 **方法一:使用槽函数的默认参数** 在C++中,槽函数可以拥有默认参数。这样,即使信号没有...
在给出的`changeName`方法中,虽然传递的是`Car`对象`c`的引用副本,但对`cnCar.name`的修改会影响到`main`方法中`C.name`的值,因为它们都指向同一个`Car`实例。 总结起来,Java中的参数传递机制遵循以下规则: 1....
本篇文章将深入探讨JNI中参数传递的基本数据类型、自定义对象以及系统对象。 一、基本数据类型的参数传递 在JNI中,基本数据类型如int、float、char等的传递相对简单。Java中的基本类型在C/C++中都有对应的类型。...
而在`third(v)`中,再次为局部变量`v`分配新对象,与`TestValue`类中的`third()`方法类似,对新`v`的修改同样不会影响到类属性的`v`。 这里涉及到几个关键知识点: - **对象引用传递**:Java中参数传递总是按引用...
3. **处理逻辑内修改**:如果修改参数的逻辑比较单一,也可以选择在具体处理请求的方法中,先读取原始参数,修改后再进行后续操作。但这种方法通常不推荐,因为它打破了请求的封装性,可能导致代码难以维护。 篡改...
- **按引用传递**:对于对象参数,则是传递对象的引用,因此方法内部对对象的任何修改都会影响到原始对象。 #### 三、对象的方法调用 对象不仅拥有属性,还拥有与其相关的行为,即方法。方法是用来实现特定功能的...
在函数内部对`temp`的任何操作(如调用`set`方法修改其内容)只会影响到这个临时副本,不会改变传入的对象`a`的状态。因此,当我们调用`input(a)`后,可以看到原对象`a`的值并未改变。 #### 二、对象引用做参数(传...
默认情况下,对象参数是按引用传递的,这意味着在函数或方法内部对对象的修改会影响到原始对象。例如: ```delphi procedure ModifyObject(AObj: TMyClass); begin AObj.Property := NewValue; end; var MyObj: ...
在这个方法中,我们可以对Request和Response对象进行操作。以下是一个简单的Filter示例: ```java public class ParameterModifyFilter implements Filter { @Override public void init(FilterConfig ...
这意味着,方法中对数组的修改将会影响原数组。在 Java 中,所有对象都是通过引用进行操作的,而数组也是一种对象。当把数组作为参数传递给方法时,传递的实际上就是数组对象的引用。 Java 可变参数是指在方法中...
这意味着方法内部对参数的修改不会影响到原始数据。例如: ```java public class ValuePassExample { public static void main(String[] args) { int x = 10; changeValue(x); System.out.println("x after ...
- 方法内部对参数对象的任何改变都会反映到方法外部,因为它们都指向同一块内存区域。 - `t3` 方法中,数组 `arr` 的地址被传递,所以在方法内部修改 `array[0]` 的值后,外部的 `arr[0]` 也会随之改变,因此输出...
5. 使用`const`关键字来防止函数内部无意修改参数。 通过仔细检查代码,理解和遵循MFC中对象生命周期的规则,以及合理地使用指针和引用,你可以避免这种参数莫名变空的问题。对于MFC开发人员来说,深入理解这些概念...
本文将深入探讨Java中的引用类型及其如何影响方法参数的传递机制。通过具体实例,我们将揭示值类型与引用类型之间的差异,并解释在实际编程过程中可能遇到的一些常见困惑。 #### 二、Java的数据类型 Java语言支持两...
Java方法参数传递机制是指在Java中,方法调用时传递参数的机制。参数传递机制可以分为两种:值传递和引用传递。 值传递是指基本数据类型的参数传递,值传递的体现是数值的传递。在值传递中,方法调用时传递的参数值...
总结来说,Java中的方法参数传递涉及到值传递(对于基本类型)和对象引用的值传递(对于对象类型)。理解这些概念有助于编写更高效、可维护的代码。在实践中,要注意区分对象状态的修改和对象引用的改变,以及如何...
本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递。在编程中,当我们调用一个函数或方法时,我们可以向其提供一些值,...
因此,方法内对`instance.Value`的修改会直接影响到`myInstance`对象。 了解并熟练掌握参数传递机制对于编写高效、无误的WinForm应用至关重要。通过分析提供的源码,开发者可以深入理解如何在实践中运用这些概念,...
Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。...因此,当在方法中处理对象参数时,必须谨慎操作,因为任何对对象属性的修改都会直接影响到原始对象。