Java学习 java -- 多态

来源:互联网 发布:呵里巴巴淘宝网 编辑:程序博客网 时间:2024/04/29 10:36

多态:一种事物的多种形态

多态的规则(前提):
1.类与类之间要建立关系,建立继承的关系
2.必须要有方法的重写
3.父类的指针(引用) 指向子类的对象(空间)

public static void main(string[] args){Cat cat = new Cat();cat.eat();Animal a = new Cat();a.eat();Animal aDog = new Dog();aDog.eat();}class Animal{public void eat(){system.out.println("吃饭");}}class Cat extends Animal{public void eat(){system.out.println("猫吃鱼");}}class Dog extends Animal{public void eat(){system.out.println("狗吃肉");}}

猫是一只动物 而不是动物是一只猫 这样逻辑是不通的 在这里动物是父类 猫狗是子类 猫狗是一只动物就相当于父类指向了子类的对象

多态时如何调用成员变量
多态时 当父类引用调用成员变量时
编译 需要看父类中有没有这个成员变量,没有编译不通过
运行 访问就是父类中的这个成员变量
结论:
多态时 访问成员变量 访问父类 访问成员变量 编译 和 运行 (看父类)

多态调用成员变量时
编译看父类 运行看子类

public static void main(string[] args){Father f = new Son();f.speak();system.out.println(f.num);}class Father{int num = 10;public void speak(){system.out.println("Father 说");}}class Son{int num = 20;public void speak(){system.out.println("Son 说");}}

打印结果
这里写图片描述
多态时父类指向子类的对象在内存中的表现

这里写图片描述

那 现在在main函数中加上

    Son s = new Son();    s.speak();    System.out.println(s.num);

打印结果是son说 20; 这个在内存中的表现
这里写图片描述

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

多态的弊端:
不能直接调用子类的特殊(不是重写父类的)方法
如果调用子类的特殊方法,需要将父类强转位子类的对象,然后对象点方法 调用子类的特殊方法

public static void main(string[] args){Person p = new Cheat();p.speak();Cheat ct = (Cheat)p;// 强制转换成子类}class Person{pubic void speak(){system.out.println("聊天");}}class Cheat extends Person{public void speak(){system.out.println("洗脑");}public void puch(){system.out.println("打人")}}

在多态时 子类非常多的情况下 父类调用子类的方法时 可以封装一个方法 参数是父类的对象 在传参的时候匿名创建new Dao 相当于 WuQi w = new Dao();——父类指向子类的对象 进行调用 我们想调用子类的特殊方法 这里需要用一个 instanceof 关键字 这个关键字 是判断 前面的对象是否属于 后面的 实例

public static void main(string[] args){fun(new Jian());fun(new Dao());}public static void fun(WuQi w){w.puch();if(w instanceof Dao){Dao dao = (Dao)w;dao.liangdao();}else if(w instanceof Jian){Jian jian = (Jian)wjian.liangjian();}}class WuQi{public void puch(){system.out.println("打人");}}class Jian extends WuQi{pubilc void puch(){system.out.println("砍人");}public void liangjian(){system.out.println("独孤九剑");}}class Dao extends WuQi{public void puch(){system.out.println("刺人");}public void liangdao(){system.out.println("独霸天下");}}
原创粉丝点击