`

我对值传递与引用传递的理解

 
阅读更多
1.先浅谈java中存放的数值的方式:
第一种:将数值放到栈中
第二种:将数值放到堆中
这两种方式你可以再脑海中形成两个高楼大厦;
一座楼叫做栈,一座楼叫做堆
楼中的房子分别装着不同的数据


2.接着,讨论值传递
public class test1
{
//启动程序
public void static main(String args[]){
//定义一个变量a并赋予初始值
private int a=1;
//定义一个变量b
private int b=0;

b=100;
//将b赋值给a;
a=b;
//输出结果
System.out.println("a="+a);
System.out.println("b="+b);
}
}
结果为:a=100
              b=100
接着:做下面运算:
//将b赋值给a;
a=b;
之后添加如下:
//重新设置b的数值
b=10;

再看输出结果
结果为:a=100;
       b=10;


分析原因:
在运算过程中,先在栈中(栈楼房)开辟空间(房间1,将a存放的栈中,然后继续在栈中(栈楼房)开辟空间(房间2,存放1的数值,让a指向1,同样,在栈中(栈楼房)中开辟一个空间(房间3),存放b,再在栈中(栈楼房)中开辟一个新空间(房间4);
房间4先是存放默认数值0,当程序执行到b=100时,将b指向的房间里的数值变成100;
然后执行到a=b的时候,将房间4的数值拷贝给a所指向的房间里,这样a所指向的房间的数值也就变成了100;但是!这时候,a还是指向房间2,b还是指向房间4;只是他们指向的房间的数值恰好相等而已,所以第一次输出的结果都为100;
但是,当程序变成
b=100;
//将b赋值给a;
a=b;
b=10;

则是,a所指向的房价2的数值不变;但b所指向的房价4数值发生变换;但是这时候房间4和a没有直接关系,所以,a不会发出一个拷贝的命令,房间2的数值仍然是100;
所以,输出结果发生改变:
       a=100;
       b=10;


3.引用传递
//学生1的类
public class student1 {
	//学生的学号;   
	private int num;   
	//传入学生的学号   
	public void SetNum(int num){   
	this.num=num;   
	}   
	//得到学生的学号   
	public int GetNum(){   
	return num;   
	}  
}

//测试
public class test {

	public static void main(String args[]){   
		//创建一个学生1的对象   
		student1 zhangsan=new student1();   
		//创建另一个学生1的对象   
		student1 lisi=new student1();  
		

		  
		//传入学生1的学号   
		zhangsan.SetNum(1001);   
		//传入学生2的学号   
		lisi.SetNum(1002);   
		//输出结果   
		System.out.println("zhangsan的学号:"+zhangsan.GetNum());   
		System.out.println("lisi的学号:     "+lisi.GetNum());   
		  
		//引用传递;
		zhangsan=lisi;

		  
		  
		//lisi将学号更改一下   
		lisi.SetNum(1003);   
		//第一次检验结果   
		System.out.println("zhangsan的学号:"+zhangsan.GetNum());   
		System.out.println("lisi的学号:     "+lisi.GetNum());   
		  
		//zhangsan将学号变更一下   
		zhangsan.SetNum(1004);   
		//第二次查看结果   
		System.out.println("zhangsan的学号:"+zhangsan.GetNum());   
		System.out.println("lisi的学号:     "+lisi.GetNum());   
		}   

}
最后结果为:
zhangsan的学号:1001
lisi的学号:    1002
zhangsan的学号:1003
lisi的学号:    1003
zhangsan的学号:1004
lisi的学号:    1004

分析原因:
栈中(栈楼房):分别开辟了两个空间(房间),房间1住给了zhangsan,房间2住给了lisi
堆中(堆楼房):在使用new的关键字的时候,就开辟新的空间(房间),其中房间甲住的是一个num的变量,房间乙住的是另外一个num的变量,分别将房间1的张三指向了房价甲,房间2的指针指向了房间乙;
第一次输出:因为房间1和房间2互不相关,所以,给他们分别指向的房间里存放数值互不影响,输出了001,002
但是为什么后面两次输出结果都会变得相同了呢?
原因:在
//引用传递;
zhangsan=lisi;
这里面,将lisi的房间地址赋值给张三,现在他们是同一家人了;所以,这时候,在栈中,房间1和房间2都指向房间乙了,无论给zhangsan赋值还是给lisi赋值,其性质都是在改变堆中房间乙的数值,而房间甲就没有人理会了;
因此在后面输出的结果,都是相同的

以上就是我对值传递与引用传递的心得,欢迎大家来一起讨论

之前写的代码有大大的问题:
错误之处:我创建了一个student1和student2,然后分别生成了两个对象,这两个对象不能相等,就像,驴和马再怎么像,也不可能相同,只能是第一头驴和第二头驴有同学的部分
纠正:去掉student2的类和对象,都创建为student1的对象,这样才可能一起引用同一个方法
分享到:
评论

相关推荐

    Java:按值传递还是按引用传递详细解说

    ### Java中的按值传递与按引用传递详解 #### 一、引言 在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点...

    java值传递与引用传递

    因此,尽管看似是引用传递,但对`String`类型的处理结果与值传递类似。 总结来说,Java中的参数传递主要有以下特点: 1. 基本数据类型按值传递,函数内部无法改变实际参数的值。 2. 引用类型看似按引用传递,实际上...

    值传递和引用传递

    #### 四、值传递与引用传递的区别 - **数据类型**:值传递通常用于基本数据类型(如int、double等),而引用传递则用于对象类型(如类实例)。 - **内存分配**:值传递时,系统会为形参分配新的内存空间;而引用传递...

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    值传递与引用传递-内存解析

    与值传递不同,引用传递不创建参数值的副本,而是让函数直接访问原始变量。这样,函数对参数的任何操作都会反映到原始变量上。在C++中,引用是一个别名,它指向一个已存在的对象。在Python中,对象是通过引用传递的...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    面向对象语言中的值传递与引用传递

    面向对象编程语言中,参数传递主要有两种方式:值传递和引用传递。这两种方式在Java这样的语言中有着明显的区别,理解它们对于编写高效、无误的代码至关重要。 **值传递**: 值传递是Java中处理基本数据类型(如int...

    LabVIEW中引用的概念及在VI间传递值

    总结来说,理解并熟练运用LabVIEW中的引用和通过引用传递值是优化程序性能的关键。正确使用引用可以显著提高代码效率,减少内存占用,特别是在处理大量数据或需要实时更新的场景下。在实际项目中,应根据需求选择...

    C#笔记值传递和引用传递

    在C#编程语言中,了解值传递和引用传递的概念至关重要,因为这直接影响到函数...总的来说,理解和掌握值传递、引用传递以及C#中的构造函数、内存管理和控制流语句是C#编程的基础,这对于编写高效、可靠的代码至关重要。

    Delphi值传递和引用传递实例

    Delphi,作为一款基于Pascal语法的面向对象的编程环境,提供了两种主要的参数传递机制:值传递(ByValue)和引用传递(ByReference)。这两者在处理函数或方法的参数时有着显著的区别,对程序性能和数据安全有直接...

    第04章 面向对象(上) 08 值传递与引用传递

    本章节主要探讨的是在面向对象编程中一个重要的概念:值传递与引用传递。理解这两个概念对于编写高效、安全的Java程序至关重要。 值传递是指当函数或方法调用时,参数的副本被传入到函数内部。这意味着在函数内部对...

    java值传递和引用传递详解

    理解值传递和引用传递对于优化代码和避免意外的副作用至关重要。在编程时,需要根据实际需求选择合适的参数传递方式,确保代码的正确性和可维护性。对于基本类型,值传递可以防止方法内部的修改影响到外部;而对于...

    经典:值传递和引用传递.rar

    在编程语言中,值传递和引用传递是两个重要的概念,它们涉及到函数参数的处理方式,影响着代码的行为和性能。本教程将深入探讨这两种传递方式的差异和应用场景。 首先,让我们来理解“值传递”。在值传递中,当一个...

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 首先,我们来看值传递的理解。在Java中,当一个对象作为参数传递给方法时...

    Java语言中参数值传递和引用传递比较.pdf

    Java 语言中参数值传递和引用传递比较 Java 语言中参数值传递和引用传递是两种不同的参数传递...因此,在 Java 编程中,理解参数值传递和引用传递的区别是非常重要的,以便正确地使用参数传递方式,避免参数传递错误。

    Java是值传递,传对象引用也是通过值

    总的来说,理解Java中的值传递和对象引用传递对于编写高效、无误的代码至关重要。无论是基本类型还是对象类型,参数传递都是以值的形式进行,但对象类型的值是其引用,允许我们在方法内修改对象的状态,而不影响方法...

    C++单向按值传递(产生临时对象) 双向按引用传递(不产生临时对象不占任何内存).rar

    本资料主要探讨了两种常见的参数传递方式:按值传递(pass by value)和按引用传递(pass by reference)。下面将详细阐述这两种方法的特点以及它们在实际编程中的应用。 一、按值传递(Pass By Value) 按值传递是...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个主题的详细解释。 在Java中,所有的参数传递都是基于值的,但这涉及到一个...

Global site tag (gtag.js) - Google Analytics