Java基础十一--多态
一、多态定义
简单说:就是一个对象对应着不同类型.
多态在代码中的体现:
父类或者接口的引用指向其子类的对象。
/* 对象的多态性。 class 动物
{} class 猫 extends 动物
{} class 狗 extends 动物
{} 猫 x = new 猫(); 动物 x = new 猫();//一个对象,两种形态。 猫这类事物即具备者猫的形态,又具备着动物的形态。
这就是对象的多态性。 简单说:就是一个对象对应着不同类型. 27 多态在代码中的体现:
28 父类或者接口的引用指向其子类的对象。 多态的好处:
提高了代码的扩展性,前期定义的代码可以使用后期的内容。 多态的弊端:
前期定义的内容不能使用(调用)后期子类的特有内容。通过向下转型来解决。 多态的前提:
1,必须有关系,继承,实现。(实现是特殊的继承)
2,要有覆盖。 */ abstract class Animal
{
abstract void eat(); } class Dog extends Animal
{
void eat()
{
System.out.println("啃骨头");
}
void lookHome()
{
System.out.println("看家");
}
} class Cat extends Animal
{
void eat()
{
System.out.println("吃鱼");
}
void catchMouse()
{
System.out.println("抓老鼠");
}
} class Pig extends Animal
{
void eat()
{
System.out.println("饲料");
}
void gongDi()
{
System.out.println("拱地");
}
} class DuoTaiDemo
{
public static void main(String[] args)
{ // Cat c = new Cat();
// c.eat();
// c.catchMouse(); 98 Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。
99 //作用就是限制对特有功能的访问。
100 //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。 // a.eat(); //如果还想用具体动物猫的特有功能。
//你可以将该对象进行向下转型。
107 // Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。
// c.eat();
// c.catchMouse(); // 注意:对于转型,自始自终都是子类对象在做着类型的变化。
// Animal a1 = new Dog();
// Cat c1 = (Cat)a1;//ClassCastException /*
Cat c = new Cat(); // Dog d = new Dog(); // c.eat();
method(c);
// method(d);
// method(new Pig());
*/ method(new Dog()); } public static void method(Animal a)//Animal a = new Dog();
{
a.eat();
//解决类型匹配问题的时候,我们就可以判断一下
135 if(a instanceof Cat)//instanceof:用于判断对象的具体类型。只能用于引用数据类型判断
136 // //通常在向下转型前用于健壮性的判断。 {
Cat c = (Cat)a;
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog d = (Dog)a;
d.lookHome();
}
else
{ } }
/*
public static void method(Cat c)
{
c.eat();
}
public static void method(Dog d)
{ }
*/
}
向上转型:父类引用指向子类对象。子类的特有功能无法访问。
向下转型:子类引用指向父类对象。
Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。
//作用就是限制对特有功能的访问。
//专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。 Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。
在实际应用中,向上转型便于代码扩展(之前写的代码以后能用,只有继承或者实现基类了的),但是要用到子类特有的功能的时候,必须向下转型。
很多时候我们向上转型为Object类,当用到自己特有功能的时候,我们向下转型转回来。
二、多态生活实例
/*
毕老师和毕姥爷的故事。
*/ class 毕姥爷
{
void 讲课()
{
System.out.println("管理");
}
void 钓鱼()
{
System.out.println("钓鱼");
}
} class 毕老师 extends 毕姥爷
{
void 讲课()
{
System.out.println("Java");
}
void 看电影()
{
System.out.println("看电影");
}
} class DuoTaiDemo2
{
public static void main(String[] args)
{ //原来
// 毕老师 x = new 毕老师();
// x.讲课();
// x.看电影();
//多态
毕姥爷 x = new 毕老师();
x.讲课(); //这里讲的是Java的内容,Java把管理学覆盖了
x.钓鱼(); 毕老师 y = (毕老师)x;//ClassCastException
y.看电影(); }
}