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();
}