------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、多态
1.多态概述
定义:某一类事物的多种存在形态。
例:动物中猫,狗。
猫这个对象对应的类型是猫类型:猫 x = new 猫();
同时猫也是动物中的一种,也可以把猫称为动物:动物 y = new 猫();
动物是猫和狗具体事物中抽取出来的父类型。父类型引用指向了子类对象。
例:动物中猫,狗。
猫这个对象对应的类型是猫类型:猫 x = new 猫();
同时猫也是动物中的一种,也可以把猫称为动物:动物 y = new 猫();
动物是猫和狗具体事物中抽取出来的父类型。父类型引用指向了子类对象。
多态性简单说就是一个对象对应着不同类型。
体现:
父类或者接口的引用指向或者接收自己的子类对象。
作用:
多态的存在提高了程序的扩展性和后期可维护性。
前提:
1. 需要存在继承或者实现关系。
2. 需要有覆盖操作。
好处:
提高了代码的扩展性,前期定义的代码可以使用后期的内容。
弊端:
前期定义的内容不能使用(调用)后期子类的特有内容。
示例:
/**
* 需求:演示多态
* 思路:程序中注释部分
* @author jinlong
* */
package com.blog.part2.继承;
//定义抽象类Animal
abstract class Animal
{
abstract void eat();
}
//定义抽象类的子类Dog
class Dog extends Animal
{
//重写了抽象类eat方法
void eat()
{
System.out.println("啃骨头");
}
//他还有自己的特有方法
void lookHome(){
System.out.println("看家");
}
}
//类似上边Dog类,再定义一个Cat类
class Cat extends Animal
{
void eat()
{
System.out.println("吃鱼");
}
//同样有自己的特有方法
void catchMouse()
{
System.out.println("抓老鼠");
}
}
//与cat、Dog类似
class Pig extends Animal
{
void eat()
{
System.out.println("饲料");
}
void gongdi()
{
System.out.println("拱地");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
//自动类型提升,猫对象提升到了动物类型。但是特有功能无法访问,作用就是限制对特有功能的访问。
//专业讲:向上转型,将子类型隐藏。就不能使用子类的特有方法了。
Animal a = new Cat();
//但是还可以使用覆盖自父类的方法eat
a.eat();
//a.catchMouse();//报错,
//如果还想用具体动物猫的特有功能。
//你可以将该对象进行向下转型。
Cat c = (Cat)a; //向下转型的目的是为了能够使用子类中的特有方法。
c.eat();
c.catchMouse();
//注意:对于转型,自始至终都是子类对象在做类型的变化。
//Animal a = new Dog();
//Cat c = (Cat)a;//但是类型不能随意转换,否则可能会报出ClassCastException