您的位置:首页 > 编程语言 > Java开发

Java笔记(四) 接口与多态

2016-06-10 14:19 465 查看
Java中的接口在语法上有些类是于抽象类,主要作用是帮助实现类的多重继承功能。

多态性是面向对象程序设计语言的重要特性之一。

1.接口

接口可以想象成为一个“纯”抽象类。接口也包含了数据成员,但他们都是默认为static、final的,接口只提供一种形式,并不提供实施的细节。

(1)接口的作用及语法

a.接口的作用

Java的接口也是面向对象的一个重要机制,他的引进是为了实现多继承,同时免除C++中的多继承那样的复杂。

接口类的变量可以用来代表任何实现了该接口的类的对象,这就相当于把类根据其实现的功能来分别代表,而不必顾虑它所在类的继承层次。

接口还可以用来实现不同类之间的常量共享。

人们常常使用接口来建立类和类之间的”协议”。

接口与抽象类都是声明多个类的共同属性,与抽象类不同的是:接口允许在看起来不相干的类之间定义共同行为。

b.接口的语法

关键字:interface

java接口中只声明类中方法的原型,而没有直接定义方法的内容。

格式: [接口修饰符] interface 接口名称 [<\Type{,Type}>] [extend 父类名]{}

接口与一般类一样,本身也具有数据成员与方法,但数据成员一定要赋予初值,且此值将不能再更改,而方法必须是“抽象方法”。接口在声明时也可以声明是泛型接口,其格式是在接口名称后加上“<>”。

在接口的声明中,Java允许省略声明数据成员的final关键字,方法的public及abstract关键字。

(2)实现接口

接口的使用:必须利用接口的特性来构造新的类,然后再用它来创建对象,利用接口构造类的过程,称为接口的实现。

关键字:implements

语法:[类修饰符] class 类名称 implements 接口名称{//实现接口以及定义自己的成员}

完成接口的类必须实现接口中的所有抽象方法,实现一个接口时,来自接口的方法必须声明为public。

由于不能直接由接口创建对象,而必须通过实现接口的类来创建。虽然如此,还是可以声明接口类型的变量(或数组),并用它来访问对象。

(3)多重继承

虽然Java不允许一个类有多个父类,但允许一个类可以实现多个接口,通过这种机制可以实现多继承。

语法:[类修饰符] class 类名称 implements 接口1,接口2…{…}

(4)接口的扩展

接口与一般类一样,均可以通过扩展技术来派生出新的接口,(父接口,子接口)。

接口的扩展(或继承)也是通过关键字extends,但是一个接口可以继承多个接口,这点与类的继承有所不同。

语法:interface 子接口名称 extends 父接口1,父接口2…{…}

2.塑形

(1)概念

Java支持隐式(自动)的类型转换,及显式(强制)的类型转换,类型转换也称为塑形(type-casting),对象塑形比基本类型的塑形要复杂的多。

对象只能被塑形为:(1.任何一个父类类型(反之,不成立)。2.对象所属的类实现的一个接口(虽然不能用接口声称对象,但可以声明接口的引用变量,接口的引用变量可以指向任何实现了此接口的类对象)。3.或者回到他自己所在的类。)

a.隐式(自动)的类型转换

对于基本数据类型,相容类型之间存储容量底的自动向存储容量高的类型转换;对于引用变量,当一个类需要被塑形成一般的类(父类)多接口时,系统将会自动进行塑型。

b.显式(强制)的类型转换

对于引用变量,通过强制塑型,将其还原为本来的类型。基本数据类型的塑型与对象的塑型的含义是不同的。对于基本数据类型,塑型是将值从一种形式转换成另一种形式的过程;对于对象,塑型并不是转换,而仅仅是将对象暂时当成更一般的对象来对待,并没有改变其类型。

(2)塑型的应用

主要应用:(赋值转换,方法调用转换,算术表达式转换,字符串转换)

当一个类对象被塑型为其父类后,它提供的方法会减少,当将其塑型为本来的类型后,又恢复正常了。所以对象的塑型并没有改变它的类型,而是暂时将其当作更一般的类型。

许多Java方法对任意的类对象都能工作,这些方法通常以Object类对象作为参数。

(3)方法的查找

对于实例方法,总是从原始类开始,沿类层次向上查找。

对于类方法(静态方法),查找在编译时进行,所以总是在变量声明时所属类中进行查找。引用变量emp2实际指向的是一个Manager类的对象,但emp2被声明为Employee类型,当将静态方法expenseAllowance()发送给emp2时,系统调用Employee类中声明的方法。

3.多态的概念

多态性是指不同类型的对象可以响应相同的消息。

(1)多态的目的

*instanceof用法

从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理。而且由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的。

(2)绑定的概念

将一个方法调用同一个方法主体连接到一起就称为“绑定”,根据绑定的时期不同,可将绑定分为“早期绑定”及“后期绑定”两种。

(早期绑定:(在程序运行以前执行绑定,由编译器和链接程序执行,如果有的话);后期绑定、动态绑定、运行期绑定:(绑定在运行期间进行))

若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。

4.多态的应用

利用多态性进行(多态,二次分发)

5.构造方法与多态

(1)构造方法的调用顺序

基类的构造方法肯定会在派生类的构造方法中调用,而且逐渐向上链接,使得每个基类使用的构造方法都得到调用。

若没有在派生类构造方法中明确指定对基类构造方法的调用,则系统会自动调用基类的默认构造方法,如果不存在默认构造方法,编译器就会报告一个错误。

构造方法的调用顺序:(1.调用基类的构造方法;2.成员变量初始化;3.派生类构造方法)

(2)构造方法中的多态方法

若在一个构造方法内部调用一个动态绑定的方法,则可能造成一些成员未得到正确的初始化。

在定义构造方法时,遵循以下原则可以减少错误的发生:

·用尽可能少的动作把对象的状态设置好。

·如果可以避免,不要调用任何方法。

·在构造方法内唯一能安全调用的是在基类中具有final属性的那些方法(也适用于private方法,他们自动具有final属性)。这些方法不能被覆盖,所以不会出现上述潜在的问题。

6.内部类

在Java1.1版本以后,允许将一个类声明置入另一个类声明中,称这种类为“内部类。在内部类中可以访问它的外部类的所有数据成员和方法成员。

可控制一个类在另一个类里的“可见性”,对于同一个包中的其他类来说,内部类能够隐藏起来,使用内部类可以非常方便的编写时间驱动程序。

声明内部类的方法:(1.声明命名的内部类:可以在类中(甚至方法中)声明内部类;2.声明匿名内部类:在new后声明内部类,立即创建一个对象)

假设外层类名为Myclass,则该类的内部类名为Myclassc1.class(命名为c1的内部类),或Myclass1.class(为第一个匿名内部类)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: