30小时训练完成度:26h/30h
接口(interface)interface在abstractclass的路上走的更远,在interface中只有方法的声明,没有具体实现,是一个纯abstract类。
使用interface关键字定义接口:
interfaceRunnable{intTIMES=1;StringNAME="running";voidrun();}
接口中的变量是staticfinal
接口中的所以方法只有声明,没有实现
多重继承在C++中,类可以继承多个父类,在Java中,使用接口也可以实现“多重继承”的效果。
使用implements关键字实现一个或多个接口:
interfaceA{}interfaceB{}classCimplementsA,B{}
使用接口,可以将子类Upcast为多个Base类型
接口也可以避免使用者去实例化一个类
优先使用接口,在需要添加变量或具体方法时再考虑抽象类
避免在不同的接口中使用相同的方法名。这样代码可读性很差,也会在执行时造成混淆。
//AvoidtheseinterfaceA{voidf();}interfaceB{voidf(inti);}使用继承扩展已有接口
接口可以再继承接口,扩展已有接口的功能。
interfaceCar{voidrun();}interfaceAirCarextendsCar{voidfly();}利用接口组织常量
在接口中的成员变量都是static和final的,利用这个特性,可以把程序中的常量通过接口来分组。
publicinterfaceMonth{intJAN=1;intFEB=2;intMARCH=3;}
这样组织常量,更具可读性
在使用时,可以更加直观,如Month.Jan
接口的变量初始化接口的变量必须在定义时就初始化
变量可以通过非常量表达式初始化
变量在接口第一被调用时开始初始化
publicinterfaceRandVals{intrandomInt=rand.nextInt(10);}接口的嵌套
嵌套接口可以被定义为private接口
嵌套接口的定义和普通接口一样
实现接口,并不需要实现其内部的嵌套接口
私有嵌套接口只能在被定义类的内部实现
内部类将一个类的定义放在另一个类定义内部,这个类就称为内部类。
publicclassParcel{//InnerclassclassContents{privateinti=1;publicintvalue(){returni;}}}
内部类和外部类的区别:
非static内部类和包含其的外部类,隐含者关联关系,不能通过普通的new方式生成新的实例。必须在外部类实例的基础上,实例化。
其中的一种方式是在外部类中定义内部类的实例化方法
publicclassParcel{classContents{privateinti=1;Contents(){}}publicContentscont(){returnnewContents();}}内部类和向上转型
内部类可以完全隐藏实现方式,而只暴露出外部定义的interface。这种隐藏是无法在普通类中做到的。普通类要么是public,要么是friendly。
//Runnable.javainterfaceRunnable{voidrun();}//Parcel.javapublicclassParcel{privateclassContentsimplementsRunnable{privateinti=1;Contents(){}voidrun(){}}publicRunnablerunnable(){returnnewContents();}}内部类的方法和范围
除了上面定义内部类方式,内部类还可以定义在方法或专属范围内。
定义在方法内部:
publicclassParcel{publicRunnablerunnable(){classContentsimplementsRunnable{privateinti=1;Contents(){}voidrun(){}}returnnewContents();}}
定义在专属范围内:
publicclassParcel{publicRunnablerunnable(booleanb){if(b){classContentsimplementsRunnable{privateinti=1;Contents(){}voidrun(){}}returnnewContents();}//Outofscope,cannotuseContentsreturnnull;}}
题图
dcossyle北京看白癜风哪里医院好北京怎样治疗白癜风