黑马程序员-多态的一些问题
来源:互联网 发布:linux ftp文件复制命令 编辑:程序博客网 时间:2024/05/19 13:22
------- android培训、java培训、期待与您交流! ----------
对于一个初学java的菜鸟,多态问题着实让人头疼,通过一天的学习,我对多态的一些方面稍微做了下总结,才疏学浅,非常浅显,老鸟果断飘过~~~
多态的体现:父类Fu的引用指向了自己的子类Zi对象,即父类的引用也可以接收自己的子类对象。Fu a=new Zi();
多态的前提:必须是类与类之间有关系,要么继承,要么实现。通常还有一个前提,存在覆盖。
多态的好处:多态的出现大大提高程序的扩展性。
多态的弊端:提高扩展性,但是只能使用父类的引用访问父类中的成员。
例如
Animal a=new cat();这里建立子类cat的对象a,父类Animal的引用,叫做向上转型。这里的对象a只能调用的是被子类重写后的父类的非静态方法,父类的静态方法和静态变量,父类的普通成员变量。对于父类引用的子类对象,我们可以把这个对象重新还原为子类引用,即cat c=(cat)a,因为它本身就是子类对象,拥有子类的成员。但是不能把父类对象直接强制类型转换为子类,即Animal a=new Animal();cat c=(cat)a;这是错误的。
class Animal{public void eat(){}}class cat extends Animal{public void eat(){System.out.println("吃鱼");}}class dog extends Animal{public void eat(){System.out.println("吃骨头");}}class pig extends Animal{public void eat(){System.out.println("吃饲料");}}public class DuoTaiDemo {public static void main(String [] args){function(new cat());function(new dog());function(new pig());}public static void function(Animal a){//这里可以实现更多多复杂的运算,而不单单是调用一个eat方法
a.eat();}}
这个例子就体现了多态的可扩展性,试想一下,这是一个很庞大的程序项目,function中实现了各种子类对象的各种复杂的运算,然后在DuoTaiDemo中调用function。然后在1年后如果需要向里面扩展一个继承Animal类的fish类,重写eat()方法,如果不用上面这种方式,那么需要在DuoTaiDemo的main方法中重新new一个fish类,然后通过这个对象重写一个方法实现之前function中各种的复杂运算,这是一个很繁琐的过程,因为在不用多态的前提下,fish类和其他的几个类没有关系,不能直接调用之前写好的function方法并传入fish的对象作为参数。所以这个时候我们就最好用多态来实现这种可扩展性。
在上面的例子中,我们通过继承,把所有子类的共同eat方法重写。在主类DuoTaiDemo中,我们想实现这些所有子类一系列共同的功能方法(这里只简单的调用eat方法),这时我们第一反应就是,写一个方法,把各对象作为参数传进来就能实现所有类对象的这一复杂功能。但是我们发现,这些类各不相同,没法直接传入作为参数。那么此时我们就需要利用他们的共同点,就是他们都继承Animal类。这时,我们就把参数类型定为Animal,在Animal类中定义一个子类都需要实现的方法eat()。利用我们之前总结的知识,我们在DuoTaiDemo的main方法中,调用function函数,传入的参数可以为Animal的子类对象。这样我们就很好的利用了类的多态性实现了可扩展性。
- 黑马程序员-多态的一些问题
- 黑马程序员-------关于多态问题的一些看法
- 黑马程序员-关于异常的一些问题
- 黑马程序员之面向对象中一些重要的问题
- 黑马程序员 + 在学习中遇到的一些问题1
- 黑马程序员 + 在学习中遇到的一些问题2
- 黑马程序员-java面向对象的一些问题
- 黑马程序员-JDK环境变量配置及常见的一些问题
- 黑马程序员_还是关于多态的问题
- 黑马程序员----java多态问题
- 黑马程序员-------面向对象的封装、继承、多态一些学习笔记
- 黑马程序员—面向对象的一些特征、继承、接口与多态
- 中关村黑马程序员的一些课程,有用~
- 黑马程序员:一些简单的设计模式
- 黑马程序员--泛型的一些理解
- 黑马程序员_一些常用的类
- 黑马程序员------javascript一些简单的语法
- 黑马程序员--关于集合的一些总结
- mysql存储过程的调用方法
- java中的抽象类(abstract class)
- Oracle就是个坑,Ubuntu手动安装JDK6
- SDL游戏开发教程02(显示图片)
- 第一次搭建自己的GIT
- 黑马程序员-多态的一些问题
- 【读书笔记】社会化标签系统语义相关度的拓扑图法计算
- SDL系列开发教程说明
- git服务器搭建过程
- 通过小项目学Android教程13 - 亲手做一个文件浏览器(4)
- 捕获javaw的输出
- HTML5 Video/Audio播放本地文件
- SDL游戏开发教程01(环境准备 mingw+eclipse)
- SDL游戏开发教程03(消息循环和键盘事件响应)