java中多态的的知识点_java 多态的知识点总结

本文总结了面向对象编程中多态的概念及应用,探讨了如何通过父类引用指向子类对象来提高程序扩展性,并讨论了向上转型和向下转型的优缺点。

之前学习了面向对象中的多态,现在对有关的知识点进行总结。

多态:

【体现】

父类的引用或者接口的引用指向了自己的子类对象。

【好处】

提高了程序的扩展性

【弊端】

通过父类引用操作子类对象时,只能使用父类中已有的方法,不能操作子类特有的方法。

【前提】

1,必须有关系:继承、实现、

2,通常都有重写操作。

多态技术的引出解决了程序扩展性的问题,那子类的特有方法如何调用呢?

Animal a = new Dog(); //Animal是父类型,newDog()是子对象。但是父类型引用指向子类对象时,让子类对象进行了类型的提升(向上转型)

向上转型的好处:提高了扩展性,隐藏了子类型。弊端:不能使用子类型的特有方法。  如果要使用子类的特有方法,只有子类型可以用;可以向下转型,强制转换。

Animal a = new Dog();

a.eat();

Dog d = (Dog)a;//将a转型为Dog类型,向下转型。

d.lookHome();当需要使用子类型特有的内容时,要用向下转型。注意:无论向上还是向下转型,最终都是子类对象做着类型的变化。

【向下转型的注意事项】

如:

Animal a = new Dog();

//Cat c = (Cat)a;向下转型因为不明确具体子类对象类型,所以容易引发ClassCastException异常所以为了避免这个问题,需要在向下转型前,做类型的判断,判断类型用的关键字:instanceof

if(a instanceof Cat) //a指向的对象类型是Cat类型{

//将a转型Cat类型

Cat c = (Cat)a;

c.catchMouse();

}

else if(a instanceof Dog){

Dog d = (Dog)a;

d.lookHome();

}

【转型总结】

1,什么时候用向上转型?

提高程序的扩展性,不关心子类型(子类型被隐藏);不需要用子类的特有方法。

2,什么时候使用向下转型?

需要使用子类型的特有方法时,但是一定要用instanceof进行类型的判断,避免发生ClassCastException

描述狗与猫如何提高扩展性:

//描述Dog

class Dog extends Animal

{

public void eat()

{

System.out.println("骨头");

}

public void lookHome()

{

System.out.println("看家");

}

}

//描述猫

class Cat extends Animal

{

public void eat()

{

System.out.println("鱼");

}

public void catchMouse()

{

System.out.println("抓老鼠");

}

}

//进行抽取。将共性的功能抽取到父类Animal中。

abstract class Animal

{

public abstract void eat();

}

class DuoTaiDemo

{

public static void main(String[] args)

{

Dog d = new Dog();

//d.eat();

method(d);

Cat c = new Cat();

method(c);

}

/*

发现,每多一个动物,都需要为这个动物单独定义一个功能,

让这个动物的对象去做事。

这个程序扩展性就很差。

如何提高这个扩展性呢?

发现既然是让动作去eat,无论是dog,还是cat,

eat是它们共性,干脆,将eat进行抽取。抽取到父类Animal中。

Dog是Animal中的一种。

Dog d = new Dog();

Animal a = new Dog();

Cat c = new Cat();

Animal aa = new Cat();

*/

//只要建立animal的引用就可以接收所有的dog cat对象进来。让它们去eat。

//提高了程序的扩展性。

public static void method(Animal a)

{

a.eat();

}

/*

//接收Dog,让dog做事。

public static void method(Dog d)

{

d.eat();

}

//接收Cat,让cat做事。

public static void method(Cat c)

{

c.eat();

}

*/

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值