Java面向对象杂谈二

    1)对象存储位置

    堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。编译器不需要知道存储的数据在堆里存货多长时间。在堆里分配存储有很大的灵活性。只需通过new关键字,会自动在堆里进行存储分配,也要付出响应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。

 

    2)基本类型

    Java要确定每种基本类型所占存储空间的大小。它们的大小并不像其他大多数语言一样随机器硬件架构变化而变化。这种所占存储空间大小的不变性是Java程序比用其他大多数语言编写的程序更具有可移植性的原因之一。

 

    3)永远不需要销毁对象

    在大多数程序设计语言中,变量生命周期的概念,占据了程序设计工作中非常重要的部分。变量需要存活多长时间?如果需要销毁对象,那什么时刻进行呢?变量生命周期的混乱往往会导致大量的bug。

    Java对象不具备和基本类型一样的生命周期。由new创建的对象,只要你需要,就会一直保留下去。这样许多C++编程问题在Java中就消失了。在C++中,你不仅必须要确保对象的保留时间与你需要这些对象的时间一样长,而且还必须在你使用完它们之后,将其销毁。

    如果Java对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是C++里可能会发生的问题,这也是Java神奇之所在。Java垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。也就是说,你根本不必担心内存回收的问题,你只需要创建对象,一旦不再需要,它们就会自动消失,这样就消除了这类编程问题(“内存泄漏”),这是由于程序员忘记释放内存而产生的问题。

    不过,”垃圾回收“ 不一定会发生,如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

 

    4)方法重载

    将人类语言中存在细微差别的概念 “映射” 到程序设计语言中时,问题随之而生。在日常生活中,相同的词可以表达多种不同的含义-----它们被 “重载” 了。有些编程语言要求为每个方法都提供一个独一无二的标识符。要是对明显相同的概念使用了不同的名字,那一定会让人很郁闷,好在有了方法重载,可以使用相同的名字。

    区分重载方法:每个重载的方法都必须有一个独一无二的参数类型列表

 

    5)默认构造器

    要是你没有提供任何构造器,编译器会认为 “你需要一个构造器,让我给你制造一个吧”,但假如你已经写了一个构造器,编译器则会认为 “啊,你已写了一个构造器,所以你知道自己在做什么,你是刻意省略了默认构造器” 。

 

    6)finalize方法

    之所以要有finalize方法,是由于在分配内存时可能采用了C语言中的做法,而非Java中的通常做法,这种情况主要发生在使用 “本地方法” 的情况下。在非Java代码中,也许会调用C的malloc函数来分配存储空间,而且除非调用了free函数,否则存储空间将得不到释放,从而造成内存泄漏。当然,free是C和C++中的函数,所以需要在finalize中用本地方法调用它。

 

     7)Java的堆

     在堆上分配对象的代价是很高昂的,垃圾回收器对于提高对象的分配速度,却有明显的效果。存储空间的释放竟然会影响存储空间的分配,但这确实是Java虚拟机的工作方式。

    把C++里的堆想象成一个院子,里面每个对象都是负责管理自己的地盘。一段时间后,对象可能被销毁,但地盘必须加以重用。在某些Java虚拟机中,堆的实现截然不同:它更像一个传送带,每分配一个新对象,它就往前移动一格,这意味着对象存储空间的分配速度非常快。Java的 “堆指针” 只是简单的移动到尚未分配的区域,其效率比得上C++在堆栈上分配空间的效率。当然,实际过程中在簿记工作方面还有少量的额外开销,但比不上查找可用空间的开销大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值