SevenDay_java 接口与多态
笔记丢失,今早大概补了一下,想起来一点补一点
1、接口
jdk的每一个版本所支持的功能不一样,其中jdk9以上的版本支持接口中有抽象方法、默认方法,常量,静态方法,私有方法
2、接口的实现方法
接口使用步骤
1> 接口不能直接使用,必须有一个实现类来实现该接口
格式: public class 实现类名称 implements 接口名称{ //.... }
2> 接口的实现类必须覆盖重写所有抽象类
3> 创建实现类对象进行使用
*注意事项: 如果实现类并没有覆盖重写接口中的所有抽象类,那么这个实现类自己必须是抽象类
3、接口的抽象方法
-
接口当中的抽象方法,修饰符必须是两个固定的关键字,public,abstract。
-
这两个关键字修饰符,可以选择性的不写。
public interface Interface01 {
public abstract void methodA();
}
4、默认方法
默认方法:用来解决程序升级问题
格式:public default void 方法名称(){ //方法体 }
public default void methodB(){
System.out.println("默认方法");
}
5、静态方法
格式:public static void 方法名称(){ //方法体 }
public static void methodC(){
System.out.println("静态方法");
}
*注意事项:不可以用实现类的对象调用静态方法,用接口直接调用即可。如:Interface01.methodC();
6、私有方法
问题描述:在接口中,若有两个默认方法中有重复功能,为解决重复我们另写了一个方法A,让其他两个方法需要此功能时调用方法A即可 但是,方法A可以被实现类也调用 怎么办?
问题解决:使用私有方法,只在此接口能调用,实现类不可调用
1> 普通私有方法 格式:private 返回值类型 方法名称(){//方法体}
情况如下:
public interface Interface01 {
public default void methodA(){
System.out.println("默认1");
System.out.println("默认2");
}
public default void methodB(){
System.out.println("默认1");
System.out.println("默认2");
}
}
采用私有方法进行优化:
public interface Interface01 {
public default void methodA(){
methodC();
}
public default void methodB(){
methodC();
}
private void methodC(){
System.out.println("默认1");
System.out.println("默认2");
}
}
2> 静态私有方法 格式:private static 返回值类型 方法名称(){//方法体}
采用静态私有进行优化:
public interface Interface01 {
public default void methodA(){
methodC();
}
public default void methodB(){
methodC();
}
private void methodC(){
System.out.println("默认1");
System.out.println("默认2");
}
}
7、常量
格式:public static final 数据类型 常量名称=数值;
public static final int NUM=90;
使用方式:接口名称.常量名称
Interface01 .NUM;
注意事项:
1>必须使用public、static、final三个关键字进行修饰,可以省略不写,但是必须是它们三个。
2>一旦使用final关键字进行修饰,说明不可变.
3>接口中的常量必须赋值!
4>常量名称使用全部大写,用下划线分隔 如NUM_OF_CLASS
8、接口的注意事项
1> 接口不能有构造方法和静态代码块
2> 一个类只能有一个直接父类,但是一个类可以同时实现多个接口 例如:public class MyClass implements Interface01,Interface02(){//...}
3> 如果实现类所实现的两个接口中有重复的抽象类,则只需重写一次
4> 如果实现类没有重写所有的抽象方法,则此实现类必须是抽象类
5> 如果实现类实现的多个接口中有重复的默认方法,则实现类一定要对冲突的默认方法进行覆盖重写
6> 一个类如果继承直接父类的方法与实现的接口方法产生了冲突,则优先使用父类当中的方法
9、多态
有关多态的相关概念
1> 向上转型 子类型-->父类型 也成为自动转换类型
2> 向下转型 父类型-->子类型 也称为强制转换类型
多态格式
格式:
父类名称 对象名=new 子类名称();
或者
接口名称 对象名=new 实现类名称();
10、向上转型
Animal bosi=new Cat();//向上转型 也称自动转型
bosi.eat();
//bosi.run(); 错误
错误解释:
java分为编译与运行阶段,在编译阶段对于Animal bosi,bosi是Animal类型的,看似bosi可以调用Animal中的方法,但在运行阶段,底层对象还是 Cat ,bosi实际上调用的是 Cat中的方法,又由于 Cat继承的是Animal,故bosi可以调用eat()(Cat重写Animal中的eat()方法)。
为什么不能调用run()(Cat中独有的方法)?原因是bosi是Animal类型的,Animal中没有run()方法。
11、向下转型
Animal bosi=new Cat();
Cat mimi=(Cat) bosi;
前提是 Animal引用指向Cat对象 才不会出错
12、java.lang.ClassCastException异常
Animal bosi=new Cat();
Cat mimi=(Cat) bosi;
Dog erha=(Dog) bosi;
此语句在编译时,不会报错,是因为Animal是Dog的父类,向下强制转换符合语法规则。但是在运行时会出现异常,因为在执行时,底层对象依旧是Cat ,而且Cat 与Dog 无任何关系,故无法进行转换,此时出现一个java.lang.ClassCastException异常 称类型转换异常 这种异常在做强制类型转换的时候会出现。
什么时候向下转型?
当需要调动子类型所独有的方法,父类型没有的。
13、处理此异常的方法 instanceof
bosi instanceof Cat :波斯是猫的实例吗? 返回值 true/false
if(bosi instanceof Cat){
Cat mimi=(Cat) bosi;//波斯是猫则强制转换为Cat类型
}else if(bosi instanceof Dog){
Dog erha=(Dog) bosi;//波斯是狗则强制转换为Dog类型
}
14、多态的实际应用
//有一个笔记本类,设备有鼠标与键盘,有一个usb接口,实现鼠标与键盘接入笔记本usb接口。
笔记本类:
public class Computer {
//开机方法
public void openComputer(){
System.out.println("开机");
}
//关机方法
public void closeComputer(){
System.out.println("关机");
}
//使用设备
public void useDevice(UsbInterface de){
if(de instanceof Mouse){
Mouse mouse=(Mouse)de;
mouse.click();
}else if(de instanceof PrintKey){
PrintKey printKey=(PrintKey) de;
printKey.print();
}
de.closeUsb();//关闭设备
}
}
鼠标类
public class Mouse implements UsbInterface{
public void click(){
System.out.println("点击");
}
@Override
public void openUsb() {
System.out.println("打开鼠标");
}
@Override
public void closeUsb() {
System.out.println("关闭鼠标");
}
}
键盘类
public class PrintKey implements UsbInterface {
public void print(){
System.out.println("敲击输入");
}
@Override
public void openUsb() {
System.out.println("打开键盘");
}
@Override
public void closeUsb() {
System.out.println("关闭键盘");
}
}
usb接口
public interface UsbInterface {
public abstract void openUsb();//打开抽象类
public abstract void closeUsb();//关闭抽象类
}
实现类
public class UsbImpl {
public static void main(String[] args) {
Computer computer=new Computer();//创建笔记本对象
computer.openComputer();//打开电脑 开机
computer.useDevice(new Mouse());//打开鼠标设备 点击 关闭鼠标
computer.useDevice(new PrintKey());//打开键盘设备 敲击输入 关闭键盘
computer.closeComputer();//关闭电脑 关机
}
}
浙公网安备 33010602011771号