------- android培训、 java培训、期待与您交流! ----------
/**
关于多态:
多种形态。
这里重点讲的就是对象的多态
狗 x=new 狗();
//狗类型,引用狗对象
动物 y=new 狗();
//动物类型,引用狗对象 对象的多态性,狗对象即是狗类型,又是动物形态
必须明确一点:狗是动物中的一种。
意味着狗是需要继承动物的才可以这样指向
多态性:在程序中的体现。
就是:父类或者接口的引用指向自己的子类对象。
好处:提高了代码的扩展,只要继承了就可以用
弊端:前期建立父类的引用虽然可以接受后期所有该类的子类对象
但是只能使用父类中的功能,不能使用子类的特有功能
因为前期的程序无法知道后期的子类的特有内容的。
但是前期的程序可以使用子类覆盖了父类的方法的内容。
前提:1必须存在继承关系
2通常要有覆盖操作。
*/
//抽象类Animal
abstract class Animal
{
abstract void eat();
}
class Dog extends Animal
{
public void eat()
{
System.out.println("狗:吃骨头");
}
public void println()
{
System.out.println("看家");
}
}
class Cat extends Animal
{
public void eat()
{
System.out.println("猫:吃鱼");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
class Pig extends Animal
{
public void eat()
{
System.out.println("猪:饲料");
}
public void gongDi()
{
System.out.println("拱地");
}
}
class Demo35
{
public static void main(String[] args)
{
Dog d=new Dog();
Cat c=new Cat();
method(d);
//这个d只能指向狗
//调用Dog类的所有方法
Dog d=new Dog();
//这个d即可以指向狗,猫也可以指向任何Animal的子类对象。。类型提升
//只能调用Dog类继承的Animal类的方法。。
Animal d=new Dog();
/**
Dog a=(Dog)d; 向下强制转型为子类
如果类型转换错误,会出现运行异常(不是编译失败)如:Cat a=(Dog)d 把Dog转成了猫
向上转型Animal d=new Dog():当需要对程序进行扩展,或者限定对象的方法操作时,使用向上转型。即操作其父类
向下转型Dog a=Dog(d) :当需要使用子类的特有内容时,就需要向下转型,转型前一定要判断,否则易出问题
注意:在这个转换过程中,自始至终都是一个子类对象在做着类型的变化而已。
千万别把父类对象转成子类型,那是不可能的
例如:
Animal a=new Animal();
Dog d=(Dog)a;
错误
*/
}
//同一处理多个对象共有特性行为,多态好处
public static void method(Animal s)//Animal s=new s类();
{
s.eat();
/**
s.catchMouse();出现错误,动物类型抽象Animal类中无此方法
需要进行强制向下转型,才能使用子类的方法,
主函数里边的是多态对象才可用:Anima a=new cat(); 并且属于Cat类
否则出先类型转换异常
*/
/**
在进行子类特有方法使用时,要进行向下转型
转型前一定要判断。否则编译正常,运行异常容易发生ClassCastException
判断引用类型,要使用关键字完成。关键字:instaceof
对象 instaceof 类型
*/
if(a instance of Cat)
{
Cat c=(Cat)a;
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog d=(Dog)a;
d.lookHome();
}
else if(a instanceof pig)
{
}
else if(……)
{
……
}
else
……
}
/*
此方法麻烦,所有用多态
public static void method(Dog d)
{
d.eat();
}
public static void method(Cat c)
{
c.eat();
}
*/
}
---------------
向上向下转型练习
class 毕姥爷
{
void 讲课()
{
System.out.printl("管理");
}
void 钓鱼()
{
System.out.println("钓鱼");
}
}
calss 毕老师 extends 毕姥爷
{
//继承父类 讲课()方法并修改
void 讲课()
{
System.out.printl("java");
}
void 看电影()
{
System.out.println("看电影");
}
/**
不用写继承的父类方法,因为不是抽象方法
void 钓鱼()
{
System.out.println("钓鱼");
}
*/
}
class DuoTaiDemo2
{
public static void main(String[] args)
{
毕姥爷 x=new 毕老师();//向上转型
x.讲课();
x.钓鱼();
毕老师 y=毕老师(x);//向下转型
}
}