Java
Java 基础
《Java 编程思想》
Java 进阶
《Effective Java》 《Java并发编程-设计原则与模式》 《设计模式》 《重构》
相关资源 Java资源大全中文版 极客学院Wiki Java
对象
Java 的对象是通过引用来访问的。 数据存储位置
- 寄存器,位于处理器内部,Java 程序中感知不到寄存器的存在
- 堆栈,通过堆栈指针访问,对象引用位于堆栈中,基本类型也存放在堆栈中
- 堆,存放所有 Java 对象
- 常量存储,常量值存放在程序代码内部,不会被改变。保存在已编译的 .class 文件中,存放基本类型和对象型的常量值。还包括文本形式出现的符合引用。
- 非 RAM 存储
基本类型
存放在堆栈,数值类型都有正负,有对应的包装器类。高精度数字没有对应的基本类型。
数组
使用前必须初始化,有范围检查。一个数组对象,实际是一个引用数组。
Java 不需要 sizeof,因为类型占用的大小在所有机器上都是一样的
finalize
- 对象可能不被垃圾回收
- 垃圾回收不等于析构
- 垃圾回收只与内存有关
判断使用组合还是继承的方法是:是否需要向上转型
final 数据
使用前必须初始化,初始化后不可改变值。
final 参数
不能在方法中更改参数引用指向的对象。
final 方法
锁住方法,防止继承类修改方法的含义,不会被覆盖。早期Java实现中,声明为final的方法编译器会把针对方法的调用转化为内嵌调用。“关闭”动态绑定。
final 关键字
类中的private方法都隐式的指定为final
final 类
final类中不允许被继承
类初始化顺序
基类static->子类static->基类成员变量->基类构造函数->子类成员变量->子类构造函数
构造器是隐式声明static
使用内部类的原因是:每个内部类都能独立的继承自一个(接口的)实现,所以无论外围类是否已经继承了某个接口的实现,对应内部类都没有影响。
回调
回调的一个好处是decouple。 客户端只需要关心业务(比如匿名内部类的具体实现)而不用再关心一些资源的连接释放什么的,这些交给平台类中的模板方法。
回调实质上是指一个类尽管实际上实现了某种功能,但是没有直接提供相应的接口,客户类可以通过这个类的内部类的接口来获得这种功能。而这个内部类本身并没有提供真正的实现,仅仅调用外部类的实现。可见,回调充分发挥了内部类所具有的访问外部类的实现细节的优势。
编程上来说,一般使用一个库或类时,是你主动调用人家的API,这个叫Call,有的时候这样不能满足需要,需要你注册(注入)你自己的程序(比如一个对象),然后让人家在合适的时候来调用你,这叫Callback。参考
为什么引入内部类?
- 完善多重继承
- 内部类不仅可以自己继承类,也可以使用外部类的方法,相当于多重继承
- 实现事件驱动系统
- 闭包
- 类库时注册回调
- 父类和实现接口出现同名函数
集合类