Java 多态

来源:互联网 发布:js日历 编辑:程序博客网 时间:2024/05/23 15:43

一、 多态

一种事物的多种形态
比如:青蛙 卵 —-> 蝌蚪 —-> 青蛙

二、 多态的规则

  1. 类与类之间建立联系,建立继承的关系
  2. 必须要有方法的重写
  3. 父类的指针(引用)指向子类的对象(空间)
举例public class Demo01{    public static void main(String[] args){        //本类的引用(指针)  指向 子类的对象(空间)        //猫是一只猫        Cat c = new Cat();        c.eat();        //猫是一直动物(不能是 动物是一只猫)        //父类的指针 指向 子类的对象        Animals a = new Cat();        a.eat();        //狗是一直动物        Animals aDog = new Dog();        aDog.eat();    }}class Animals{    public void eat(){    System.out.println("吃")    }}class Cat extends Animals{    public void eat(){    System.out.println("猫吃老鼠");  //方法的重写    }}class Dog extends Animals{    public void eat(){    System.out.println("狗吃屎");    }}

多态时,成员变量是如何调用的?
多态时,当父类引用调用成员变量时,编译需要看父类有么有这个成员变量,没有编译不会通过,访问就是父类的这个成员变量.

举例public class Demo02{    public private static main(String[] args){        Father f = new Son();                // 父类的指针 指向 子类的对象        f.speak();                           // 打印  Sun说        System.out.println(num)              // 打印 10        Son s = new Son();        s.speak();                           //打印  Sun说        System.out.println(num)              //打印  20    }}class Father{    int num = 10;    public speak(){    System.out.println("Father 说")    }}class Son extends Father{    int num = 20;    public speak(){    System.out.println("Sun 说")    }}得出结论:访问成员变量时,  访问父类,访问成员变量 编译 和 运行(看父类) 多态 调用成员方法时,编译看父类.运行看子类

三、多态的利弊
多态的好处

  1. 增强了代码的可维护性(建立在继承上)
  2. 增强方法的可扩展性(核心)

多态的弊端

  1. 不能直接调用子类的特殊方法需要通过强制转换
举例public class Demo03{    public private static main(String[] args){        Person p = new Cheat();            // 父类引用 指向 子类对象 向上转型        p.speak();                         // p可以调用子类的speak方法,但是无法调用puch方法        Cheat ct = (Cheat)p;               // 这个时候需要使用强制转换  向下转型        ct.puch();                         // 可以调用puch方法    }}class Person{    public void speak(){    System.out.println("聊天");    }}class Cheat extends Person{    public void speak(){    System.out.println("骗人")    }    public void puch(){    System.out.println("用小拳拳锤你胸口");    }}
原创粉丝点击