多态
多态是java面向对象中一个重要的概念,它也是事物存在的多种体现形态。比如一个简单的例子,在动物这个大的类中,包含有许多不同的物种,我们可以称一只猫为猫,我们也可以说它是动物,这是很显然的,这里面就涉及到多态的概念了。
多态在java中强调的是对象上的体现,其实多态在java中除了在对象上有体现外,其他也是有体现的,比如函数,重载和覆盖其实就是函数多态性的体现。
1多态的表现形式
在java中我们经常要描述对象,当我们在描述一些具有相同特征的对象时我们就会抽取其相同的部分,然后就能提高代码整体的可用性。比如我们在描述几种不同的动物的基本行为时,我们就可以进行向上的抽取,如下面的示例代码:
abstract classAnimal
{
public abstract void eat();
}
class Cat extendsAnimal
{
public void eat()
{
System.out.println("吃鱼");
}
public void CatchMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extendsAnimal
{
public void eat()
{
System.out.println("吃骨头");
}
public void KanJia()
{
System.out.println("看家");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
Cat c = new Cat();
c.eat();
Dog d = new Dog();
d.eat();
Cat c1 = new Cat();
c1.eat();
Cat c2 = new Cat();
c2.eat();
}
}
在上面的代码中我们可以看出,在主函数中,每种动物要想实现eat方法就得先new个对象,然后再调用eat方法(如c,d),即便是同一种动物的不同个体也仍然如此(如c,c1,c2),这样代码的复用性就很差了。基于此,我们就可以用多态来表现,并用他们的父类Animal来抽取共性方法,相应的代码如下:
public static voidfunction(Animal a)//Animal a = new Cat();
{
a.eat();
}
这样在主函数中直接用调用此方法后就可以了,这就提高了程序的扩展性和代码的复用性,因为在后续的任何动物中都可以直接调用,如function(newCat());function(new Dog());等等。
2 多态的前提
通过的上面的示例我们知道多态必须是类与类有继承或者类与接口有实现关系时才可以,通常还有一个前提也即存在覆盖,这是很显然的,因为如果没有覆盖,在上例中我们在多态后怎么来调用子类共同的eat方法,这样显然就没意义了,这里也暴露出多态的一个弊端,也即只能是父类的引用调用父类的方法。
3 多态的好处
把不同的子类对象都当做父类来看,屏蔽了不同子类对象之间的差异,抽取共性,写出通用代码,以适应需求的变化。提高的程序的扩展性。Java语言通过集成过程中的方法覆盖,接口的实现以及方法实现时的动态绑定来实现多态,从而达到不同的对象各自按照自身的需求对同一消息进行正确处理的目的。
4 多态如何应用
那么,对于多态我们如何来应用呢?我们知道在多态后我们可以调用父类的方法类实现功能,那么我们怎么来实现每个子类特有的方法呢?这就要就行类型的转换,也即当我们欲调用子类的特有方法时,可以通过代码:Cat c =(Cat) a;来实现类型的向下转型,然后再调用子类特有的方法。所以,我们可以看出,多态一直都是针对子类对象在做变化,我们能转换的是父类的引用指向自己的子类对象时,该引用可以被提升,也可以被强制转换。