Java编程思想——第八章续

来源:互联网 发布:如何经营淘宝店铺 编辑:程序博客网 时间:2024/05/29 16:52
构造器内部的多态方法的行为
一个基类有导出类,初始化导出类,则会调用基类的构造器,然而,如果基类的构造器需要调用导出类的方法,则会出现问题,因为此时的导出累还没有初始化完全,这会出现很危险的情况!

协变返回类型
协变返回类型允许返回更具体的Wheat类型
class Grain{
    public String toString(){ return "Grain"; }
}
class Wheat extends Grain{
    public String toString(){ return "Wheat"; }
}
class Mill{
    Grain process(){ return new Grain(); }
}
class WheatMill extends Mill{
    Wheat process() { return new Wheat(); }
}
public class CovariantReturn{
    public static void main(String[] args) {
        Mill m = new Mill();
        Grain g = m.process();
        System.out.println(g);
        m = new WheatMill();
        g = m.process();
        System.out.println(g);
    }
}
/*Output
Grain
Wheat
*/

用继承进行设计
这里要澄清一点,各个版本的书都强调继承的重要性,继承是面向对象多么 概念以及方法呀,“多态是一种如此巧妙的工具”,但我们不应该总想要应用着继承技术,因为这会加重设计的负担,使事情变得不必要地复杂起来。应该首先考虑一下“组合”,尤其是不确定应该应用什么技术时。组合不会强制设计进入继承的层次结构中。组合更加灵活,可以动态选择类型(因此也选择了行为),相反的是继承要求知道确切类型。

纯继承与扩展:只有在基类中已经建立的方法才可以在导出类中被覆盖,此时基类可以接受发送给导出类的任何信息,我们只需向上转型,不需要知道正在处理的对象的确切类型,通过多态解决问题了!注意一点,导出类的扩展部分不能被基类访问。

向下转型:
class Useful {
    public void f() {}
    public void g() {}
}
class MoreUserful extends Userful{
    public void f(){}
    public void g(){}
    public void u(){}
    public void v(){}
    public void w(){}
}
public class RTTI{
    public static void main(String[] args){
        Useful[] x = {
            new Useful(),
            new MoreUserful()
    }
    x[0].f();
    x[1].g();
    ((MoreUseful)x[1]).u();
    ((MoreUseful)x[0]).u();
    }
}

0 0
原创粉丝点击