第二章一切皆是对象

1.存储位置。

程序运行时,对象是如何放置安排 内存如何分配

1)寄存器 这是最快的存储区,位于处理器内部,不能直接控制。

2)堆栈 位于通用RAM(随机访问存储器),通过指针可以通过指针操作。java创建程序时系统必须知道堆栈内所有确切生命周期,限制了灵活性。所以虽然java某些数据存于堆栈中但是java对象不储存于其中。

3)堆 一种通用的内存池(也位于RAM)用于存放java对象。编译器不需要知道存储的数据在堆里存活多长时间,因此具有很大的灵活性,当需要对象时,只需要new一个。

4)常量存储 通常存放在代码内部

5)非RAM存储 流对象和持久化对象

2.基本类型

boolean char int short long float double void byte、

3对象的作用域

java的对象不具备和基本类型一样的生命周期。当用new创建一个java对象时,它可以存活于作用域之外。由new创建的对象,只要你需要可以一直保留下去。

例如 String s = new String(“whatever”);

引用s在作用域终点就消失了。然而s指向的String对象会继续存在占据内存空间。

java处理这些对象的方法正是垃圾回收器,用来监视用new创建的所有对象,并辨别那些不在被引用的对象。释放哪些对象的内存空间。

static关键字

通常来说创建类的时候不会直接创建类里的对象,除非用new创建类的对象,执行new时,数据存储空间才被分配。

但是如果想为特定域分配存储空间而不考虑究竟要创造多少对象,甚至是不创建对象。或者不创建对象就无法调用方法。

static可以满足这两方面的需要,声明一个事务是static就可以。

第五章初始化与清理

构造器是创建对象时被自动调用的特殊方法,java除了构造器还额外加入了垃圾回收器。对于不在使用的内存资源,垃圾回收器能自动将其释放。

可以假想为编写的每个类都定义一个initialize()方法。该方法的名称提醒你在使用其对象之前,应先调用initialize()。这意味者用户必须记得自己去调用此方法。 在java中创建对象时如果其类具有构造器,java就会在用户有能力操作对象前自动调用相应的构造器。

class Rock {Rock(){System.out.println("Rock");}
}
public class ConstructorTest {public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Rock();}}
}

现在在创建对象new Rock()时,将会为对象分配存储空间,并调用相应的构造器。构造器的名称必须与类名完全相同 。

不接受任何参数的构造器叫做默认构造器。构造器可以带参可以重载。重载可以根据参数列表和返回值进行区分,甚至参数列表的顺序不同也可以,不过一般不这么做。

当创建一个新对象时,会调用其默认构造器,如果你已经定义了一个构造器,编译器就不会自动创建一个默认构造器。

static关键字

在static方法内部不能调用非静态方法,反过来是可以的,可以不创建类对象直接调用static方法

,在类中置入static方法就可以访问其他static方法和static域。

终结处理和垃圾回收

java垃圾回收期负责回收无用对象占据的内存资源。但是如果你的对象不是new出来的,由于java垃圾回收器只知道释放哪些new分配的内存,所以无法回收这种不是new出来的对象。为了应对这种情况java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

另外只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。如果程序执行结束,并且垃圾回收期一直都没有释放你创建的任何对象存储空间,则随着程序的推出,哪些资源也会全部交还给操作系统。因为垃圾回收本身也有开销,如果不使用他,就不必支付这部分开销了。

1.对象可能不被垃圾回收。

2.垃圾回收不等于“析构”。

3.垃圾回收只与内存有关。

垃圾回收器如何工作

在通常语言中在堆上分配对象的代价十分高昂·,然而垃圾回收其对于对象的创建速度却有明显的提高效果。

比如可以把c++的堆想象成一个院子,里面每个对象都负责管理自己的地盘,一段时间以后对象可能被销毁,但地盘必须加以重用。在某些java虚拟机中,堆的实现截然不同,它更像一个传送带,每分配一个新对象就向前移动一格。这意味这分配的速度会非常的快,而指针只是简单的移动到尚未分配的区域。而当创建了足够多的对象后,垃圾回收器会开始介入,当它工作时将一边清理对象,一边使堆中的对象紧密排列。这样堆指针就很容易移动到更靠近“传送带”开始处。

引用记数是一种简单但速度很慢的垃圾回收技术。每个对象含有一个引用计数器,引用时计数+1当离开作用域或被置为null时引用记数-1.当发现某个对象引用记数为0时会释放其占用的空间。但是这样有一个问题如果对象之间存在循环引用,可能会出现对象应该吧被回收,但引用计数却不为0的情况。对垃圾回收器而言定位这样的情况需要的资源极大。

在一种更快的模式中,垃圾回收器并非基于引用技术。它们依据的思想是对任何“活”的对象一定能追溯到其存活在堆栈或静态存储区之中的引用。遍历所有的引用。知道发现所有根源与堆栈和静态存储区的引用所形成的网络全部被访问为止。

寻找的方式取决于不同java虚拟机的实现。有一种名为停止-复制。 先暂停程序的运行,然后将当前存活的对象全部复制到另一个堆,没有被复制的全部是垃圾。当对象被复制到新堆时它们是一个挨着一个的,所以新堆表示紧凑队列。然后就可以继续分配新空间了。

