本帖最后由 嗬嗬嗬_000 于 2015-7-25 22:17 编辑
多态定义:
某一类事物的多种存在形态.
例: 动物中的猫,狗. 对象的多态性猫和狗都继承于动物 class Animal{}class Cat extends Animal{}
class Dog extends Animal{}对象cat即具备Cat形态又具备Animal 形态 Cat cat = new Cat();
Animal cat = new Cat();这个就是对象的多态性(一个对象,两种形态)
多态子啊代码中的体现:
父类或者接口引用指向其子类对象 多态的好处有一个动物类Animal - abstract class Animal{
- abstract void eat();
- }
复制代码
有其他多个类猫,狗继承于动物类 - <pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; margin-bottom: 16px; padding: 16px; line-height: 1.45; border-radius: 3px; word-wrap: normal; color: rgb(51, 51, 51);"><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">class Cat extends Animal{
- void eat(){
- System.out.println("吃鱼")
- }
- }
- class Dog extends Animal{
- void eat(){
- System.out.println("吃鱼")
- }
- }</code></pre>
复制代码
这时,如果给多个猫运行eat的方法,再给狗运行eat方法时: - method(new Cat());
- method(new Cat());
- method(new Dog());
- void method(Cat c){
- c.eat;
- }
- void method(Dog g){
- g.eat;
- }
复制代码
如果后期再添加其他继承于动物的类,就会发现需要重复写 method方法来实现eat方法.
这时,如使用多态特性,只需要一个方法: - void method(Animal a){
- a.eat;
- }
复制代码
就可以轻松实现.
所以,多态的好处显而易见:
提高了代码的扩展性前期定义的代码,可以使用后期的内容. 多态的局限性要使Cat加一个catchMouse方法时不能实现. - void method(Animal a){
- a.eat;
- a.catchMouse;
- }
复制代码
所以多态的局限性是:
不能使用(调用)子类特有的内容
多态的前提: 多态_转型向上转型自动类型提升,Cat对象提升为Animal类型.这时Cat访问就出现了局限性,无法访问到其的特有功能. Animal a = new Cat();a.eat;作用:限制对特有功能的访问. 向下转型如果还想用具体对象的特有功能,这时可以将对象向下转型 Cat c = (Cat)a;
c.eat();
c.catchMouse();向下转型的目的:为了使用子类中的特有方法. 注意对于转型,自始自终都是子类对象再做着类型的变化. 如果创建一个Animal对象,无法将其进行向下转型 //错误
Animal a = new Animal();
Cat c1 = (Cat) a;创建的对象也只能被转换成对应的子类对象,如转换成其它子类对象,会导致类型转换异常 //错误
Animal a = new Dog();
Cat c = (Cat) a;
多态_类型判断instanceof
用于判断对象的具体类型,只能用于引用数据类型判断.通常在向下转型前用于健壮性的判断.
加入逻辑判断,增强代码的健壮性 - public static void method(Animal a){
- a.eat;
- if(a instanceof Cat){
- Cat c = (Cat)a;
- }
- if(a instanceof Dog){
- //...
- }
- }
复制代码
多态_成员特点多态时,成员的特点 成员变量的特点- 编译时:参考引用型变量所属的类中是否有调用的成员变量,有则编译成功.没有就编译失败.
- 运行时:参考引用型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员变量.
简单的来说:编译和运行都参考左边.
- class Fu{
- int num = 3;
- }
- class Zi{
- int num = 4;
- }
- class DuoTai{
- public static void main(String[] args){
- Fu f = new Zi();
- System.out.println("num="f.num);
- }
- }
复制代码
运行结果为:
num=3;原因:实例化以后,子类已经提升为父类型了,所以找的是父类的num.(覆盖只发生在函数上)
当删除父类中的 num = 3;语句,编译时报错,因为提升为父类型后,其中没有num变量了. 成员函数(非静态)的特点- 编译时:参考引用型所属的类中是否有调用的函数,有则编译成功,没有则编译失败
- 运行时:参考的是对象所属的类中是否有调用的函数.
简单的来说:编译看左边,运行看右边.
- class Fu{
- void show(){
- System.out.println("fu show");
- }
- }
- class Zi extends Fu{
- void show(){
- System.out.println("fu show");
- }
- }
- class DuoTai{
- public static void main(String[] args){
- Fu f = new Zi();
- f.show();
- }
- }
复制代码
运行结果:
zi show去除父类中的方法后,会编译失败. 静态函数的特点- 编译时:参考引用型变量所属的类中是否有调用的静态方法,有则编译成功.没有就编译失败.
- 运行时:参考引用型变量所属的类中是否有调用的静态方法,并运行该所属类中的成员变量.
简单的来说:编译和运行都参考左边. - <pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; margin-bottom: 16px; padding: 16px; line-height: 1.45; border-radius: 3px; word-wrap: normal; color: rgb(51, 51, 51);"><code class="java" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">class Fu{
- static void method(){
- System.out.println("fu static run");
- }
- }
- class Zi extends Fu{
- static void method(){
- System.out.println("zi static run");
- }
- }
- class DuoTai{
- public static void main(String[] args){
- Fu f = new Zi();
- f.method();
- }
- }</code></pre>
复制代码
运行结果: fu static run非静态依赖的是对象,必须动态绑定在指定的对象上,但静态方法不需要.不依赖于对象,依赖于类型.
|