一个事物可能具有多方面特征
每一种特征是特殊能力的体现
1.接口(Interface)含义概念
1)含义和功能
在JAVA语言中,接口是对符合接口需求的类的一套规范。接口的目的是用来实现某个类满足一个或多个类型关系的,同时去除了多重继承的“二义性问题”
2)接口概念
所谓接口,实质上就是对外部提供功能的声明(而不揭示这些运算的结构)
从编程的角度看,JAVA语言定义的接口实际上是一组抽象方法和常量的集合,为其他类提供运算的外部说明
---------------------------------------------------------------------------------------------------------------------------------
2.接口的声明和定义
Java中声明接口的语法如下:
[public] interface 接口名 [extends 父接口名列表]
{ //接口体;
//常量域声明
[public] [static] [final] 域类型 域名=常量值;
//抽象方法声明
[public] [abstract][native]返回值 方法名(参数列表) [throw异常列表];
}
从上面的语法规定可以看出,定义接口与定义类非常相似,实际上完全可以把接口理解成为一种特殊的类,接口是由常量和抽象方法组成的特殊类(也无法实例化)。
---------------------------------------------------------------------------------------------------------------------------------
3.接口成员特点
在接口中的定义:
1)接口中的属性都是用static final修饰的常量, (隐含特性),可以省略这两个关键词,和不省略一样
2)接口中的方法都是用abstract修饰的抽象方法,且都是public的(隐含特性),可以省略这两个关键词,和不省略一样,在接口中只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体
这种情况可理解为给使用者规定了一组信息交换、传输和处理的“接口”。
接口的实现:
一个类要实现某个或某几个接口时1,有如下的步骤和注意事项:
1)在类的声明部分,用implements关键字声明该类将要实现哪些接口
2)如果实现某些接口的类(实现类)不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法;如果实现类是abstract类,则可以根据需要决定是否实现某个抽象方法(不实现的话,则依赖于其子类去实现)
3)一个类在实现某接口的抽象方法时,必须使用基本相同的方法头,即方法名和参数完全一样,而范围符实现类要大于或等于抽象方法的范围。如:抽象
4)接口的抽象方法,其访问限制符都已指定是public,所以类在实现方法时,必须显式地使用public修饰符
---------------------------------------------------------------------------------------------------------------------------------
4.接口和接口的继承(仅作了解)
A.当某方面特性可以继承其他方面特性时,从父类接口可以拓展新的子接口;(注意接口关系中extends关键词后课跟多个接口,接口间可以多继承)
B.用多接口实现类产生一个对象,这个对象就具有多态性;
Person p=new Person();
//那么这个类就可以认为是一个地球人,能说话的生物,能走路的生物三个角色(即多态);
C.可以通过接口类进行变量类型的声明而产生某个实现类对象;这个时候动态绑定机制同样适用;
Walkable p=new Person();
Walkable mp=new MarPerson();
D.在不同角色(即态)之间转换,可以通过强制类型转换
(Talkable)p; //此时可以访问相关接口方法
(Talkable)mp;
小结: 在类实现了多个接口情况下,当通过某一接口声明变量,引用的对象会被认为是当前接口角色,能够访问相应接口类定义的方法;但无法访问到另一个接口的方法
---------------------------------------------------------------------------------------------------------------------------------
5.Object类所体现的多态
1. Object类(见上部的相关内容)是所有类的根类,所以任何类的对象都可以有Object的态。
2. 那么Upcast的申明方式中,也可如下:
Object p = new Person();
Object mp = new MarPerson();
由于Person和MarPerson中都定义有toString方法,所有通过引用变量输出并调用toString方法时,可以动态绑定。
同理:如果有个showMessage(Object obj),并送入某个类型的对象,都可以正常的调用,并执行相关的toString()方法。
但是对于talk或walk方法,则需要转成对应子态方能执行。