Java基础之何为引用类型

何为引用类型

一般人都会笼统的说除了基本类型就是引用类型,但是好像也没有说出什么才是引用类型,只是利用基本类型反推一下就是引用类型。

  • 其实我们可以发现一般的引用类型都需要new对象,而且每new一个对象它都是独一无二的,因为它存放的特殊内存(堆)中
String s = new String("string");

其实这是一般化的,也是最简单的。

  • 其中就有个String、Integer等不按常理出牌,像
String s = "string";
Integer i = 200;

其实这样定义变量时,看起来好像就是基本变量的样子,不要被现象所迷惑,这是因为说到底它们的类型是类,所以它们自诞生之时就已经带上了主角光环,它们就是引用类型。而且如果有标识符的声明下次使用时直接使用标识符。其实它们都存储在常量池里面,下面会讲到,其实这就是位置决定一切,思想格局决定境界。

  • 而有些同学就提出疑问了,那
"string"

也是引用类型呀,这连类型都没有给,你怎么能说它是引用类型,其实呀这种用法也只能在局部变量中用用,在成员变量的位置你弄个这,啥意思都解释不清楚。我们可以将这个简单的理解为是一个匿名的字符串类型。它存放在常量池中,jdk1.7之后,常量池在堆中,之前都在方法区中。

其实在这里我们就要引出一个“常量池”这其实是程序为了缓解内存的一种机制,即就是将一些常用的字符或者数字放在常量池里面,就不必让多个相同的常量new多次,也就不用占用堆内存。

其实在使用"string"时先会在常量池里面找,如果存在,就直接使用,如果不存在那么就给常量池里面放一个,而且自始至终都没有new对象,也没有在堆中额外的开辟空间。但是这里的"string"字符串没有标识符所以只能用一次。

  • 又有同学会问不是说在局部位置时,变量必须赋初始值才能使用吗?

为什么String s = new String();直接输出s可以运行呐?

其实呀这是因为String()构造方法已经帮你做了初始化赋值。只不过就是一个"“而已,这也要注意一下null和”"是不一样的哦。

 public String() {
        this.value = "".value;
    }
  • 常量池中还有其它的一些缓存
类型缓存范围
Byte、Short、Integer、Long-128~127
Character0~127
BooleanTRUE、FALSE
String

那么为什么这些可以有缓存而向float/double等就没有缓存了尼,其实呀,String有一个特点就是不能修改即该类是final修饰的,这就为它能够在缓存中有一定的地位奠定了基础。

一般什么放在缓存中:

  • 不可变的(即final修饰的),确定的------->也就是我们所说的常量
  • 常用的,即使用频繁的----->复用性,省空间(缓解内存)

回过头来,我们看一下float以及double我们会发现他们呀有很多的不确定性,2.0和2.01一样吗?

感悟

其实说白了,就是存储的位置,决定了其是否为引用类型。

思考:有基本类型为什么还需要引用类型?

这是因为java程序是面向对象的编程语言,而基本类型,只是简单的存储了一个值而已,在调用时由于不是对象所以就不能被封装等,而且类型之间的转换太过于暴露和强制,而不是通过调用方法,在多态中更是不能使用,这就增加了代码的复杂程度。同时我们都知道集合中只允许存储引用类型,所以就不得不需要一个引用类型的基本类型,其实呀,我们知道java语言中还有一个多态,那就是泛型,这个也只能是引用类型。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值