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中为什么只存在值传递(以传入自定义引用类型为例)的更多相关文章

  1. Java中不得不谈的值传递和地址传递

    个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... -------------- ...

  2. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  3. JAVA方法中参数到底是值传递还是引用传递

    当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...

  4. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

  5. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  6. 在C#的数据类型中,什么属于值类型,什么属于引用类型

    转自原文 在C#的数据类型中,什么属于值类型,什么属于引用类型 类型:整数,浮点数,高精度浮点数,布尔,字符,结构,枚举引用类型:对象(Object),字符串,类,接口,委托,数组除了值类型和引用类型 ...

  7. JAVA中char和String/值类型和引用类型的区别

    import java.util.*; class test { public static void main(String[] args) { char a[] = {'b', 'a', 'c'} ...

  8. Java的参数传递是「值传递」还是「引用传递」?

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...

  9. Java中Map根据键值(key)或者值(value)进行排序实现

    我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...

随机推荐

  1. 在linux上开启酸酸乳,未完待续

    在服务器调试深度学习环境的时候总需要下载conda的包,一直以来都觉得是因为国内访问慢,于是想在服务器上开 ,或者ssr.由于过去用ssr多一些,于是想了解ssr on linux. 1.首先win1 ...

  2. 『忘了再学』Shell基础 — 24、Shell正则表达式的使用

    目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...

  3. CSP 2021 总结

    CSP 2021 总结 PJ 开题顺序:1342 应该先做 T2 ,导致我 T2 直接看错 T1.T3 T1 :直接推规律即可,考场的想法应该正确 T3 :好家伙直接 map 走起 T2 最崩溃的来了 ...

  4. Linux文本搜索及截取操作

    Linux文本搜索及截取操作 cat 查看 grep 搜索 awk 截取 查看dna-server.xml 文件的内容 [root@localhost servers]# cat cwag9002/w ...

  5. ExtJS 布局-Auto布局(Auto Layout)

    更新记录 2022年5月30日 开启本篇 1.说明 auto布局是大部分容器默认的布局类型. auto布局通常是从上到下进行堆叠,auto布局不会设置子组件的宽度,默认与容器一样的宽度. 类似于HTM ...

  6. 『现学现忘』Docker基础 — 40、发布镜像到Docker Hub

    目录 1.准备工作 2.Docker登陆命令 3.Docker提交命令 4.总结: 5.补充:docker tag命令 1.准备工作 Docker Hub地址:https://hub.docker.c ...

  7. Java方法读取文件内容

    一.针对文件内容的读取,在平时的工作中想必是避免不了的操作,现在我将自己如何用java方法读取文件中内容总结如下:废话不多说,直接上代码: 1 public static void main(Stri ...

  8. MYSQL索引的建立、删除以及简单使用

    一.前期数据准备 1.建表 CREATE TABLE `user` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAUL ...

  9. 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 ...

  10. 密度峰值聚类算法原理+python实现

    ​ 密度峰值聚类(Density peaks clustering, DPC)来自Science上Clustering by fast search and find of density peaks ...