Java 的 多态

来源:互联网 发布:北京索顿网络是培训吗 编辑:程序博客网 时间:2024/06/17 10:11

一 多态
多态:一种事物的多种形态
举例:人 里面分 黄种人 黑种人 白种人
这就叫多态 由此我们能看出多态的一个规则
1 多态是建立在类与类之间要建立关系—–即继承的关系
2 必须要有重写
3 父类的指针(引用)指向 子类的对象(空间)

如我们 举一个 例子
人 跳舞
黄种人 民舞
黑种人 拉丁舞

public class Dance {public static void main(String[] args) {// TODO Auto-generated method stub         Peo p1 = new yellow();         p1.dance();         Peo p2 = new black();         p2.dance();}}class Peo{public void dance() {System.out.println("我会跳舞");}}class yellow extends Peo{public void dance() {System.out.println("我会跳民舞");}}class black extends Peo{public void dance() {System.out.println("我会跳拉丁舞");}}

二 多态调用成员变量 和 成员 方法是怎么调用的呢
记住两句话即可

多态调用成员变量:
编译看父类;
运行也看父类;

多态调用成员方法:
编译看父类;
运行看子类;

public class Demo02 {    public static void main(String[] args) {        // TODO Auto-generated method stub        Father f = new Son();        f.speek();        System.out.println(f.num);        Son son = new Son();        System.out.println(son.num);    }}class Father{    int num = 10;    public void speek() {        System.out.println("Father 说");    }}class Son extends Father{    int num = 20;    public void speek() {        super.speek();        System.out.println("Son 说");    }}

这是为什么呢 请看图
这里写图片描述
(有同学会问 多态调用成员方法时,既然运行看子类的话 能不能将父类的重写方法删掉可以么
其实 这是不可以的 为什么呢 其实很简单 多态的规则 多态就是就是建立在重写的基础上的。)

三 多态的好处与弊端
任何事物都有双面性 多态也不例外
我们先来讲讲多态的好处
好处1 : 增强了代码的可维护性
好处2: 增强了方法的可扩展性

弊端 呢
不能调用父类的特殊方法(不是重写父类的)

public class Demo3 {    public static void main(String[] args) {        // TODO Auto-generated method stub        //父类指针指向子类对象        //骗子进行伪装 向上转型        People p = new fround();        //骗子调用自己的方法        p.speak();        //p能不能调用大        //向下转型        //注意:向下转型 之前必须要有向上转型        fround pZi = (fround)p;        pZi.gan();    }}class People{    public void speak() {        System.out.println("我能聊天");    }}class fround extends People{    public void speak() {        System.out.println("我能洗脑");    }    public void gan() {        System.out.println("我能打");    }}

四 instanceof
instanceof 运算符是用来运行时指出对象是特定的一个类的实例
package con.lanou3g;

public class Demo4 {    public static void main(String[] args) {        //匿名        //Wuqi w = new Dao();        fun(new Dao());        //Wuqi w = new Jian();        fun(new Jian());    }    public static void fun(Wuqi w) {        //instanceof 关键词        //可以判断w属于哪个类        //Wuqi w = new Dao;        //Dao dao = (Dow)w;        //w.paik();        if(w instanceof Dao) {            Dao dao = (Dao)w;            ((Dao) w).pak();            //Wuqi w = new Jian            //Jian jian = (Jian)w;            //w.paik();            }else if(w instanceof Jian) {                Jian jian = (Jian)w;            }        w.paik();    }}class Wuqi{    //方法的重写    public void paik() {        System.out.println("挥舞武器");    }}//extends 继承class Dao extends Wuqi{    //方法的重写    public void paik() {        System.out.println("挥舞刀");    }    //特有行为    public void pak() {        System.out.println("挥舞刀123");    }}class Jian extends Wuqi{    //方法的重写    public void paik() {        System.out.println("挥舞剑");    }}

instanceof 我们在这里用 instanceof 来判断 对象是属于刀类还是剑类 ,然后再用匿名对象 ,如果这时用来打许多刀和许多剑 这时用 instanceof 判断打印 就方便了许多