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();//关闭电脑 关机
}
}

posted @ 2021-06-27 10:44  别不开心,过得去  阅读(57)  评论(0)    收藏  举报