thinking in java随手记1(记录页:)
访问控制的第一个存在原因就是让客户端程序员无法触及他们不应该触及的部分
第二个原因就是允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员
public protected 缺省 private
自己包自己类 √ √ √ √
自己包别的类 √ √ √
别的包别的继承类 √ √
别的包别的无继承类 √
Java SE5的重大变化之一就是增加了参数化类型,在Java中它称为泛型。一对尖括号,中间包含类型信息,通过这些特性就可以识别对泛型的使用。
对象的创建和生命周期
对象的数据位于何处?怎样控制对象的生命周期? C++认为效率控制是最重要的议题,所以给程序员提供了选择的权利。
为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序的时候确定,
这可以通过将对象置于堆栈(他们有时被称为自动变量或限域变量)或静态存储区域来实现,这种方式将存储空间分配和释放置于优先考虑的位置,某些情况下这样控制非常有价值。但是牺牲了灵活性,因为必须在 编写程序时撞到对象确切的数量、生命周期和类型
第二种方式是在被称为堆(heap)的内存池中动态地创建对象。
在这种方式中,直到运行时才知道需要多少对象,它们的生命周期如何,以及它们具体类型是什么.这些问题的答案只能在程序运行时相关代码被执行到的那一刻才能确定. 如果需要一个新对象,可以在需要的时刻直接在堆中创建。因为存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间。在堆栈中创建存储空间和是否存储空间通常各需要一条汇编指令即可,分别对应将栈顶指针向下移动和将栈顶指针向上移动
创建堆存储空间的时间依赖于存储机制的设计
动态方式有这样一个一般性的逻辑假设:对象趋向于变得复杂,所以查找和是否存储空间的开销不会对对象的创建造成重大冲击。动态方式所带来的更大的灵活性正是解决一般化编程问题的要点所在。
Java完全采用动态内存分配方式
对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁它
在堆上创建的对象,编译器就会对它的生命周期一无所知,像C++这样的语言,必须通过编程方式来确定何时销毁对象,这可能会因为不能正确处理而导致内存泄漏。
Java提供了被称为"垃圾回收器"的机制,它可以自动发现对象何时不再被使用,并继而销毁它。垃圾回收器非常有用,因为它减少了所必须的议题和必须编写的代码。更重要的是,垃圾回收器提供了更高层的保障,可以避免暗藏的内存泄漏问题,这个问题已经使许多C++项目折戟沉沙
Java的垃圾回收器被设计用来处理内存释放问题(不包含清理对象其他方面),垃圾回收器知道对象何时不再被使用,并自动释放对象占用的内存。这一点同所有对象都是继承自单根基类Object以及只能以一种方式创建对象(在堆上创建)这两个特性结合起来,使得用Java编程的过程较之使用C++编程要简单得多,所以做出的决策和要克服的障碍也要少得多。
异常处理:处理错误 P47
异常处理不是面向对象的特征--尽管在面向对象语言中异常常被表示成一个对象
异常处理在面向对象语言出现之前就已经存在了
并发编程