A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© MartinYu 中级黑马   /  2016-7-1 22:09  /  674 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 MartinYu 于 2016-7-1 22:15 编辑

day09课堂笔记
        一.多态
        1.事物的多种形态
        特点:
        1)有继承关系
        2)子类重写父类的方法
        3)父类引用指向子类对象
       
        多态举例:
        class Father {}
        class Son extends Father{}
        class Test {
                public static void main(String[] args){
                        //原来
                        Son s = new Son();
                        //多态
                        Father fa = new Son();
                }
        }
       
        2.多态的故事
        花木兰替父从军
        花爹  爹 = new 花木兰();
       
        成员变量 : 编译看左边(父类),运行看左边(父类);
                军队点名:
                报花爹 (他爹的名字) ----  88 (他爹年龄)
       
        成员方法: 编译看左边(父类)看他父亲有没有这个方法,有编译成功,没有编译失败,运行看右边(子类)运行花木兰的方法;
                打仗:
                打仗的时候(方法)  ----- > 花木兰去打仗(他爹必须有打仗的方法)
         
                注释:
                父类中必须要有这个方法编译才能通过,运行的时候执行的是子类的这个方法(子类重写父类方法);
         
         问题:子类特点有方法,父类引用能不能调用?
          他两都有打仗的方法fly();
          花木兰打仗 ---- 匕首
          花木兰他爹 ---- 长矛
          花木兰特点有方法: 跳舞  dance();
          FlowerDady  dady = new FlowerTreeGirl();
          dady.fly();  ----  打仗用匕首
          dady.dance() ----  这个编译报错. 父类引用不能调用子类特有的方法
          
         静态方法:
                编译看左边,运行还看左边(静态绑定)
                花木兰(引用的名字是花爹)-----> 打赢了----->  皇上知道了-----> 昭告天下(封了花爹为大元帅)--->把照片贴到城墙上
                这时候花木兰就永远变成了花爹.
                调用方法的时候, 永远看花爹跟花木兰绑定的人-----> 运行看左边
       
        多态的好处和弊端:
        好处:1)提高代码的维护性  (多态的前提是继承)
                2) 提高代码的扩展性  
       
        //Animal   DOg     Cat    共同的eat    dog---lookHome    cat---catchMouse     
        class Test {
                public static void main(String[] args){
                        Animal an = new Dog();
                        Animal an2 = new Cat();
                        Cat c = new Cat();
                        test(c);   //可以传递子类对象
                        test(new Dog())
                }
               
                //问题: 接受的是父类,能不在调用的时候传递Animal的子类
                public static  void  test(Animal an){
                        an.eat();  //调用Animal中的方法
                        //加一个判断
                        if( an instanceof Cat){  //判断an是不是cat,如果是返回true
                                Cat c = (Cat)an;
                                c.catchMouse();
                        }
                        if (an instanceof Dog){  //判断an是不是dog,如果是返回true
                                Dog d = (Dog)an;
                                d.lookHome();
                        }
                }
        }               
       
        弊端: 必能使用子类的特有属性和方法.
       
        二.抽象类
                抽象类是什么? 有什么作用
                抽象类也是描述一个类事物,但是自己本身不实现,让子类去继承并且重写. (抽象类设定了方法签名--- 规则)
                规则强制子类重写父类的抽象方法,防止子类设计的随意化.
               
                特点:
                1)被Abstract修饰的类
                2)抽象类不一定有抽象方法(抽象类可以有非抽象的方法也可以有抽象方法), 有抽象方法的一定是抽象类或者即接口
                3)抽象类不能实例化(创建该类对象),但是可以按照多态方式,创建子类对象,指向该父类(可以是抽象类)引用.
                4)抽象类的子类要么就是抽象类,要么就不是抽象类,如果不是抽象类,就必须重写父类中的所有抽象方法.

                格式:
                abstract 类名 {
                        int a = 10;  //变量不用Abstract修饰
                        //方法可以用Abstract修饰
                        public abstract void print();  //抽象方法没有方法体
                       
                        也可以不用Abstract修饰
                        public  void method(){}
                       
                }
               
                抽象类成员特点:
                        1) 抽象类中成员变量可以是变量,也可以是常量。变量不能用abstract修饰。
                        2)抽象类有构造方法。用于子类访问父类数据的初始化。
                        3)成员方法:既可以是抽象的,也可以是非抽象的。
                        4)抽象方法强制要求子类做的事情;非抽象方法子类继承的事情,提高代码复用

1 个回复

倒序浏览
哪里来的朋友?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马