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里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论...事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解,至于称作按什么传递就不是个大问题了。
引用传递的特点:方法内部对传进去的参数作的改变也会影响方法外部的变量的值 那么哪些是值传递,哪些是引用传递呢? 1、基本类型(8种)的传递都是值传递 2、引用类型(除String外)都是引用传递 ...
如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能 直接修改原始对象...
值得注意的是还有另外三种类型: Array、Function和Object,它们通过引用来传递。从底层技术上看,它们三都是对象。 基本数据类型 如果一个基本的数据类型绑定到某个变量,我们可以认为该变量包含这个基本数据类型的...
我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:是指在调用函数时将实际参数的地址直接...
引用类型变量的Equals比较的是二者的引用地址而不是内部的值,值类型变量的Equals方法比较的是二者的值而不是……哦对了,值类型压根儿没有引用地址; • 值类型不能作为其它任何类型的基类型,因此不能向值类型中...
java及C++中传值传递、引用传递和指针方式的理解.docx
理解形参和实参的引用传递关系;熟悉引用参数和输出参数的使用。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
定义 ECMAScript中所有函数的参数都是按值传递的。 什么是按值传递呢? 也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。 按值传递 举个简单的例子: ...引用传递 拷
在 C# 中,既可以通过值也可以通过引用传递参数。在调用环境中通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更改。若要通过引用传递参数,请使用 ref 或 out 关键字...
如何理解? 代码如下: 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’]&#...
1.栈内存:主要存放函数中定义的基本类型变量,对象的引用 2.堆内存:主要存放由new 创建的对象和数组,Java垃圾回收器回收这部分内容 3.方法区内存:主要
为什么 Java 只有值传递,但 C++ 既有值传递,又有引用传递呢?今天我们就来探讨下这个问题,有需要的朋友可以参考下
首先写一个简便的Employee,以便测试使用。 class Employee { ... 然后写一个函数,传入一个Emplyee对象,修改name,如果函数执行完毕原来的employee的name值发生变化,按照我们的理解,会认为是引用
理解基本类型和引用类型在参数传递过程中的特点和区别。 掌握如何在方法中修改形参对实参的影响。 了解参数传递的常见误区和问题。 阅读建议: 建议读者在阅读前已对Java语法有基本的了解,包括方法的定义、调用和...
理解基本类型和引用类型在参数传递过程中的特点和区别。 掌握可变参数的使用方法。 熟悉Java方法中返回值的定义和使用。 了解参数传递的常见误区和问题。 阅读建议: 建议读者在阅读前对Java语法有基本的了解,包括...
传值调用,传址调用,引用调用。让你深刻理解函数调用的信息传递