关于Java形参 值传递 深浅Copy

引言

对本题目的思考源于很早之前从C转到Java的时候,老师给我们讲形参 和 java的值的传递的时候还有面向对象时 传递的只是一个形参而已如果你在另一个方法改变传递的形参的值,对原来传递的值没有影响 当时用的基本参数 结果也可以看出。这和C和C++中的内存中的指针的传递还是有区别的。当时我也是受这句话影响颇深,后来在写算法题的时候 当我写到一道数据结构题 单向链条遍历的时候(用的递归) 我突然想到如果这种循环遍历的条件如果全部都是形参传递(值的复制传输)对内存的占用将是巨大的
在这里插入图片描述
每个点代表一个Node节点每一次递归调用都会复制nextNode节点之后的所以值如果这个对象稍微大点内存的占用将会成倍的增加。还有最重要的如果你对中间对某一个节点进行删除这对原来的单向链表是没有作用的因为你是对复制的值(形参)进行改变的,可是由结果得这显然是对单向链表是有影响的,所以由此我基本可以推论当时老师说的是有问题的。所以我当时就开始了实验

基本变量

八大基本变量 short int long float double char boolean byte
我们通过方法改变他们的值,基本变量的值是有固定的地点的。
int a是声明 a是个基本变量的名字他的值为4字节的值为1的内存
int b=1; int c=1;他们指向的全部为不同的地址 比如在创建对象的时候无论你有没有对基础类型赋值它都会有默认的值,这个值会在这个对象里占据相应的字节数。
所以我们对内存地址不同的两个值进行改变这是无法同步的。

自定义对象

除基本类型外的所有类型全部为自定义对象
自定义对象的 User u1=new User(); User u2=new User();他们是不同的两片地址 new的含义就是去申请一片内存 =号的含义就是让u1指向申请这片内存在方法的调用中 如果我们传递的值为一个自定义对象 test(u1)我们同样传递的也是内存地址将u1声明的值(u1的指向的内存地址传过去)同样java会复制一个声明去接这片内存 test的实现{ u.setName }我们对复制的这个引用进行方法调用 这片内存就会被改变 那么原来传进来的u1会不会被改变 答案是明显的是会被改变的。为什么会这样那 先别懵
首先对象并不会存值 他只会将声明存下来他并不会去存这个值。比如说你改变了User他基础类型的值 他只会改变他的这个声明的指向。在对象实例中你可以将 一个数据例如 Object a 或者 int b 他会由三部分组成一个为这个数据的名字,一个为他的类型,一个为他的值或者引用(Vaule)。 对于自定义对象类型他的Vaule为一个内存区域的引用 而对于基础类型 Vaule部分就为他的值

String Integer特别的自定义变量

String 和 Integer在某种意义上来说已经属于一种基本类型,因为真的是太常用太常用了。为什么常用就要把他们俩向基础变量改变呐 因为你可以看到所有的基础变量都有一个规则那就是重复值的使用 实际的开发中会省太多的内存空间了 比如1000个1的值才占4字节。而String的底层是Char类型的数据你不可能说每个String都占不一样的地址把 String太常用 太常用而且占的空间也不小。所有让他们偏向基础类型 在=号的情况下 会先检查有没有相同的String值 相同的值会有相同的指向 你可以去看JVM=申请的时候和New申请的时候所放在的内存区域都是不一样的。

以上的结果验证

有时间的可以自己去试一试,最不想的就是下班了还要敲代码。上班的地方又没网
重要: 所有的自定义对象到最后都是基础变量的叠加(重要! 重要!)
在这里插入图片描述

##结果延伸 深浅Copy
比如说你想Copy一份相同的对象 你直接通过get方法去获得这是没有问题的 然后你set给另一个你new出来的值
dog d=new dog();
int age=1;
Uset u1=new User(d,1) ;
Uset u2=new User(u1.getAnimal(),u1.getAge()) ;
u2是u1的Copy某种意义上说是对的但是在比较深层次的意义上是错误的因为他们的Animal还是同一个对象 这种就属于浅Copy他并非是真正意义上的Copy而深Copy 当你把 Uset u2=new User(new dog(u1.getAnimal().getName()),u1.getAge()) ; 当你把u1.getAnimal()换为new dog(u1.getAnimal().getName())这种程度上就是深Copy了他把复制的粒度已经到了基本类型这就叫深Copy 因为以上讲解的基本类型的特性你就可以明白了 精确到基础类型就可以让复制的对象和原来的对象完全独立开了。同样也可以印证以上的 重要: 所有的自定义对象到最后都是基础变量的叠加(重要! 重要!)
还有就是如果所有空间到最后都是基本类型的叠加哪将会省多少内存空间呐?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值