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. npm删除依赖包

    第一种办法删除全部依赖包 npm uninstall *( 删除指定的依赖包 npm uninstall xxx删除全局的指定依赖 npm uninstall xxx -gxxx为依赖名称)清缓存 n ...

  2. 第06组Alpha冲刺(3/6)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2.鲍凌函 3.曾丽莉 4. 曹兰英 5. 方梓涵 6.董翔云 7.杜筱 8.黄少丹 9. 詹鑫冰 10.吴沅静 1.3 冲刺成果展示 1.1 ...

  3. 存储器、I/O组织、微处理器

    重点知识 存储器的内部结构及访问方法 存储器分段以及存储器中的逻辑地址和物理地址 I/O端口组织及编址方式 时序和总线操作以及系统的工作方式和特点. 存储器组织 8086有20根地址线,可寻址的存储器 ...

  4. 关于spring整合mybatis

    第一步导入依赖 <dependencies> <dependency> <groupId>org.mybatis</groupId> <artif ...

  5. 关于python导入数据库excel数据时出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, severity 1的问题总结

    1.对于在使用python导入sqlsever时,出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, se ...

  6. JAVA学习之第一个HelloWorld程序

    第一个HelloWorld程序 第一步,创建java类型的文件 第二步,在创建文件的目录中打开cmd窗口 第三步,使用javac 命令将java文件编译为.class类型的字节码文件 第四步,使用ja ...

  7. C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  8. java类的学习

    什么是类: 类=属性+方法 属性来源于状态(以变量的形式存在):方法来源于动作: *属性对应的是数据,而数据只能存在变量中. 方法内的变量为局部变量:类体中的变量称为成员变量(也称为属性) java中 ...

  9. go int64传到前端导致溢出问题排查

    简介 ​ 开周会的时候一位同事分享了一个踩坑经验,说在go里面还好好的int64类型,到前端就变得奇奇怪怪了,和原来不一样了.正好我对前端javascript有一点点了解,然后连夜写了点代码探索了一下 ...

  10. Windows 通过本地计算机IP链接Mysql设置

    前言 1.Mysql-1130错误:无法远程连接 错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL se ...