博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java编程细节总结(三):深入了解引用类
阅读量:3916 次
发布时间:2019-05-23

本文共 1384 字,大约阅读时间需要 4 分钟。

导读:

              引用类是java中一个很抽象的一个概念,很多人因为对于引用类基本都是实操,但是对于基础理论,底层原理都是一窍不通的。比如说,为什么明明我们都赋值了,但是出现程序错误?实例化是什么?实例化在jvm中是什么样一样的存在?接下来请看本文。


一、引用类

            在说引用类之前,我们都知道java类型可以分成两大类型——值类型和引用类。值类型就是八种基本数据类型int,long等这些,而引用类就是以基本类型为基础进行延伸的——除了变量以外的所有类型称为引用类型

             下面我们看一个引用类型的例子

//另起一个class类名为Tepublic class Te {	    public String name;	    public int age;}public class six {	public static void main(String[] args) {		Te a = new Te();//Te实例化后对象传给a		Te b = a;//Te建一个对象b去引用a的地址		a.name = "a";		b.name = "b";		System.out.println(a.name);				a = null;		System.out.println(a.name);}}

你们猜一下第一个输出的是什么? 是a还是b呢?如果选a的小伙伴,那就说明还没有值覆盖的概念,什么叫值覆盖呢?首先看下面这个图。

第一个输出:

我们都知道,name没有赋值时候是null,age是0。这两个都是Te类的两个公共属性值,这个就说明了只要实例化了Te类就可以调用Te的方法和域。Te的对象a和b引用均放在栈里,当Te实例化后放在堆中,属性值均放在堆中。

现在b获得了a的地址,当b.name赋值时,a.name也应该被改变。因为a和b都是引用同一个地址的属性值,而a本身是赋值给name的,当程序读到输出前b赋值给name,由于两个对象都是引用同一个地址的属性值,所以a的值会被b赋的值覆盖。

第二个输出

第二个相信很多人看了图后都知道输出什么了,是的程序报错。

如图

原因其实很简单,a本身是有一个指向new Te()的指针,现在a=null就意味着指针也就是引用的地址被置空,就没有了图中这根线,相当于断了,所以说输出a.name其实是不可能的。那么举一反三,猜想一下,输出b.name可能吗?答案,是完全没有影响的,还是能正常输出。

 

二、Integer类

java中有一个拥有着引用类的值类型Integer,为什么叫引用类的值类型呢?首先Integer是由int类封装的承,但是与int类不同就是Integer是一种引用类,也叫复杂类型,r所以如果Integer没有设值,那就是null,int不能够new int,但是Integer可以new Intege。现在,Integer这么与众不同,在堆和栈是怎么一个位置安排呢?

如,Integer a= new Integer(15);

依然没有任何影响,很合理的一个引用类在堆中的创建,但是Integer赋值15是放在堆里还是栈里呢??

这里,需要把Integer类特殊化处理,他的本质是int封装过来的,所以赋值的时候是赋值给本身的,而不是引用地址的值。

所以可以说15值赋给本身的,所以值在栈中,而不是在堆中。

 

转载地址:http://ljtrn.baihongyu.com/

你可能感兴趣的文章
网络安全逐渐成为程序员的必备技能
查看>>
统信发布UOS V20 进军个人市场 生态日益完善
查看>>
【追加功能】OFFICE插件管理工具重整后再上路,更好用易用。
查看>>
BeetleX框架详解-小结
查看>>
打造钉钉事件分发平台之钉钉审批等事件处理
查看>>
2020 中国开源年会(COSCon'20)再启程:开源向善(Open Source for Good)
查看>>
拥抱.NET 5,从自研微服务框架开始
查看>>
开源特训营 - Lesson 4 - 如何运营社区
查看>>
C# 中的 is 真的是越来越强大,越来越语义化
查看>>
简单理解CAP-BASE
查看>>
gRPC-微服务间通信实践
查看>>
Firefox 18周岁
查看>>
IdentityServer4系列 | 初识基础知识点
查看>>
为什么我们总是「习惯性辩解」?
查看>>
.NET 异步解说
查看>>
Magicodes.IE 2.4发布
查看>>
程序员修神之路--它可能是分布式系统中最重要的枢纽
查看>>
如何理解Eating这个词?云原生与微服务专场介绍
查看>>
诊断日志知多少 | DiagnosticSource 在.NET上的应用
查看>>
Chrome正在启用HTTP/3,支持IETF QUIC
查看>>