-------android培训、java培训、期待与您交流! ----------
一、多态
1、多态的体现
父类的引用指向了自己的子类对象
2、多态的前提
必须是类与类之间的关系。要么继承,要么实现
通常还有一个前提就是:覆盖
3、多态的好处
多态的出现大大的提高了程序的扩展性
4、多态的弊端
提高了扩展性的同时,只能使用父类的引用访问父类中的成员。
5、多态的应用
多态示例一:
abstract class Animal { abstract void eat(); } class Activities { void doActivity(Animal a) { if (a != null) { a.eat(); } if (a instanceof Cat) { ((Cat) a).catchMouse(); } else if (a instanceof Dog) { ((Dog) a).kanJia(); } else if (a instanceof Pig) { ((Pig) a).sleep(); } } } class Cat extends Animal { @Override void eat() { System.out.println("吃鱼"); } void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { @Override void eat() { System.out.println("吃骨头"); } void kanJia() { System.out.println("看家"); } } class Pig extends Animal { @Override void eat() { System.out.println("吃饲料"); } void sleep() { System.out.println("老是睡觉"); } } public class DuoTaiDemo1 { public static void main(String[] args) { // new Activities().doActivity(null); Animal a = new Cat();//类型提升,向上转型 a.eat(); //如果想要调用猫的特有方法,如何操作?? //强制将父类的应用转成子类类型,向下转型 Cat c = (Cat)a; c.catchMouse(); /** * 注意:前往不能将父类对象转成子类类型 * Animal a = new Animal(); * Cat c = (Cat)a; * 我们能转换的是父类引用执行了自己子类对象是,该应用可以被提升 * 多态自始至终都是子类对象在做着变化 */ //下面代码是利用Activities类创建对象完成对Cat,Dog,Pig进行的活动 new Activities().doActivity(new Cat()); new Activities().doActivity(new Dog()); new Activities().doActivity(new Pig()); } }多态示例二
/** * 需求:电脑运行实例,电脑运行基于主板,提供扩展功能 * * @author LeeYou * */ interface PCI { public void open(); public void close(); } /** * 主板,使用PCI接口 * */ class MainBoard { public void run() { System.out.println("mainBoard run..."); } public void userPCI(PCI p) { if (p != null) { p.open(); p.close(); } } } /** * 网卡扩展类,实现PCI接口 * */ class NetCard implements PCI { @Override public void open() { System.out.println("netcard open..."); } @Override public void close() { System.out.println("netcard close..."); } } /** * 声卡扩展类,实现PCI接口 * */ class SoundCard implements PCI { @Override public void open() { System.out.println("soundcard open..."); } @Override public void close() { System.out.println("soundcard close..."); } } class DuoTaiDemo3 { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.userPCI(new SoundCard()); mb.userPCI(new NetCard()); } }6、多态的注意事项
6.1在多态中成员函数的特点
6.1.1 在编译时期:参阅引用型变量所属的类是否有调用的方法。如果有,编译通过;如果没有,编译失败。
6.1.2 在运行时期:参阅对象所属的类中是否有调用的方法。
6.2在多态中,成员变量的特点(常用于面试)
无论编译和运行,都参考左边(引用型变量所属的类)
6.3在多态中,静态成员函数的特点(常用于面试)
无论在编译和运行,都参考左边(引用型变量所属的类)
代码如下:
class Father { int num = 10; void method1() { System.out.println("Father method 1"); } void method2() { System.out.println("Father method 2"); } static void method4() { System.out.println("Father method 4"); } } class Son extends Father { int num = 20; void method1(){ System.out.println("Son method 1"); } void method3(){ System.out.println("Son method 3"); } static void method4() { System.out.println("Son method 4"); } } class DuoTaiDemo2 { public static void main(String[] args) { //演示6.1 Father f = new Son(); f.method1(); f.method2();//对应6.1.2 //f.method3(); 对应6.1.1 //演示6.2 System.out.println(f.num); //演示6.3 f.method4(); } }结果如下截图: