黑马程序员技术交流社区

标题: 多态理解 [打印本页]

作者: 甘家利    时间: 2013-1-15 13:12
标题: 多态理解
多态(polymorphism)
       一个对象变量可以指向多种实际类型的现象。
多态分两种:
① 编译时多态:编译时动态重载; Ainmal ainmal = new Dog();
②运行时多态:指一个对象可以具有多个类型。 ainmal.sleep();
对象是客观的,人对对象的认识是主观的。
例:
Animal a=new Dog();查看格式名称;(编译时看左边,运行时看右边)
Dog d=(Dog)a。声明父类来引用子类。(强制转换)
(思考上面的格式)
运行时多态的三原则:(应用时为覆盖)
1、 对象不变;(改变的是主观认识)
2、 对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。
在上面的例子中:Animal a=new Dog();对象a的编译时类型为Animal,运行时类型为dog。
注意:编译时类型一定要为运行时类型的父类(或者同类型)。
对于语句:Dog d=(Dog)a。将d强制声明为a类型,此时d为Dog(),此时d就可以调用运行时类型。注意:a和d指向同一对象。属性看父类,方法看子类.
3、 在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。

关系运算符:instanceof
a  instanceof Animal;(这个式子的结果是一个布尔表达式)
a为对象变量,Animal是类名。
上面语句是判定a是否可以贴Animal标签。如果可以贴则返回true,否则返回false。
在上面的题目中: a instanceof Animal返回 True,
                 a instanceof Dog也返回 True,
instanceof用于判定是否将前面的对象变量赋值后边的类名。
Instanceof一般用于在强制类型转换之前判定变量是否可以强制转换。
如果Animal a=new Animal();
Dog d= (Dog)a;
此时编译无误,但运行则会报错。
Animal a=new Dog()相当于下面语句的功能:
Animal a=getAnimal();
Public static Animal.getAnimal(){
Return new Dog();
}

1、静态多态(方法重载)
2、动态多态(基于继承)---->引用多态
public class Animal{
public void talk(){
  System.out.println("?????????");
}
}
public class Cat extends Animal{
public void talk(){System.out.println("miao miao");}
}
public class Dog extends Animal{
public void talk(){System.out.println("wang wang");}
}

Animal an=new Cat();
an=new Dog();

在引用多态的场景中,一个引用变量能够做什么由类型决定,怎么做由对象决定
  Animal an=new Cat();

作者: 许庭洲    时间: 2013-1-15 19:39
值得学习ing!
作者: hhk_java    时间: 2013-1-15 20:51
正好学到这个地方,学习下!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2