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. 目标检测复习之Loss Functions 总结

    Loss Functions 总结 损失函数分类: 回归损失函数(Regression loss), 分类损失函数(Classification loss) Regression loss funct ...

  2. Netty是什么,Netty为什么速度这么快,线程模型分析

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,现在下着大雨看来是去 ...

  3. Mac下iTerm2安装rzsz后上传下载失败解决

    背景描述 mac环境,安装了iTerm2,需要使用ssh登陆linux服务器.服务器登陆需要经过以下步骤 输入token 输入登陆选项 输入IP 因此写了expect脚本来完成自动输入 但是在上传下载 ...

  4. 使用JavaCV实现读取视频信息及自动截取封面图

    概述 最近在对之前写的一个 Spring Boot 的视频网站项目做功能完善,需要利用 FFmpeg 实现读取视频信息和自动截图的功能,查阅资料后发现网上这部分的内容非常少,于是就有了这篇文章. 视频 ...

  5. 6大优势、2种类型,一文吃透动态应用安全测试(DAST)

    在在上篇文章中中,我们了解了 SAST 的概念.优劣和使用的工具,并在文章里提到了另一个软件安全领域里的重要技术 DAST.本文将会详细介绍 DAST 的概念.重要性及其工作原理.   DAST(Dy ...

  6. 12.web基础与HTTP协议

    web基础与HTTP协议 目录 web基础与HTTP协议 web基础 域名概述 HTML概述 HTML基本标签 HTML语法规则 HTML文件结构 头标签中常用标签 内容标签中常用标签 静态网页与动态 ...

  7. JS:构造函数

    定义:在JavaScript中,用new关键字来调用的函数,称为构造函数,构造函数首字母一般大写. 理解: 构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象. 创建对象, ...

  8. 剖析 SPI 在 Spring 中的应用

    vivo 互联网服务器团队 - Ma Jian 一.概述 SPI(Service Provider Interface),是Java内置的一种服务提供发现机制,可以用来提高框架的扩展性,主要用于框架的 ...

  9. Apache ShardingSphere 5.1.2 发布|全新驱动 API + 云原生部署,打造高性能数据网关

    在 Apache ShardingSphere 5.1.1 发布后,ShardingSphere 合并了来自全球的团队或个人的累计 1028 个 PR,为大家带来 5.1.2 新版本.该版本在功能.性 ...

  10. Python基础学习笔记_01

    Python的介绍 1989年圣诞节创造,1991年正真出生,目前更新到3.0版本 具有最庞大的"代码库",人称"胶水语言",无所不能 一种跨平台的计算机程序设 ...