Java中对象的引用

来源:互联网 发布:淘宝店铺街入口 编辑:程序博客网 时间:2024/05/21 21:55

对象的使用

对象引用

java中,一切都被看做是对象,而操作一个对象,需要使用对象的引用,好比遥控器控制空调一般。引用是可以单独存在的:

String  s;

这里创建了一个引用s,但是并没有关联对象,下面创建引用的同时并初始化:

String  s=”hello,world”;

使用new关键字,创建一个新的引用,并关联对象:

String  s= new String(“hello,world”);


存储位置

²  寄存器:在处理器的内部,不能直接控制,数量有限,根据需求分配。

²  堆栈:位于通用RAM(随即访问存储器),堆栈指针向下移动,分配新的内存,堆栈指针向上移动,释放内存,java程序必须知道存储在堆栈中的所有项的确切生命周期。

²  堆:一种通用的内存池,存放java的所有对象。

²  常量存储:存储在程序代码内部,这样比较安全,在嵌入系统开发时,常量本身和其他部分隔离

²  非RAM存储:不受程序控制


基本类型

Java中的基本数据类型可以直接创建变量,他们所占内存空间大小是不变的,这也是为什么java语言更具有移植性的原因:

Booleancharbyteintlongfloatdoublevoid


高精度数字

BigInteger:支持任意精度的整数,可以准确的表示任意大小的整数值,不会丢失信息。

BigDecimal:支持任意精度的定点数,可以进行精准的货币计算。


Java中的数组

Java中的数组初始化之后,会确保不能访问到数组范围之外的内容,数组的每个元素都有严格的下标控制,数组是属于引用类型,可以使用关键字null,表示该数组的引用没有关联任何对象。


垃圾回收概念

Java有一个垃圾回收器,会监控使用new创建的对象,并会分辨出哪些对象不会再被引用,进而销毁释放内存空间。


引用类型:类

类就是用来描述类的对象的外观和行为,只有使用new关键字后,数据的存储空间才会被分配,方法才可以被外部使用。


static关键字

当一个声明的变量或方法使用static修饰的时候,那说明这个事物不会和这个类的任何实例对象之间相互关联,可以直接使用这个类来调用。

publicclass Demo1 {

   publicstatic void main(String[] args) {

      Hello h = new Hello();

      System.out.print(Hello.i+";");

      System.out.print(++Hello.i+";");

      System.out.print(Hello.i+";");

      System.out.print(h.i);

   }

}

class Hello{

   staticint i = 3;

}

3;4;4;4

Java对象的四种引用

在Java中对象的引用被分为4种级别,程序可以更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。


强引用-StrongReference

如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机即使抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来释放内存。


软引用-SoftReference

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中


弱引用-WeakReference

只具有弱引用的对象拥有更短暂的生命周期。垃圾回收器线程扫描内存区域的过程中,一旦发现了只具有弱引用的对象,都会回收它的内存。垃圾回收器是一个优先级很低的线程,扫描速度很慢弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。


虚引用-PhantomReference

“虚引用”作用十分小,与其他几种引用都不同,虚引用并不会决定对象的生命周期。虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

publicclass Demo2 {

   publicstatic void main(String[] args) {

      ReferenceQueue queue = new ReferenceQueue();

      PhantomReference pr = new PhantomReference(new Object(),queue);

   }

}


通过判断引用队列中是否已经加入了虚引用,知道被引用的对象是否快被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前执行这个对象的所有操作。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果4s照片不能拍照黑屏怎么办 美图手机开机键坏了怎么办 金立金刚二手机烧卡怎么办 金立金刚手机开不开机怎么办 小米4手机拆机信号不好怎么办 荣耀自带游览器无法正常打开怎么办 苹果4s电池越来越不耐用怎么办 苹果4s电池不耐用了怎么办 苹果手机4s电池不耐用怎么办 红米4s电池不耐用怎么办 32位app私密相册打不开怎么办 红米手机取卡针断手机里了怎么办 我差评了客服打电话骂我怎么办 顺丰快递在预计时间没有回来怎么办 同款商品比京东便宜怎么办 京东自营不支持7天退货怎么办 天猫买了一个月的电动车坏了怎么办 发票号码和机打号码不一致怎么办 交电费的本子弄丢了怎么办 快递正在派件中发现地址错了怎么办 快递当天送达当天签收还算延怎么办 深圳国税公众号预约取号公司怎么办 社保买了停了2年怎么办 qq号被冻结申请不回来了怎么办 qq号被冻结 手机密保忘了怎么办 微信账号封了2天怎么办 买qq号被申诉找回了怎么办 收到了京东白条的催款通知单怎么办 成都买房社保不够两年怎么办18年 电话号码给人设置成骚扰电话怎么办 找不到领导电话不接短信不回怎么办 微信账号被别人手机号冻结了怎么办 微信冻结了手机号也让人换了怎么办 顺丰快递拒收退回丢件了怎么办 京东买东西快递电话没有听到怎么办 在京东购物自己电话号输错了怎么办 北京房子卖了户口没地方迁怎么办 微信弄丢了微信密码找不到了怎么办 微信背人用过找不到密码怎么办 超市的微信支付宝收付款怎么办 办理联华超市的会员储蓄卡怎么办