黑马程序员技术交流社区

标题: 面向对象第四天_多态 [打印本页]

作者: xiaobokk    时间: 2016-8-3 22:10
标题: 面向对象第四天_多态
多态:
        多态概述:事物存在多种状态

        多态前提:
                A:要有继承;
                B:要有方法重写;
                C:要有父类引用指向子类对象.
       
        多态中的成员访问特点:
                成员变量: 编译看左边,运行看左边
                                可以理解为子类对象在堆内存中有一块super区域,
                                而父类的引用指向了它,所以运行的结果为左边

                成员方法: 编译看左边,运行看右边
                                在编译的时候会看在父类中有没有该方法,但是在运行的时候
                                会运行子类的成员方法,这叫做动态绑定.

                静态方法: 编译看左边,运行看左边
                                理解为和类相关的方法,算不上重写,所以访问的是父类的

        多态中的向上转型和向下转型:
                由子类向父类的转型叫做向上转型;
                        --> Person p = new superMan();

                有父类向子类的强行类型转换叫做向下转型;
                        --> superMan sm = (superMan) p;
       
        多态的好处和弊端:
                好处:
                        A:提高了代码的复用性(有继承保证)
                        B:提高了代码的扩展性(有多态保证)
                弊端:
                        不能使用子类特有的属性和方法


       另附两道题:
       
[Java] 纯文本查看 复制代码
class Fu {
                        public void show() {
                                System.out.println("fu show");
                        }
                }
       
                class Zi extends Fu {
                        public void show() {
                                System.out.println("zi show");
                        }
       
                        public void method() {
                                System.out.println("zi method");
                        }
                }
       
                class Swap {
                        public static void main(String[] args) {
                                Fu f = new Zi();
                                //f.method();                //编译看左边,会报错
                                f.show();                        //编译看左边,运行看右边,结果是zi show
                        }
                }


[Java] 纯文本查看 复制代码
class A {
        public void show() {
                show2();
        }
        public void show2() {
                System.out.println("我");
        }
}
class B extends A {
        public void show2() {
                System.out.println("爱");
        }
}
class C extends B {
        public void show() {
                super.show();
        }
        public void show2() {
                System.out.println("你");
        }
}
public class Swap {
        public static void main(String[] args) {
                A a = new B();        //父类的引用指向子类的对象
                                                //父类中有show()编译通过,子类中没有show(),调用父类的show()
                                                //父类中的show()调用show2(),如果有一样的话,调用子类的方法
                a.show();                //爱       
               
                B b = new C();        //父类的引用指向子类的对象
                                                //父类中有继承的show()方法,所以编译不报错,
                                                //调用B父类的show()方法,方法体内调用的是show2()方法
                                                //父类中的show()调用show2(),如果有一样的话,调用子类的方法
                b.show();                //你
        }
}






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