Day08多态,abstract,接口

Day08多态,abstract,接口

   B:多态前提:要有继承关系,方法重写和父类引用子类对象。

                            父类引用子类对象:Animal a = new Cat();

                                                             a.eat();    //效果等同于c.eat();

2.多态中的成员访问特点

  A.成员变量:编译看左边(父类),运行看左边(父类)。

  B.成员方法:   编译看左边(父类),运行看右边(子类)。也叫做动态绑定。

  C.静态方法:    编译看左边(父类),运行看左边(父类)。

  总结:(静态和类相关,算不上重写,所以,访问还是左边的)

  只有非静态的成员方法,编译看左边,运行看右边。

3.多态的向上转型和向下转型

Person p = new SuperMan();//父类引用指向子类对象就是向上转型

父类创建的对象不能直接调用子类的属性和方法,如果想调用子类方法必须得执行向下转型操作。

Superman sm = (Superman)p;//向下转型。

4.多态的好处和弊端

A:多态的好处

        a:提高了代码的维护性(继承保证)

        b:提高了代码的扩展性(由多态保证)

B:多态的好处

        可以当作形式参数,可以接受任意子类对象

    //注意:Animal a = new Cat();开发中很少再创建对象的时候用父类引用指向子类对象,反而直接创建子类对象

    public static void main(String[] args){    //当作参数的时候用多态最好,因为扩展性强。

                method(new Cat());

                method(new Dog());//想这样使用的前提是,Dog类和Cat类中都必须含有eat()方法。

}

public static void method(Animal a){

               a.eat();

}

C:多态的弊端

5.抽象类

A.概述:就是看不懂的。

B.特点

    *a:抽象类和抽象方法必须用abstract关键字修饰

        *abstract calss 类名 { }

        *public abstract avoid eat();注意二点,1.没有{}。2.当不知道如何实现该方法时,用抽象类方法这样写着先。

    *b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口

    *c:抽象类不能实例化(创建对象)那么,抽象类如何实例化呢?

        *按照多态的方式,由具体的子类实例化(父类引用指向子类对象)。其实这也是多态的一种,抽象类多态。

    *d:抽象类的子类

        *要么是抽象类

        *要么重写抽象类中的所有抽象方法

6.A.抽象类的成员特点(回忆案例 葵花宝典来记忆)

    a.成员变量:既可以是变量,也可以是常量。abstract是不能修饰成员变量。

    b.构造方法:有。如果子类有构造方法,那么父类中也必须写出抽象类构造方法。

        *用于子类访问父类的初始化

 B:抽象类的成员方法特性:

  a:抽象方法 强制要求子类做的事情。(可以这样理解,父类的构造方法没有内容,强制子类写出有内容的构造方法)

    b:非抽象方法 子类继承的事情,提高代码复用性。

 

7.接口(一个类不写出继承哪个类,系统会默认指定该类继承object类)

A.概述

    *从狭义的角度讲就是指java中的interface

    *从广义的角度将对外提供规则的都是接口

B.接口特点

    *a:接口用关键字interface表示

            *interface 接口名 { }  //接口中的方法必须是抽象的

    *b:类实现接口用implements表示

            *class 类名 implements 接口名 { }

    *c:接口不能实例化

            *那么,接口如何实例化呢?

                按照多态的方式来实例化。(也就是父类引用指向子类对象)

    *d:接口的子类

            *a:可以是抽象类。但是意义不大。

            *b:可以是具体类。要重写接口中的所有抽象方法。(推荐)

8.接口中的成员特点

A.成员变量:只能是常量,并且是静态的并公共的。

                *默认修饰符:public static final(系统会自动加上)

                *建议:自己手动给出

B.构造方法:接口没有构造方法。

C.成员方法:只能是抽象方法。

                *默认修饰符:public abstract

                *建议:自己手动给出

 

9. 抽象类和接口的区别

A.成员区别:

*抽象类:

*成员变量:可以变量,也可以常量

*构造方法:有

*成员方法:可以抽象,也可以非抽象

*接口:

*成员变量:只可以常量

*构造方法:无

*成员方法:只可以抽象

 

B.类与类,类与接口,接口与接口的关系

    a.类与类:继承关系,只能单继承,可以多层继承。

    b.接口与接口:继承关系,可以单继承,可以多继承。

    c.类与接口:*实现关系,可以但实现,也可以多实现。

                        *并且还可以在继承一个类的同时实现多个接口。

C.设计理念区别

*抽象类 被继承体现的是:“is  a”的关系。抽象类中定义的是该继承体系的共性功能。

*接口 被实现体现的是:“like a”的关系。接口中定义的是该