通过一个“打印机”例子来更好的理解什么是多态。

/**
 * Machine类代表一台打印机。这台打印机里面分别装有墨盒(BoxDemo类),纸张(PaperDemo类)
 * 这个Machine类(打印机)的构造方法是传递两个参数,分别是墨盒(BoxDemo类),纸张(PaperDemo类)。
 * 墨盒(Box类)也有两个子类,彩色墨盒(ColorBox)和黑白墨盒(BlackBox);
 * 纸张(Paper类)也有两个子类,A4纸张类和B5纸张类。
 * Machine类的构造方法不传递具体实现的哪个墨盒或哪一种纸张,只是传递他们的父类有墨盒(BoxDemo类),纸张(PaperDemo类)。
 * 然后通过父类引用指向子类的对象实现多态。
 * 
 */

public class Machine {
    //私有化墨盒BoxDemo抽象类和纸张PaperDemo抽象类作为成员变量。
    //虽然抽象类不可以创建具体的实例对象,但可以声明,通过父类的引用指向子类的对象来实现多态。
    //这里存在继承、子类重写父类的方法、父类的引用指向子类的对象,,,是实现多态的三个必要条件。
    private BoxDemo boxDemo;
    private PaperDemo paperDemo;
    public Machine() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Machine(BoxDemo boxDemo, PaperDemo paperDemo) {
        super();
        this.boxDemo = boxDemo;
        this.paperDemo = paperDemo;
    }
    //留一个公开的startPrint()方法给其他类调用。
    public void startPrint(){
        System.out.println("正在使用" + boxDemo.boxPrint() + paperDemo.paperPrint());
    }

    public BoxDemo getBoxDemo() {
        return boxDemo;
    }
    public void setBoxDemo(BoxDemo boxDemo) {
        this.boxDemo = boxDemo;
    }
    public PaperDemo getPaperDemo() {
        return paperDemo;
    }
    public void setPaperDemo(PaperDemo paperDemo) {
        this.paperDemo = paperDemo;
    }
}

/**
 * 这个是代表墨盒的父类BoxDemo类,它是一个抽象类,具体方法由继承它的子类来重写实现。
 *
 */
public abstract  class BoxDemo {
    //这里是一个抽象类,具体的方法由子类实现;
    public abstract String boxPrint();
}

/**
 * 这个是代表“纸张”的父类PaperDemo类,它是一个抽象类,具体方法由继承它的子类来重写实现。
 *
 */
public abstract class PaperDemo {
    public abstract String paperPrint();

}

/**
 *这个是“纸张PaperDemo”的子类,并重写了父类的方法。
 *
 */
public class A4 extends PaperDemo{
    @Override
    public String paperPrint() {
        return "A4";
    }
}


-------------------------------------------------------------
/**
 *这个是“纸张PaperDemo”的子类,并重写了父类的方法。
 *
 */
public class B5 extends PaperDemo{
    @Override
    public String paperPrint() {
        return "B5";
    }
}


/**
 *这个是“墨盒BoxDemo类”的子类,并重写了父类的方法。
 *
 */
public class BlackBox extends BoxDemo{
    @Override
    public String boxPrint() {
        return "黑白墨盒";
    }
}


------------------------------------------------------------------
/**
 *这个是“墨盒BoxDemo类”的子类,并重写了父类的方法。
 *
 */
public class ColorBox extends BoxDemo{
    @Override
    public String boxPrint() {
        return "彩色墨盒";
    }
}


/**
 * 这个是运行测试类Lanuch,来看看是怎样实现多态的。
 *
 */
public class Lanuch {
    public static void main(String[] args) {
        //分别创建BoxDemo和PaperDemo的子类,当作参数传递给Machine类的构造方法。
        A4 a4 = new A4();
        B5 b5 = new B5();
        BlackBox blackBox = new BlackBox();
        ColorBox colorBox = new ColorBox();
        //分别创建4台不同的打印机。
        Machine machine01 = new Machine(colorBox, a4);
        Machine machine02 = new Machine(blackBox, a4);
        Machine machine03 = new Machine(colorBox, b5);
        Machine machine04 = new Machine(blackBox, b5);
        //调用打印机的打印方法。
        machine01.startPrint();
        machine02.startPrint();
        machine03.startPrint();
        machine04.startPrint();
    }
}

你可能感兴趣的:(java基础)