多态:
体现:父类的引用指向了自己的子类对象。
Animal a = new Dog();
好处:提高了程序扩展性,提高代码复用性,
弊端:通过父类引用操作子类对象时,只能使用父类中已有的方法。不能操作子类所特有的方法。
前提:类之间必须有关系:可以为继承,可以为实现,通常都有重写的方法。
1,转型:子类的特有的方法如何调用呢?
animal a = new dog();//animal是父类型,new dog 是子对象。
但是父类型引用指向子类对象时,这就是让子类对象进行了类型的提升(向上转型),
好处:提高了扩展性,隐藏了子类型。弊端:不能使用子类型的特有方法。
如果要想使用子类的特有方法,只有子类型可以用。
可以向下转型,然后强制转换:
animal a = new dog();
a。eat();
Dog d = (Dog)a;//强制类型转换
d。lookhome();//然后可以调用子类的方法。
当需要使用子类的特有方法时 需要向下转型;
无论向上转型还是向下转型,最终都是子类对象做着类型的变化。。
转型总结:
1,什么时候使用向上转型,1,提高程序扩展性,不关系子类型时(子类型被隐藏);
2,不需要使用子类型的特有方法时,,
2,什么时候使用向下转型?
1,需要使用子类型的特有方法时,
但需要使用 instanceof 进行类型判断,避免发生类型转换异常。
多态:体现:
1,成员变量的特点:
当子父类中出现同名的成员变量时,
多态调用该变量时:编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量,没有的话则会编译失败。运行时期:也是调用引用型变量所属的类中的成员变量。
简单记:编译和运行时都要看等号左边的类型,则该成员变量所属于的类型就是左边的类型,编译和运行都是看左边。
2,成员函数
编译:参考左边,如果引用型变量所属的类中没有被调用的成员函数,则会编译失败,运行的话参考右边对象所属的类,编译看左边,运行看右边。
3,静态函数
静态函数是静态的绑定到类上。不绑定对象,加载时还没有对象。
对于静态成员函数,编译和运行都参考左边。
一般情况,静态方法是不会被多态调用的,因为静态方法不属于所属对象,而是所属于类。
结论:对于成员变量和静态函数,编译和运行都看左边。
对于成员函数,编译看左边,运行看右边。
|
|