构造器与多态

1.构造器的调用顺序

这里写图片描述
例:

class Real{
    public Real(String index) {
        // TODO Auto-generated constructor stub
        System.out.println("Real()"+index);
    }
}
class Meal{
    Real r= new Real("Meal");
    Meal() {
        // TODO Auto-generated constructor stub
        System.out.println("Meal()");
    }
}
class Bread{
    Bread() {
        // TODO Auto-generated constructor stub
        System.out.println("Bread()");
    }
}
class Cheese{
    Cheese() {
        System.out.println("Cheese()");
    }
}
class Lettuce{
    Lettuce() {
        // TODO Auto-generated constructor stub
        System.err.println("Lettuce()");
    }
}

class PortableLunch{
    Real r= new Real("PortableLunch");
    PortableLunch(){
        System.out.println("PortableLunch()");
    }
}
public class Sandwich extends PortableLunch{
    Bread b= new Bread();
    Cheese c= new Cheese();
    Lettuce l= new Lettuce();
    Sandwich(){
        System.out.println("Sandwich()");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Sandwich();
    }

}

2、继承与清理
这里写图片描述
例:

class Characteristic {
    private String s;

    Characteristic(String s) {
        this.s = s;
        System.out.println("Creating Characteristic " + s);
    }

    protected void dispose() {
        System.out.println("disposing Characteristic " + s);
    }
}

class Description {
    private String s;

    Description(String s) {
        this.s = s;
        System.out.println("Creating Description " + s);
    }

    protected void dispose() {
        System.out.println("disposing Description " + s);
    }
}

class LivingCreature {
    private Characteristic p = new Characteristic("is alive");
    private Description t = new Description("Basic Living Creature");

    LivingCreature() {
        System.out.println("LivingCreature()");
    }

    protected void dispose() {
        System.out.println("LivingCreature dispose");
        t.dispose();
        p.dispose();
    }
}

class Animal extends LivingCreature {
    private Characteristic p = new Characteristic("has heart");
    private Description t = new Description("Animal not Vegetable");

    Animal() {
        System.out.println("Animal()");
    }

    protected void dispose() {
        System.out.println("Animal dispose");
        t.dispose();
        p.dispose();
        super.dispose();
    }
}

class Amphibian extends Animal {
    private Characteristic p = new Characteristic("can live in water");
    private Description t = new Description("Both water and land");

    Amphibian() {
        System.out.println("Amphibian()");
    }

    protected void dispose() {
        System.out.println("Amphibian dispose");
        t.dispose();
        p.dispose();
        super.dispose();
    }
}

public class Frog extends Amphibian {
    private Characteristic p = new Characteristic("Croaks");
    private Description t = new Description("Eats Bugs");

    public Frog() {
        System.out.println("Frog()");
    }

    protected void dispose() {
        System.out.println("Frog dispose");
        t.dispose();
        p.dispose();
        super.dispose();
    }

    public static void main(String[] args) {
        Frog frog = new Frog();
        System.out.println("Bye!");
        frog.dispose();
    }
} /*
 * Output

3.构造器内部的多态方法的行为
例:

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 = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
*/

1.当创建RoundGlyph 对象时,会先为创建该对象分配足够的内存,存储空间清理,
基本类型被初始化为0,变量radius 被初始化为0,
2.再调用基类的构造器,基类构造器
中的draw()方法被子类覆盖,所以draw()调用的是子类RoundGlyph 中的方法,但是子类还没有完成初始化,所以容易出问题
这里写图片描述

4.协变返回类型
子类覆盖版本返回的类型可以是父类返回类型的子类
例:

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
*/

这里写图片描述

5.用继承进行设计
这里写图片描述

纯继承:(is-a),是一种纯替代,父类和子类有着完全形同的接口
扩展:子类中有额外的方法,子类中的扩展方法基类不能访问,当向上转型时会丢失新方法

向下转型不安全,当转到错误类型容易报错
这里写图片描述
例:

class Useful {
    public void f() {
        System.out.println("Useful f()");
    }

    public void g() {
        System.out.println("Useful g()");
    }
}

class MoreUseful extends Useful {
    public void f() {
        System.out.println("MoreUseful f()");
    }

    public void g() {
        System.out.println("MoreUseful g()");
    }

    public void u() {
        System.out.println("MoreUseful u()");
    }

    public void v() {
    }

    public void w() {
    }
}

public class RTTI {
    public static void main(String[] args) {
        Useful[] x = { new Useful(), new MoreUseful() };
        x[0].f();
        x[1].g();
        // x[1].u();
        ((MoreUseful) x[1]).u();
        ((MoreUseful) x[0]).u();// Exception thrown.
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值