接口(语法)
接口出现的目的:
- 体现封装性
- 分离/契约和实现
- 区分开甲方(提要求)和乙方(干活)
接口可以认为是一份合同(契约)
语法定义:
interface 接口名称
{
void volumnUp();//抽象方法
}
//实现继承
interface Collection{}
interface DataStructure {}
interface List extends Collection,DataStructure{}
1.接口的定义允许多继承
2.接口无法实现实例化对象
3.接口中给出的方法列表默认
- public 访问限定符修饰的
- 无法使用static 修饰
- 是一个抽象方法,直接用分号结尾,不写方法体
4.接口中不能出现属性,除非是被final static修饰
final 关键字(修饰三个位置)
1.修饰变量,不可变变量只有一次赋值 的机会
final int a=10;
a=100;//触发编译错误
final int[]a=new int [10]
A)a=new int [100] //错误
B)a[0]=100 //正确
final Person p=new Person();
A) p=null; //触发编译错误
B) p.name="hello";//正确
2.final 可以修饰类:表示这个类不能被继承
final class A{}
3.final 可以修饰方法:代表这个方法无法被其子类覆写
class A
{
final void menthod();
}
abstract 关键字
1.修饰类,这个类无法被实例化
abstract class A{} 抽象类
new A (); 编译错误
2.修饰方法,该方法称为抽象方法,只有方法签名,没有方法实现
abstract void menthod();
注解:
- 有抽象方法一定有抽象类,而有抽象类并不一定有抽象方法
- 抽象方法一旦被实现了一次就不再是抽象方法
多态
1.父类型的引用可以指向子类型的对象(向上转型)
- 只有非抽象的类类型能被实例化
- 以返回值的类型体现
List getList()
{
return new ArrayList();
}
- 以参数体现
void list(List list)
{
....
}
list (new ArrayList());
2.在编译期间,可以调用的方法列表,根据引用的类型来决定,而不是根据对象的类型
3.运行期间,真正执行的普通方法,以实际执行的对象类型为准
4.运行期间,真正执行的静态方法,以引用类型为准
5.向下类型的转换:如果ab实际上不是指向B类型的对象不会有编译错误但会触发运行时错误(会抛出异常ClassCastException)
6.为了避免类型转化错误,java提供了一个运算符 instanceof 判断引用背后的真实对象类型(发生在运行期)
ab instanceof B;//ab引用指向的对象能否被B类型的引用指向