java中为什么只存在值传递(以传入自定义引用类型为例)
java中只有值传递
为什么这么说?两个例子:
public class Student {
int sage = 20;
String sname = "云胡不归";
public static void change(Student s1) {
s1.sname = "荀一";
s1.sage = 30;
System.out.println("-----------------------------------------------------------------");
System.out.println("change方法内 s1存储的堆空间地址 = " + s1);
System.out.println("修改时 s1.sname = " + s1.sname + " and s1.sage = " + s1.sage);
System.out.println("-----------------------------------------------------------------");
}
public static void main(String[] args) {
Student s = new Student();//此处的s是引用类型 实在栈空间开辟的一块空间,存储一个堆空内的地址 假设s指向堆空间的第一个Student对象
System.out.println("main方法内 s存储的堆空间地址 = " + s);
System.out.println("创建时 s.sname = " + s.sname + " and s.sage = " + s.sage);
change(s);//值传递的含义在于 将 s存储的地址复制一份 传入函数,使得函数内的形参s1存储地址和s相同 此时s1和s同时指向第一个Student对象
System.out.println("修改后 s.sname = " + s.sname + " and s.sage = " + s.sage);
}
}
//打印结果:
main方法内 s存储的堆空间地址 = com.iweb.test.Student@1b6d3586
创建时 s.sname = 云胡不归 and s.sage = 20
-----------------------------------------------------------------
change方法内 s1存储的堆空间地址 = com.iweb.test.Student@1b6d3586
修改时 s1.sname = 荀一 and s1.sage = 30
-----------------------------------------------------------------
修改后 s.sname = 荀一 and s.sage = 30
//上述打印结果的含义:在栈空间有两块空间存储着一模一样的堆内存地址 无论修改哪一个都会影响它们指向的Student对象的属性
//当然现在无法证明 栈空间是不是的确有两块空间存储着一模一样的堆内存地址 抑或是 只有一块栈内存,s1和s一起在用,因此引入下一个例子
在change方法中再加上一句s1 = new Student();
public class Student {
int sage = 20;
String sname = "云胡不归";
public static void change(Student s1) {
s1 = new Student();//使得栈空间s1存储一个新的堆内存地址 指向一个新的Student对象
s1.sname = "荀一";
s1.sage = 30;
System.out.println("-----------------------------------------------------------------");
System.out.println("change方法内 s1存储的堆空间地址 = " + s1);
System.out.println("修改时 s1.sname = " + s1.sname + " and s1.sage = " + s1.sage);
System.out.println("-----------------------------------------------------------------");
}
public static void main(String[] args) {
Student s = new Student();//此处的s是引用类型 实在栈空间开辟的一块空间,存储一个堆空内的地址 假设s指向堆空间的第一个Student对象
System.out.println("main方法内 s存储的堆空间地址 = " + s);
System.out.println("创建时 s.sname = " + s.sname + " and s.sage = " + s.sage);
change(s);//值传递的含义在于 将 s存储的地址复制一份 传入函数,使得函数内的形参s1存储地址和s相同 此时s1和s同时指向第一个Student对象
System.out.println("修改后 s.sname = " + s.sname + " and s.sage = " + s.sage);
}
}
//打印结果:
main方法内 s存储的堆空间地址 = com.iweb.test.Student@1b6d3586
创建时 s.sname = 云胡不归 and s.sage = 20
-----------------------------------------------------------------
change方法内 s1存储的堆空间地址 = com.iweb.test.Student@4554617c
修改时 s1.sname = 荀一 and s1.sage = 30
-----------------------------------------------------------------
修改后 s.sname = 云胡不归 and s.sage = 20
//修改了栈空间内s1中存储的地址后对s没有任何影响 由此可见 s1和s在栈空间内占据两块独立的空间
以上两个例子可以得出 引用类型传入change()方法的方式是值传递,是将地址复制了一份作为change()的参数
如果是引用传递 则 s1 和 s 应该是同一片栈空间 s1 = new Student()
后,相当于也进行了 s = new Student()
的操作 change(s)调用后,对象的属性依旧会被修改
java中为什么只存在值传递(以传入自定义引用类型为例)的更多相关文章
- Java中不得不谈的值传递和地址传递
个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... -------------- ...
- Java中传参的值传递和引用传递问题(转)
今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...
- JAVA方法中参数到底是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- 在C#的数据类型中,什么属于值类型,什么属于引用类型
转自原文 在C#的数据类型中,什么属于值类型,什么属于引用类型 类型:整数,浮点数,高精度浮点数,布尔,字符,结构,枚举引用类型:对象(Object),字符串,类,接口,委托,数组除了值类型和引用类型 ...
- JAVA中char和String/值类型和引用类型的区别
import java.util.*; class test { public static void main(String[] args) { char a[] = {'b', 'a', 'c'} ...
- Java的参数传递是「值传递」还是「引用传递」?
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...
- Java中Map根据键值(key)或者值(value)进行排序实现
我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...
随机推荐
- 在linux上开启酸酸乳,未完待续
在服务器调试深度学习环境的时候总需要下载conda的包,一直以来都觉得是因为国内访问慢,于是想在服务器上开 ,或者ssr.由于过去用ssr多一些,于是想了解ssr on linux. 1.首先win1 ...
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
- CSP 2021 总结
CSP 2021 总结 PJ 开题顺序:1342 应该先做 T2 ,导致我 T2 直接看错 T1.T3 T1 :直接推规律即可,考场的想法应该正确 T3 :好家伙直接 map 走起 T2 最崩溃的来了 ...
- Linux文本搜索及截取操作
Linux文本搜索及截取操作 cat 查看 grep 搜索 awk 截取 查看dna-server.xml 文件的内容 [root@localhost servers]# cat cwag9002/w ...
- ExtJS 布局-Auto布局(Auto Layout)
更新记录 2022年5月30日 开启本篇 1.说明 auto布局是大部分容器默认的布局类型. auto布局通常是从上到下进行堆叠,auto布局不会设置子组件的宽度,默认与容器一样的宽度. 类似于HTM ...
- 『现学现忘』Docker基础 — 40、发布镜像到Docker Hub
目录 1.准备工作 2.Docker登陆命令 3.Docker提交命令 4.总结: 5.补充:docker tag命令 1.准备工作 Docker Hub地址:https://hub.docker.c ...
- Java方法读取文件内容
一.针对文件内容的读取,在平时的工作中想必是避免不了的操作,现在我将自己如何用java方法读取文件中内容总结如下:废话不多说,直接上代码: 1 public static void main(Stri ...
- MYSQL索引的建立、删除以及简单使用
一.前期数据准备 1.建表 CREATE TABLE `user` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAUL ...
- NC24017 [USACO 2016 Jan S]Angry Cows
NC24017 [USACO 2016 Jan S]Angry Cows 题目 题目描述 Bessie the cow has designed what she thinks will be the ...
- 密度峰值聚类算法原理+python实现
密度峰值聚类(Density peaks clustering, DPC)来自Science上Clustering by fast search and find of density peaks ...