Java编程思想重点整理笔记.doc
文本预览下载声明
目录
1. Java中的多态性理解(注意与C++区分) 1
2. is-a关系和is-like-a关系 4
3. 运行时类型信息(RTTI + 反射) 4
4. 代理模式与Java中的动态代理 11
5. 即时编译器技术 — JIT 14
6. 访问控制权限 15
7. 组合和继承之间的选择 16
8. final关键字 16
9. 策略设计模式与适配器模式的区别 17
10. 内部类 17
11. String类型 — 不可变 18
12. 序列化控制 22
?
1. Java中的多态性理解(注意与C++区分)
Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意味着通常情况下,我们不必判定是否应该进行动态绑定—它会自动发生。
final方法会使编译器生成更有效的代码,这也是为什么说声明为final方法能在一定程度上提高性能(效果不明显)。
如果某个方法是静态的,它的行为就不具有多态性:
class StaticSuper {
public static String staticGet() {
return Base staticGet();
}
public String dynamicGet() {
return Base dynamicGet();
}
}
class StaticSub extends StaticSuper {
public static String staticGet() {
return Derived staticGet();
}
public String dynamicGet() {
return Derived dynamicGet();
}
}
public class StaticPolymorphism {
public static void main(String[] args) {
StaticSuper sup = new StaticSub();
System.out.println(sup.staticGet());
System.out.println(sup.dynamicGet());
}
}
输出:
Base staticGet()Derived dynamicGet()
构造函数并不具有多态性,它们实际上是static方法,只不过该static声明是隐式的。因此,构造函数不能够被override。
在父类构造函数内部调用具有多态行为的函数将导致无法预测的结果,因为此时子类对象还没初始化,此时调用子类方法不会得到我们想要的结果。
class Glyph {
void draw() {
System.out.println(Glyph.draw());
}
Glyph() {
System.out.println(Glyph() before draw());
draw();
System.out.println(Glyph() after draw());
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(RoundGlyph.RoundGlyph(). radius = + radius);
}
void draw() {
System.out.println(RoundGlyph.draw(). radius = + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
输出:
Glyph() before draw()RoundGlyph.draw(). radius = 0Glyph() after draw()RoundGlyph.RoundGlyph(). radius = 5
为什么会这样输出?这就要明确掌握Java中构造函数的调用顺序:
显示全部