黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态

来源:互联网 发布:ubuntu路径设置 编辑:程序博客网 时间:2024/06/12 01:39

               -------android培训、java培训、期待与您交流! ----------




本日志doc文档下载







一、多态

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 {@Overridevoid eat() {System.out.println("吃鱼");}void catchMouse() {System.out.println("抓老鼠");}}class Dog extends Animal {@Overridevoid eat() {System.out.println("吃骨头");}void kanJia() {System.out.println("看家");}}class Pig extends Animal {@Overridevoid 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 {@Overridepublic void open() {System.out.println("netcard open...");}@Overridepublic void close() {System.out.println("netcard close...");}}/** * 声卡扩展类,实现PCI接口 *  */class SoundCard implements PCI {@Overridepublic void open() {System.out.println("soundcard open...");}@Overridepublic 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.1Father f = new Son();f.method1();f.method2();//对应6.1.2//f.method3(); 对应6.1.1//演示6.2System.out.println(f.num);//演示6.3f.method4();}}

结果如下截图:



原创粉丝点击