Think In Java 笔记4 Polymorphism

Polymorphism
1. Early binding 就是在程序运行之前就把方法和对象进行绑定
2. Late binding 就是在程序运行的时候进行绑定,又叫动态绑定和runtime binding
3. 如果一个方法是static或者final修饰的,或者是private的方法,它自动加上final,这会告诉编译器,不要动态binding,这会提升一定的效率,但是不明显,还是把final作为防止别人重写这个方法为好。
4. 如果有一个shape类,通过它衍生出的子类有Circle,Triangle。Shape类有draw()这个方法,子类都重写了这个方法,如果这样写:
shape s=new Circle();
s.draw();
这样调用的是Circle类的draw方法,因为动态绑定
5. Pitfall!!!如果你重写了(override)基类private的方法,这并不是真的重写,因为基类private的方法在子类中并不可见,这是全新写了一个方法。这就不是多态了

//: polymorphism/PrivateOverride.java
// Trying to override a private method.
package polymorphism;
import static net.mindview.util.Print.*;
public class PrivateOverride {
private void f() { print("private f()"); }
public static void main(String[] args) {
PrivateOverride po = new Derived();
po.f();
}
}
class Derived extends PrivateOverride {
public void f() { print("public f()"); }
} /* Output:
private f()
*///:~

5.5 对于filed来说也就是类中的变量来说,如果一个Super类衍生出Sub类,它们两个都有filed这个变量,Super sup=new Sub();
sup.filed是指Super那个类的filed因为这个是early binding,而如果调用方法的时候是调用Sub类的方法,因为动态绑定了。
6. 如果一个方法是静态的那也是early binding 所以也是哪个类就调用各自的方法,不会多态
7. 注意如果一个对象要被自己主动销毁,而且这个对象是有基类的,那么销毁的顺序得是先自己被销毁,然后基类被销毁,这样做的目的是,因为自己是依托于基类的,如果基类先销毁可能会有问题产生。
8. 父类的constructor如果使用了自己定义的不是final或者private的方法的时候,要小心,因为子类可能重写了这个方法,然后调用又是动态绑定的,所以调用的是子类的方法,而且,子类的值可能还没有正确初始化,只是被赋初值为0.
9. 父类中没有的方法,子类有的方法,如果是这样实现的
Sup s= new sub();
那么子类中独有的方法s都是不能调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值