22天学习java基础笔记之day09

Day09 接口 多态 instanceof

一、接口

1、概述

        接口是特殊的抽象类,所有的属性都是公开静态常量(全局常量),所有的方法都是公开抽象方法而且没有构造方法

2(思想)特点

                **接口是对外暴露的规则。

        **接口是程序的功能扩展。

        **接口的出现降低耦合性。

        **接口可以用来多实现。

类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。接口与接口之间可以有继承关系。

3、接口的使用

        类实现接口的时候,要么全部实现接口中的方法,要么类本身定义为抽象类。接口不能被实例化,所有成员有固定修饰符。

注意:

        *如果接口默认的方法是public和abstract,可以省略不写,但是类在实现接口时,不可省public

        *如果接口的返回值不是void,那么类实现该接口时,方法体中必须有return语句;

        *如果接口的返回值是void,大括号内可以没有语句。

        *如果父类实现了某个接口,子类也自然实现了该接口。

4、接口和抽象类的区别--------都是不断向上抽取出来的

        A:抽象类只能单继承,接口可以多实现。

        B:抽象类中可以由非抽象方法。抽象类中可以定义变量和常量。接口中的方法都是抽象的。接口中只能有静态常量。因为接口中的方法都有默认修饰符:public abstract;接口中的成员变量都有默认修饰符:public static final

        C:抽象类中定义的是一个体系的共性功能。接口中通常定义的对象中的扩展功能。

        D:接口的出现避免了单继承的局限性。

        E:抽象类被继承表示的是:is a 的关系。叫做:xx是yy的一种。 接口被实现表示的是:like a 的关系。叫做:xx像yy一种。

5、举例

        学会分析什么时候使用抽象类,什么时候使用接口。

        他们代表两种不同的设计思想。

二、多态

1、概述

        事物的多种形态。它分为静态多态(重载)和动态多态(对象的多态)

2、特点

体现:多态用在方法的参数上m(A a)可以用A的任何一个子类对象作为参数。

          多态用在方法的返回值上A m() m方法返回的可能是A的子类对象。

父类引用或者接口引用执行子类的对象。

前提:    A:类与类(接口)之间有继承(实现)关系。

                        B:必须有重写。

                        C:父类引用指向子类对象。

多态的成员特点:

        A:成员变量

                编译看左边,运行也看左边。

编译--参考的是引用类型变量所属的类中是否有调用的成员变量,如果有,编译通过,         如果没有,编译失败。

运行--调用的也是引用类型变量所属类中的成员变量。                                     

        B:成员方法-------依赖于对象

                编译看左边,运行看右边。

编译--参考的是引用类型变量所属的类中是否有调用的方法,如果有,编译通过,                如果没有,编译失败。

运行--调用的是对象所属类中是否有调用的方法,如果有,运行子类自己的方法;如果没有就调用父类的方法。      

函数有一个覆盖的特性。     

        C:静态方法------不依赖于对象

                编译看左边,运行也看左边。   

编译--参考的是引用类型变量所属的类中是否有该方法,如果有,编译通过,如果没有,编译失败。

运行--调用的也是引用类型变量所属类中的方法。                                             

3、好处

        提高了代码扩展性,便于后期可维护性。把不同的子类对象都看成是父类的对象,屏蔽子类差异,使得程序更加通用。

4、弊端

        只能使用子类中和父类中同名的方法。对于子类特有的方法使用不了。

5、思想

        多态可以指挥同种类型一批对象做事情。使我们复杂的问题简单化了。

        带士兵打仗,下课吃饭。

6、转型向上转型,向下转型   

对程序进行扩展,或者限定对对象的方法操作时,使用向上转型。当要使用子类的特有方法时,需要向下转型(要做健壮性的判断)

        向上转型和向下转型需要注意的问题。进去是什么,出来还得是什么。

                Animal a = new  Dog();  向上转型  -------把Dog提升为Animal。

                a.eat();  向下转型 --------调用的是Dog的方法。

ClassCastException:在进行子类特有方法使用时,要进行向下转型,转型前一定要做判断,否则容易发生次异常。增强程序的健壮性!

三、instanceof关键字

        它是一个比较运算符,返回值类型为boolean。

        对引用作强制类型转换,可以用instanceof判断是否兼容,从而避免类型转换异常。

                        if( a instanceof Dog){

                                Dog b = (Dog) a;

                                a.shout();

                        }

原文地址:https://www.cnblogs.com/aohongzhu/p/12938755.html