对象的类型转换分为自动转换和强制转换两种
- 派生类向基类转换是自动转换,因为派生类中包含基类
- 基类向派生类的转换是强制转换
强制类型转换是通过在转换对象前面使用圆括号运算符来实现,圆括号内为要转换的目标类型,格式为:
(<目标类型>)<表达式>
抽象类中必须包含至少一个抽象方法。
抽象方法只有方法头(方法的声明),没有方法体,在方法头后面直接使用分号来结束抽象方法的定义。
定义抽象类需要在一般类定义格式的关键字class
前面使用关键字修饰符abstract
,定义抽象类中的每个抽象方法也需要在方法头前面使用关键字abstract
作为修饰符,在方法头后面使用分号结束。
抽象类不能使用new运算进行实例化,但可以定义抽象类的引用对象,用来引用其派生类中的实例对象,以便实现多态性。抽象方法将在抽象类的派生类中实现,派生类中也可以包含非抽象方法。如果一个抽象类中除了抽象方法外什么都没有则用接口更加合适。
接口interface
:接口的所有方法都是抽象的,即一个纯的抽象类。它允许创建者规定一个类的基本形式:成员变量列表和方法声明,但是每个成员变量都默认为具有public static final
,并且只能在定义时被初始化,接口中每个成员方法都默认具有public abstract
修饰。
[public]interface 接口名 [extends 接口名]
{变量声明://声明变量时必须用final static修饰抽象方法声明://声明方法时必须用public abstract 修饰,但是java默认的方法都是public abstract的,故可将其省略。
}
同抽象类一样,接口不能被实例化。一个接口还可以继承一个或者多个接口。
一个类可以实现一个或者多个接口,所使用的子句关键字为implements
。如果一个接口定义中只包含有声明方法,不包含有成员变量定义,则称此为纯接口。
实现接口:
[修饰符]class 类名[extends 父类名] implements 接口名[,接口名2.] {类体}
如果一个类引用了某个接口,就必须在类体中重写接口中所定义的所有抽象方法。但是有时定义的类这并不需要调用接口中的某一个方法,这时可将该方法重写为一个空的方法,即该方法只是一对大括号。
在Java中接口和类有些相似,但是两者有不同之处:
- 接口中定义的变量都是
final static
类型的,而且接口中定义的方法都是抽象方法 - Java中类不支持多重继承,但是一个类可以实现多个接口和一个父类,一个接口可以继承多个接口。(可以理解为变相的多重继承,弥补了Java没有多重继承的缺陷)。
接口和抽象类的异同:
- 从某种意义上来讲,
interface
可以看作一种特殊形式的abstract class
- 但是在具体应用上两者还是有区别的。抽象类在Java语言中体现了一种继承关系,即父类和子类在概念本质上应该是相同的。对于
interface
来讲,并不要求接口实现者和接口定义在概念本质上一致。