#Thinking in Java阅读笔记# 第八章 多态

多态的作用是消除类型之间的耦合关系。可以只编写基类为接口的方法(数组),其子类均可以调用这些方法,子类向上转型后,可通过动态绑定在运行时确定需要具体执行的方法主体,从而方便添加新类型或添加新方法而不需要更改原有方法。“能将改变事物与为变事物分离”
多态=动态绑定=后期绑定
final(private)和static方法均为前期绑定,java的其他方法为后期绑定
OOP的基本特征:数据抽象、继承、多态
Super s = new sub();(sub->super) 向上转型
而向下转型需要显示类型转换

public class TestJava{
    public void ride(Cycle r) {System.out.println("number of wheels "+r.wheel());}
    public static void main(String[] args) {
        TestJava t = new TestJava();
        t.ride(new Cycle());
        t.ride(new Unicycle());
        t.ride(new Bicycle());
        t.ride(new Tricycle());
    }
}
class Cycle{
    public int wheel() {
        return 0;
    }
}
class Unicycle extends Cycle{
    public int wheel() {
        return 1;
    }
}
class Bicycle extends Cycle{
    public int wheel() {
        return 2;
    }
}
class Tricycle extends Cycle{
    public int wheel() {
        return 3;
    }
}

缺陷:1.类的Private(final)方法不能被子类覆盖,因此如果想在子类中调用超类private方法,需要重命名
2.任何域访问操作(class.field)都由编译器解析,因此不是多态的。静态方法也不是多态的
sub->super
super:static function(), function1()
sub:static function(), function1()
super s = new sub()
s.function()的结果是super.function()的结果,s.function1()的结果是sub.function()的结果,是多态的。

在子类的构造器调用时,超类构造器以及变量的调用顺序如下:
1.调用超类的构造器,从其root开始,知道最底层导出类的上一层
2.构造变量(变量的初始化发生在本类所有方法包括构造器调用之前),顺序等同于声明顺序
3.子类构造器调用

而清理的顺序与初始化的顺序相反

协变返回类型:表示导出类被覆盖的方法可以返回基类方法的返回类型的导出类

sub->super
class drink{
super process(){}
}
class cola extends drink{
sub process(){}
}

猜你喜欢

转载自blog.csdn.net/zhou373986278/article/details/78437509