`

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

 
阅读更多
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中的值传递和引用传递

     引用传递的特点:方法内部对传进去的参数作的改变也会影响方法外部的变量的值  那么哪些是值传递,哪些是引用传递呢?  1、基本类型(8种)的传递都是值传递  2、引用类型(除String外)都是引用传递 ...

    深入理解python中函数传递参数是值传递还是引用传递

    如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能 直接修改原始对象...

    深入理解JavaScript的值传递和引用传递

    值得注意的是还有另外三种类型: Array、Function和Object,它们通过引用来传递。从底层技术上看,它们三都是对象。 基本数据类型 如果一个基本的数据类型绑定到某个变量,我们可以认为该变量包含这个基本数据类型的...

    为什么Java只有值传递

    我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:是指在调用函数时将实际参数的地址直接...

    值类型和引用类型的区别

    引用类型变量的Equals比较的是二者的引用地址而不是内部的值,值类型变量的Equals方法比较的是二者的值而不是……哦对了,值类型压根儿没有引用地址; • 值类型不能作为其它任何类型的基类型,因此不能向值类型中...

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

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

    C#中按引用传递与按值传递的区别,以及ref与out关键字的用法详解

    理解形参和实参的引用传递关系;熟悉引用参数和输出参数的使用。using System;class Class1 { //x,y,z是形参,按值传递 static void Sort(int x, int y, int z) { int temp=0; if(x>y) { temp=x; x

    深入理解JavaScript 参数按值传递

    定义 ECMAScript中所有函数的参数都是按值传递的。 什么是按值传递呢? 也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。 按值传递 举个简单的例子: ...引用传递 拷

    理解C#中参数的值和引用以及传递结构和类引用的区别

    在 C# 中,既可以通过值也可以通过引用传递参数。在调用环境中通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更改。若要通过引用传递参数,请使用 ref 或 out 关键字...

    JavaScript传递变量: 值传递?引用传递?

    如何理解? 代码如下: var x = y = 1; y = 2; alert(x); x的值为多少? 代码如下: var obj = {}; var sub = {}; sub[‘id’] = 3; obj[‘sub’] = sub; sub[‘id’] = 4; alert(obj[‘sub’][‘id’]&#...

    Java值传递的一些理解 1

    1.栈内存:主要存放函数中定义的基本类型变量,对象的引用 2.堆内存:主要存放由new 创建的对象和数组,Java垃圾回收器回收这部分内容 3.方法区内存:主要

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

    为什么 Java 只有值传递,但 C++ 既有值传递,又有引用传递呢?今天我们就来探讨下这个问题,有需要的朋友可以参考下

    Java是值传递还是引用传递

    首先写一个简便的Employee,以便测试使用。 class Employee { ...  然后写一个函数,传入一个Emplyee对象,修改name,如果函数执行完毕原来的employee的name值发生变化,按照我们的理解,会认为是引用

    Java零基础-参数传递-1.md

    理解基本类型和引用类型在参数传递过程中的特点和区别。 掌握如何在方法中修改形参对实参的影响。 了解参数传递的常见误区和问题。 阅读建议: 建议读者在阅读前已对Java语法有基本的了解,包括方法的定义、调用和...

    Java零基础-参数传递-2.md

    理解基本类型和引用类型在参数传递过程中的特点和区别。 掌握可变参数的使用方法。 熟悉Java方法中返回值的定义和使用。 了解参数传递的常见误区和问题。 阅读建议: 建议读者在阅读前对Java语法有基本的了解,包括...

    函数调用的信息传递

    传值调用,传址调用,引用调用。让你深刻理解函数调用的信息传递

Global site tag (gtag.js) - Google Analytics