程序进入稳定状态后,可能只会产生少量垃圾,甚至没有垃圾。如果这样的情况下复制式仍然会将所有内存复制到另一处,资源浪费。所以一些Java虚拟机会例行检查:要是没有新垃圾产生,就会转换到另一种工作模式(即“自适应”)这种模式称为标记-清扫。工作方式同样是从栈堆和静态存储区出发,便利所有的引用,找出所有存活的对象,就会给对象一个标记。当标记工作全部完成后清理动作才会开始。将没有标记的全部释放,所以栈会变成不连续的。

不同等级访问权限

访问权限 private default protected public
同一包中的同一类
同一包中的不同类
不同包的子类
不同包的所有类

初始化及类的加载

因为java中所有的事物都是对象。每个类的编译代码都存在于他自己的独立的文件中。该文件只有需要使用程序代码时才被加载。也就是说通常加载发生于创建类的第一个对象之时。但是当访问static域或static方法时,也会发生加载。 也就是static对象和代码都会在加载时根据程序中的顺序进行初始化。定义为static的对象只会被初始化一次。

java编程思想实用整理相关推荐

  1. 《Java编程思想》读书笔记(二)

    三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...

  2. 关于阅读java编程思想和effective java的一些看法

    个人认为,java编程思想并不适合当作新手入门书籍来看,它更多是像给已经使用过java的人群对于基础的一些查缺补漏,有点像一本大部头的工具书,目前该书已看至第十章 -- 内部类, 而effective ...

  3. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  4. 为什么我会弃Java,选择了Kotlin——专访《Java编程思想》作者 Bruce Eckel

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 多少语言就是死在了取代Java的路上 Java:我活着的意义就是天天被取代 Java:我也不 ...

  5. 《Java编程思想》读书笔记

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十八章的内容,这一次 ...

  6. Java编程思想学习笔记4 - 序列化技术

    今天来学习下Java序列化和反序列化技术,笔者对<Java编程思想>中的内容,结合网上各位前辈的帖子进行了整理和补充,包括: 序列化概述 Java原生序列化技术 Hessian序列化技术 ...

  7. Java编程思想翻译勘误

    总的来说,Java编程思想是一本好书:但是因为译者可能不懂计算机,很多地方都有严重错误. 之前和朋友抱怨过,朋友提议抱怨无用不如干点实事.遂决定边看边将自己找到的翻译错误贴出来,希望能给别人一些帮助. ...

  8. Java编程思想 第四版 读书笔记巩固基础,完善知识框架。

    Java编程思想读书笔记 此笔记仅仅是作者的阅读此书时,发现自己错误认识和不牢固的知识,用来完善作者的知识框架,其列出重点不具有参考性,代码也是为了省工作量,简写代码,能看懂即可,语法并不规范 第一章 ...

  9. 编程不适合12小时工作制,“我有灵感才工作” | 专访《Java编程思想》作者Bruce Eckel...

    整理 | 蔡芳芳 采访 | 王一鹏.蔡芳芳 本文转载自公众号infoQ 编者按: 如果你是一个 Java 开发者,那你想必读过或至少听过<Java 编程思想>(Thinking in Ja ...

最新文章

  1. 将一个数组中的字符串用指定字符分割开,分别放到另一个数组中
  2. 百度新key申请步骤
  3. MyBatis的逆向工程工具,自动生成数据库对应的POJO实体类、mapper接口、增删改查mapper.xml文件
  4. 上学吧在线计算机考试中心题库,上学吧考试题库
  5. lwip-1.4.1文档rawapi中文翻译
  6. GMCM2017-前景目标提取
  7. 2021SC@SDUSC Zxing开源代码(四)QR码的编码(一)
  8. NVIDIA Jetson TK1学习与开发——手动刷机
  9. Linux编程技术总结
  10. 用apktool反编译,修改添加smali文, 再打包apk遇到的64k问题的解决方法 Unsigned short value out of range: 65536
  11. acill排序 java_java – 如何根据ascii值对ArrayList的元素进行排序?
  12. pycharm调试时出现十分缓慢,变量数据没法预览的解决方法
  13. 格式化SD卡工具e2fsprogs嵌入式版本制作
  14. 酒吧管理系统如何选择
  15. 机顶盒显示无服务器,电视机顶盒无信号是什么原因 电视机顶盒无信号解决方法...
  16. linux服务器网站安全狗安装教程
  17. 在c语言中1和0的意思,C语言里的0x0和0x1是什么意思啊
  18. 数据库管理 第3关:授权1
  19. 中小型企业选择云计算服务模型,需要慎重啊
  20. 达内培训python好吗_达内Python学员真实感悟

热门文章

  1. 我想爱,想吃,还想在一瞬间变成天上半明半暗的云。
  2. 高盛、亚马逊资深工程师:知识图谱技术与应用
  3. netapp3210存储更换故障硬盘过程
  4. 饭卡管理程序c语言代码,C++ 简单饭卡管理系统
  5. CEO采访:从战略层面建立数据驱动型的客户体验策略
  6. 如何用SQL求众数和中位数
  7. 年终盘点丨2022边缘计算大事记
  8. SpringBoot 之 分分钟搞懂Lombok使用与原理
  9. Markdown学习规划
  10. 网络搜索引擎的工作原理