多态的详细介绍
2016-03-24 16:11
225 查看
多态: 定义:某一类事物的多种存在形态 列:动物中 猫 狗; 猫这这个对象对应的类型是猫类型; 猫 a = new 猫(); 同时猫也是动物中的一种,也可以把猫称为动物; 动物 b = new 猫(); 动物是猫和狗具体事物中抽取出来的父类型 父类型引用指向子类型对象。 对象的多态性: class 动物{ class 猫 extends 动物{} class 狗 extends 动物{} 猫 a = new 猫(); 动物 b = new 猫();//一个对象两种形态 猫这类事物即具备猫的形态又具备动物的形态,也就算对象的多态性; 简单的说:就是一个对象对应着不同的类型; 多态在代码中的体现: 父类或者接口的引用指向其子类对象 多态的好处: 提高了代码的扩展性,前期定义的代码可以使用后期定义的内容; abstract class Animal{ abstract void eat(); } class Dog extends Animal{ void eat(){ System.out.println("啃骨头"); } void lookHome(){ System.out.println("看家"); } } class Cat extends Animal{ void eat(){ System.out.println("吃鱼"); } void catchMouse(){ System.out.println("抓老鼠"); } } class DuoTaiDemo{ public static void main(String[] args){ Cat c = new Cat(); Dog d = new Dog(); Animal a = new Dog(); method1(a); method1(c); method1(d); } public static viod method1(Animal a){ a.eat(); a.catchMouse();//编译报错,动物里没有抓老鼠的方法。 } } 《多态的弊端: 前期定义的内容不能调用后期子类中特有的内容。 多态的前提: 1:必须有关系 :继承 实现 。 2:要有覆盖。 》 if(a instanceof Cat){ Cat c = (Cat)a; c.catchMouse(); /* java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一 个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。 用于判断对象的具体类型,只能用于引用数据类型判断,通常在向下转型前用于健壮性判断; */ } Animal a = new Cat();//自动类型提升猫对象,提升了动物类型,但是特有的功能无法访问 //作用就是限制了对特有功能的访问; //专业上讲:向上转型将子类型隐藏,就不使用子类的特有方法; //如果还想使用具体动物猫的特有功能,可以将该对象进行向下转型; //向下转型的目的是为了使用子类中的特有方法。 a.eat(); Cat c = (Cat)a; c.eat(); c.catchMouse(); /*注意:对于转型,自始至终都是子类对象在做着类型的变化(如小猫转动物,小猫转小猫) Animal an = new Dog(); Cat c = (Cat)an; 错误:报classCatException 类型转换异常 */ class 毕姥爷{ viod 讲课(){ System.out.println("管理课"); } viod 钓鱼(){ System.out.println("钓鱼"); } } class 毕老师 extends 毕姥爷{ viod 讲课(){ System.out.println("java"); } viod 看电影(){ System.out.println("无间道"); } } class DuoTaiDemo{ public static void main(String[] args){ //毕老师 b = new 毕老师(); // b.讲课(); // b.看电影(); 毕姥爷 bl = new 毕老师(); bl.讲课(); -----------System.out.println("java"); bl.钓鱼(); -----------System.out.println("钓鱼"); // bl.看电影(); 错误 } } 多态时 成员的特点: 1,成团变量: 编译时参考引用型变量所属的类中是否有调用的变量,有,编译通过;没有,编译失败; 运行时参考引用型变量所属的类中是否有调用的变量,并运行该属性类中的成员变量; 简单说:编译和运行都参考等号的左边。 2,成员函数: 编译时参考引用型变量所属的类中是否有调用的函数,有,编译通过;没有,编译失败; 运行时参考的是对象所属的类中是否有调用的函数; 简单说:编译看左边,运行看右边。 3,静态函数: 编译时参考引用型变量所属的类中是否有调用的静态方法; 运行时参考引用型变量所属的类中是否有调用的静态方法; 简单说:编译和运行都看左边。 <!--静态方法是不需要对象的,直接类名调用即可--> --------------------------------------- 成员变量: class Fu{ int num = 3; } class Zi extends Fu{ int num = 4; } class DuoTaiDemo{ public static void main(String[] args){ Fu f = new Zi(); System.out.println(f.num);//运行结果等于3 编译和运行都看左边 } } ------------------------------------------ 成员函数: class Fu{ void Show(){ System.out.println("fu show"); } } class Zi extends Fu{ void Show(){ System.out.println("zi show"); } } public static void main(String[] args){ Fu f = new Zi(); f.show();//运行结果等于"zi show" 编译看左边和运行看右边 } }
相关文章推荐
- JVM内存划分
- Json 和 Jsonlib 的使用
- 安卓应用反编译(三)-结束
- KMP算法
- C++将结构体传给lua
- 关于消息队列的应用中提示问题
- android手机推送消息 (百度云推送)
- 再识Quartz
- PHP随机显示mysql数据库中的数据
- 很全的demo,包括调用系统相机全屏拍照并保存,访问系统相册,多项保存照片。
- Inventor API: 如何在工程图里显示装配不同详细等级(LOD)的重量
- 如何在Android Studio中添加多个项目
- 字符串的最小表示--nkoj2973质检员
- awk用法
- 解决Python出现_warn_unsafe_extraction问题的方法
- Oracle varchar转clob
- eclipse启动时间插件
- c/c++中静态局部变量以及全局变量的使用(转)
- 15、 EXTJs前后台交互
- 虫贵妃——开博纪念