本文内容是多态的梳理和总结,本文内容包括:
多态:
形成多态需要具备三个条件
需求:
设计:
按照多态的三个条件设计类
代码:
class Printer{
// 父类定义打印方法
public void print(){
System.out.println("打印");
}
}
class BlackWhitePrinter extends Printer{
// 重写父类的打印方法
@Override
public void print(){
System.out.println("黑白打印");
}
}
class ColorPrinter extends Printer{
// 重写父类的打印方法
@Override
public void print(){
System.out.println("彩色打印");
}
}
public class Test {
public static void main(String[] args) {
//定义父类引用,指向父类的对象
Printer printer = new Printer();
printer.print(); // 这里调用的是父类的print()方法
// 父类引用指向黑白打印机
printer = new BlackWhitePrinter();
printer.print(); // 这里调用的是黑白打印机的print()方法
// 父类引用指向彩色打印机
printer = new ColorPrinter();
printer.print();// 这里调用的是彩色打印机的print()方法
}
}
运行结果
打印
黑白打印
彩色打印
解析:
按照多态的三个条件解析这个例子
Printer printer = new Printer();
父类引用printer指向父类对象,调用print()方法时,调用的是父类的print()方法,输出"打印",如图:
printer = new BlackWhitePrinter();
父类引用printer不再指向父类对象,而是指向了黑白打印机对象,调用print()方法时,调用的是黑白打印机的print()方法,输出"黑白打印",如图:
printer = new ColorPrinter();
父类引用printer不在指向黑白打印机,而是指向彩色打印机对象,调用print()方法时,调用的是彩色打印机的print()方法,输出"彩色打印",如图:
说重点
观察第5行,第9行,第13行,见下图,这三行代码完全相同,但是输出的结果不同,这就是多态。即同一个方法调用,由于对象不同可能会有不同的行为。
这个例子中有三种形态,父类的打印是一种形态,黑白打印机的打印是一种形态,彩色打印机的打印是一种形态。所以每多一个子类对父类方法的重写,就多了一种形态。
最后的重点:父类引用指向哪个子类对象,父类引用调用的方法就是它指向的子类的方法。如果子类没有重写父类的方法,那么父类引用调用的就是子类从父类继承的方法,由于子类没有重写父类方法,所以就没有形成新的形态。要想有多态,子类就必须重写父类的方法。
多态的好处是程序容易扩展。
比如本例中在增加一种打印机,叫做激光打印机,这种增加就属于多功能的扩展。
你只需要定义激光打印机类,继承打印机类,重写打印方法就可以了。
对于功能的扩展,怎样才算容易扩展呢?
容易扩展的标准是
满足以上两条就是容易扩展。
那怎样算是不容易扩展呢?
如果要扩展功能,就要大量的修改原有的代码就是不容易扩展的设计。
多态的应用场景实在是太广泛了。
比如在JDBC中,在集合中就大量的使用了多态。
鉴于目前的学习进度,在这里举例你也不好理解,在后续的学习过程中,遇到多态的应用场景时,老师会给你讲,期待吧!
目前,这个案例是使用普通类作为父类,大多数情况下,会使用抽象类或接口来形成多态。
多态是抽象的,难于理解的,掌握多态需要的是时间,积累,领悟,而非一朝一夕。
多态是一种优雅的设计,融入其中,尽可享受其美妙之处!
晚安,同学们!祝周末愉快!
powered by kaifamiao