JAVA学习笔记(6)——接口与多态

一、接口

  1.   –与抽象类一样都是定义多个类的共同属性
–使抽象的概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现
–允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定方法主体

–也可以包含基本数据类型的数据成员,但它们都默认为static和final

    (1)接口的作用
–是面向对象的一个重要机制
–实现多继承,同时免除C++中的多继承那样的复杂性
–建立类和类之间的“协议”
把类根据其实现的功能来分别代表,而不必顾虑它所在的类继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节
实现不同类之间的常量共享

        接口允许我们在看起来不相干的对象之间定义共同行为

    (2)接口的语法
–声明格式为
    [接口修饰符] interface 接口名称[extends 父接
    口名]{
    …//方法的原型声明或静态常量
    }
–接口的数据成员一定要赋初值,且此值将不能再更改,允许省略final关键字

–接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字

2.接口的实现
–接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象
–利用接口设计类的过程,称为接口的实现,使用implements关键字
–语法如下
public class 类名称implements 接口名称{ 
/* Bodies for the interface methods */ 
/* Own data and methods. */ 
}
必须实现接口中的所有方法
来自接口的方法必须声明成public

对象转型:对象可以被转型为其所属类实现的接口类型

3.多重继承
–Java的设计以简单实用为导向,不允许一个类有多个父类
–但允许一个类可以实现多个接口,通过这种机制可实现多重继承
–一个类实现多个接口的语法如下
    [类修饰符] class 类名称implements 接口1,接口2, …
    {    
    … …

   }

4.接口的扩展
– 接口可通过扩展的技术派生出新的接口
原来的接口称为基本接口(base interface)或父接口(super interface)
派生出的接口称为派生接口(derived interface)或子接口(sub interface)
– 派生接口不仅可以保有父接口的成员,同时也可加入新成员以满足实际问题的需要
– 实现接口的类也必须实现此接口的父接口
– 接口扩展的语法
interface 子接口的名称 extends 父接口的名称1,父接口的名称2,…
{
… …
}

二、塑型

1.塑型(type-casting)

–又称为类型转换

-塑型的对象包括
    基本数据类型
将值从一种形式转换成另一种形式
    引用变量
将对象暂时当成更一般的对象来对待,并不改变其类型
只能被塑型为
–任何一个父类类型
–对象所属的类实现的一个接口
–被塑型为父类或接口后,再被塑型回其本身所在的类

2.方式
(1)隐式(自动)的类型转换
a.基本数据类型
相容类型之间存储容量低的自动向存储容量高的类型转换
b.引用变量
被塑型成更一般的类
被塑型为对象所属类实现的接口类型
(2)显式(强制)的类型转换
a.基本数据类型
(int)871.34354; // 结果为871 
(char)65; // 结果为‘A’ 
(long)453; // 结果为453L
b.引用变量:还原为本来的类型
当一个类对象被塑型为其父类后,它提供的方法会减少
3.塑型应用的场合包括
–赋值转换
赋值号右边的表达式类型或对象转换为左边的类型
–方法调用转换
实参的类型转换为形参的类型
–算数表达式转换
算数混合运算时,不同类型的项转换为相同的类型再进行运算
–字符串转换
字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串


三、多态

1.
概念
–是指不同类型的对象可以响应相同的消息
–从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的


多态的目的

–所有的对象都可被塑型为相同的类型,响应相同的消息
–使代码变得简单且容易理解
–使程序具有很好的“扩展性”
2.绑定
–指将一个方法调用同一个方法主体连接到一起
–根据绑定时期的不同,可分为
早期绑定
–程序运行之前执行绑定
晚期绑定
–也叫作“动态绑定”或“运行期绑定

–基于对象的类别,在程序运行时执行绑定

3.多态的应用
–技术基础
向上塑型技术:一个父类的引用变量可以指向不同的子类对象

动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性

4.构造方法与多态
–构造方法与其他方法是有区别的
–构造方法并不具有多态性,但仍然非常有必要理解构造方法如何在复杂的分级结构中随同多态性一同使用的情况
构造方法的调用顺序
–调用基类的构造方法。这个步骤会不断重复下去,首先得到构建的是分级结构的根部,然后是下一个派生类,等等。直到抵达最深一层的派生类
–按声明顺序调用成员初始化模块

–调用派生构造方法

当我们在构造派生类的时候,必须能假定基类的所有成员都是有效的。在构造方法内部,必须保证使用的所有成员都已初始化。因此唯一的办法就是首先调用基类构造方法,然后在进入派生类构造方法之前,初始化所有能够访问的成员构造方法中的多态方法
–在构造方法内调用准备构造的那个对象的动态绑定方法
会调用位于派生类里的一个方法
被调用方法要操纵的成员可能尚未得到正确的初始化
可能造成一些难于发现的程序错误
定义构造方法的注意事项
–用尽可能少的动作把对象的状态设置好
–如果可以避免,不要调用任何方法

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

四、内部类

1.内部类
–在另一个类或方法的定义中定义的类
–可访问其外部类中的所有数据成员和方法成员
–可对逻辑上相互联系的类进行分组
–对于同一个包中的其他类来说,能够隐藏
–可非常方便地编写事件驱动程序
–声明方式
命名的内部类:可在类的内部多次使用
匿名内部类:可在new关键字后声明内部类,并立即创建一个对象
–假设外层类名为Myclass,则该类的内部类名为
Myclass$c1.class (c1为命名的内部类名)

Myclass$1.class (表示类中声明的第一个匿名内部类)

2.内部类实现接口
–可以完全不被看到,而且不能被调用

–可以方便实现“隐藏实现细则”。你所能得到的仅仅是指向基类(base class)或者接口的一个引用

3.方法中的内部类
在方法内定义一个内部类
–为实现某个接口,产生并返回一个引用
–为解决一个复杂问题,需要建立一个类,
而又不想它为外界所用

猜你喜欢

转载自blog.csdn.net/sinat_38756080/article/details/80179902