`
zhengyu
  • 浏览: 4723 次
  • 性别: Icon_minigender_1
  • 来自: 潮州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

传值与传引用的理解

阅读更多
例子代码
public class ParaTest {

	protected int intNum = 0;//栈A

	public static void main(String[] args) {
		ParaTest pt=new ParaTest();//对像A
		
		
		pt.change(pt.intNum);
		System.out.println("change int "+pt.intNum);(1)
		
		pt.change(pt);
		System.out.println("change pt.int "+pt.intNum);(2)
		
		pt.add(pt.intNum);
		System.out.println("add pt "+pt.intNum);(3)
		
		pt.add(pt);
		System.out.println("add pt "+pt.intNum);(4)
		
	}

	public void change(int i) {栈B
		i = 5;//	(5)
	}

	public void change(ParaTest t) {
             ParaTest tmp = new ParaTest();//对像B
	    tmp.intNum = 9;
	    t = tmp;
             System.out.println("change pt.int inner"+t.intNum);(6)
	}

	public void add(int i) {栈C
		i += 10;//(7)

	}
	
	public void add(ParaTest pt){
	    pt.intNum+=20;
             System.out.println("change pt.int inner"+t.intNum);(8) 
	}

}

呵呵...今晚看这个例子时,朋友说你要理解原理的话,不管题目怎么变,你依然能看出是传了值还是传了引用...
先看看参数为ParaTest的两个方法
public void change(ParaTest t) {
		ParaTest tmp = new ParaTest();//对像B
		tmp.intNum = 9;
		t = tmp;

}
public void add(ParaTest pt){
		pt.intNum+=20;
}


    调用change(ParaTest t)方法后,方法外部传入的引用变量 pt 中的intNum的值还是没变的.因为执行main这个方法时,main方法所有的东西都存在一个栈中.这个栈中有一格是存放 pt 这个变量的指针的..pt 的指针指内堆中的new ParaTest()对像.即main方法中第一行代码里新建的 ParaTest()对像.

    当在main 中调用change(ParaTest t)时,又会出现一个栈是存放这个方法体中的所有东西,在change(ParaTest t)方法中的栈有一格是存放了传入参数t的指针,也有一格是存放了tmp变量的指针,tmp的指针指向的是change(ParaTest t)中新建的ParaTest对像,跟传入参数t的指针所指的不是同一个对像.

    当执行t=tmp;这条语句时,tmp的指针会复盖掉t的指针,此时 t 的指针将指向change(ParaTest t)方法中第一行代码所新建的那个B对像.由于对像B的intNum的值已经被赋值成9.所以代码中(6)这句打印时,出来的t.intNum的结果是9.因为(6)的打印语句中的 t 指的是对像B.在(2)这句打印语句中 pt 指的对像是对像A.因为A的intNum值没变改变,所以打印出来结果是0.而在add(ParaTest pt)由于pt的指针是一直指向对像A的.即在add(ParaTest pt)中, pt 这个变量没被重新赋值,所以pt.intNum值改变时,对像A的intNum值也跟着改变.打印语句(4)的打印结果是20.

	public void change(int i) {//栈B
		i = 5;	//(5)
	}

	public void add(int i) {//栈C
		i += 10;  //(6)

	}

    change(int i)与add(int i)这两个方法由于传的都是基本类型,JAVA中基本类型参都是传值的.基本类型在堆中有并没有相应的对像.在执行change(int i)与add(int i)方法时,都会各自产生一个栈,栈里都有一格是用来存放参数变量,即栈B,与栈C.所以,无论是类的全局变量栈A,或方法中的局部变量栈B,栈C,它们都在自已所属的栈中占有一个独立的位置,所以代码(5)跟(6)的操作,并不会改变栈A的值,所以(1)跟(3)处打印出来pt.intNum的值还是0.如果在change(int i)与add(int i)这两个方法中打印出i的值的话,则会是5跟10.

    到这里终于对传值还是传引用明白多了.呵呵,不知道别人能看明白我这篇东西不?文彩不好,请见谅了... 睡觉
0
0
分享到:
评论

相关推荐

    java中传值与传引用

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

    C++传值调用与引用调用区别实例代码

    ### C++中的传值调用与引用调用 在C++编程语言中,函数调用是一种常见的编程结构,用于执行特定任务或计算结果。当一个函数被调用时,可以通过不同的方式传递参数,其中最常见的是传值(call by value)和传引用(call...

    引用类型传值方法

    在编程领域,我们经常需要处理各种数据类型,其中包括值...理解和熟练掌握引用类型的传值机制,对于编写高效、安全的代码至关重要。在实际开发中,根据需求选择合适的类型和传值方式,可以有效地优化性能和降低错误率。

    php传值和传引用的区别点总结

    在PHP编程中,理解变量的传值和传引用是非常重要的概念,它们决定了函数内部操作对原始变量的影响。下面我们将详细探讨这两个概念的区别、工作原理以及优缺点。 **1. PHP传值** 当一个变量作为参数传递给函数时,...

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

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

    JAVA中传值与引用问题

    本文将深入探讨Java中的传值与传引用问题,并通过具体的例子来解析其中的原理。 #### 二、基础知识回顾 在Java中,所有的数据类型可以分为两大类:基本类型(如int, double等)和引用类型(如Object, String等)。...

    python基础入门教程:传参是传值还是传引用.pdf

    Python中的参数传递并非简单的"传值"或"传引用",而是一种特殊的机制,通常被称为"传对象引用"。这意味着,当你将一个变量作为参数传递给函数时,实际上是传递了这个变量所引用的对象的引用,而不是对象的副本。 ...

    java的传值与传值后的改变

    理解Java中的传值与传引用对于编写正确且预期的行为代码至关重要。在编写函数时,应清楚地知道参数如何被传递,以及这将如何影响函数的可读性和行为。在实际编程中,合理运用这些知识能帮助避免许多常见的错误和困惑...

    Java是传值还是传址引用

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

    传值和传引用-综合文档

    与传值不同,传引用是将变量的地址,而非其值,传递给函数。这意味着函数可以直接操作原始变量,而不是其副本。在LabVIEW中,如果一个VI接受的是一个引用类型的数据,如数组或簇,那么它实际上是在操作这些数据的...

    深入理解JavaScript中的传值与传引用

    JavaScript中的传值与传引用是理解函数参数传递的关键,它涉及到数据类型的处理方式。在JavaScript中,主要有两种数据类型:基本类型(Primitive Types)和引用类型(Reference Types)。基本类型包括undefined、...

    23.Java对象作为参数传递是传值还是传引用1

    首先,我们需要理解Java中的引用概念。当创建一个对象,如`StringBuffer sb = new StringBuffer("Hello ");`,我们实际上是创建了一个新的对象,并为变量`sb`分配了一个内存地址,这个地址指向了新创建的对象。这个...

    传值与传地址[文].pdf

    在编程语言中,传值与传地址是两种不同的参数传递方式。Java 作为一门面向对象的语言,对于简单类型和对象类型的处理方式有所不同。本文将详细解释这两种类型在Java中的传递机制。 1. 简单类型(按值传递) Java中...

    浅析Java方法传值和传引用问题

    在Java编程语言中,方法参数传递机制涉及到两个主要概念:传值和传引用。了解这两个概念对于编写高效、可靠的代码至关重要。本篇文章将深入探讨Java中的方法传值和传引用问题。 首先,让我们理解什么是传值。在Java...

    vue prop属性传值与传引用示例

    本文将深入探讨 Vue prop 的属性传值与传引用,并提供一个实际的示例来帮助理解。 首先,我们要明确 `prop` 的数据类型决定了它是如何传递的。Vue 有五种基本类型的 `prop`: 1. **字符串(String)** 2. **数字...

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

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

    传值传名传地址.zip

    总结起来,理解传值、传名(或传引用)和传地址的异同是编程基础的重要组成部分。它们影响着函数的可读性、效率以及程序的行为。在编写代码时,根据具体需求选择合适的参数传递方式,是提升代码质量的关键。

    通过5个php实例细致说明传值与传引用的区别

    在PHP编程语言中,理解变量传值和传引用的区别对于写出高效和正确的代码是非常关键的。传值和传引用在程序执行过程中的行为有所不同,这主要体现在变量之间传递数据时,对原变量的影响程度上。 首先,我们来看传值...

Global site tag (gtag.js) - Google Analytics