天天看点

黑马程序员——关于多态

 ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

3.11 多态

   1、多态的体现:父类的引用指向了自己的子类对象,

   2、好处:大大提高程序的扩展性

   3、前提:必须有关系:继承,接口.必须存在覆盖

   4、弊端:虽提高了扩展性,但是只能使用父类的引用访问父类中的成员

   5、多态的应用:

   6、多态时,成员的特点

      1)、成员函数:在编译时,参阅引用型变量中所属的类中的是否有调用的成员变量,有,编译通过,否则,失败。在运行时,参阅对象所属的类中是否有调用的方法

简单总结:成员函数在多态调用时,编译看左边,运行看右边

    以下注意面试题

      2)、成员变量:无论编译,还是运行都参考引用型变量中所属的类中的是否有调用的成员变量,有,编译通过,否则,失败。即左边

      3)、静态函数:从某种意义上讲,不涉及多态。

  7、代码示例:

abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
void catchMouse(){
System.out.println("抓老鼠");
}
void eat() {
System.out.println("吃鱼");
}
}
class Dog extends Animal{
void watchHome(){
System.out.println("看家");
}
void eat() {
System.out.println("吃骨头");
}
}
class Pig extends Animal{
void watchHome(){
System.out.println("看家");
}
void eat() {
System.out.println("饲料");
}
}
public class AboutPolymorphic {
public static void main(String[] args) {
/* Cat c = new Cat();
c.eat();
Dog d = new Dog();
d.eat();
Pig p = new Pig();
//为了提高以上代码的复用性,于是将eat功能提取出来写成function函数
function(c);
function(d);
function(p);
//可是当我们要扩展功能,比如加个pig,这样的话有得写function功能,可是function函数都一样,为了提高代码的复用性
*/
//一个事物的多种存在形态
// Animal a = new Cat(); //类型提升,向上转型
//c.eat();
//Cat c = (Cat)a;
//如果想要调用猫的特有方法,强制将父类的引用,转换成子类类型,即向下转型
/*注意:①千万不要出现这样的操作,就是将父类对象转换子类类型。
②我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
③多态自始至终都是子类对象在做着变化
*/
//c.catchMouse();
function(new Cat());
function(new Dog());
function(new Pig());
}
public static void function(Animal a){
a.eat();
if(a instanceof Cat){//类型判断:instanceof
//作用:用于判断对象的具体类型,只能用于引用数据类型判断,以及在向下转型前用于健壮性的判断
Cat c = (Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog d = (Dog)a;
d.watchHome();
}
}
/*public static void function(Cat c){
c.eat();
}
public static void function(Dog d){
d.eat();
}
public static void function(Pig p){
p.eat();
}*/
}      

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ---------------------- 

继续阅读