黑马程序员-多态的一些问题

来源:互联网 发布: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的子类对象。这样我们就很好的利用了类的多态性实现了可扩展性。