JAVA笔记 - 接口&多态

接口 - Interface

接口就是一种公共的规范标准,只要符合规范标准,就可以通用

接口是一种引用数据类型,最重要的内容就是其中的抽象方法

定义接口

创建.class 时选择 Interface 选项

public interface 接口名称{
    //接口内容
}

接口中可以包含

  1. 常量
  2. 抽象方法(最重要)
  3. 默认方法
  4. 静态方法
  5. 私有方法(JAVA9 only)

注意事项

  1. 接口当中的抽象方法,修饰符必须是两个固定的关键字 public abstract
  2. 关键字修饰符可以省略(省略任意一个、省略两个都可以)
  3. 方法的三要素(方法名参数列表返回值)可以随意定义

使用接口

使用步骤
  1. 使用时,必须有一个实现类来实现该接口
  2. 接口的实现类必须override接口中所有的抽象方法
  3. 创建实现类的对象

如果实现类中没有override接口中所有的抽象方法,那么这个实现类自己就必须是抽象类

接口中的抽象方法
public abstract 返回值类型 方法名称(参数){
    System.out.println("这是默认方法");
}

实现类必须override所有的抽象方法,除非实现类本身就是抽象类

接口中的默认方法

在接口中要是添加了新的抽象方法,实现类需要修改,则可以使用接口中的默认方法来解决接口升级的问题

public default 返回值类型 方法名称(参数){
    System.out.println("这是默认方法");
}
  1. 接口的默认方法,可以通过接口实现类直接调用
  2. 接口的默认方法,也可以通过接口实现类override并调用
接口中的静态方法

在定义静态方法时和默认方法类似,将default改为static即可

//开始定义静态方法。
public static 返回值类型 方法名称(参数){
    System.out.println("这是静态方法");
}

注意事项

  1. 不能通过接口实现类的对象来调用接口当中的静态方法

  2. 通过接口名称可以直接调用静态方法

    静态和对象没关系!!!!

接口中的私有方法 (Java 9 以上)

在定义静态方法时和默认方法类似,将default改为private即可

  1. 普通私有方法 private 返回值类型 方法名(参数)

  2. 静态私有方法 private static 返回值类型 方法名(参数)

接口中的常量

使用 public static final 来修饰,从效果上看,这其实就是接口的常量 (类似成员变量)

注意事项

  1. 接口中的常量必须进行赋值
  2. 一旦使用final关键字进行修饰,说明不可变,其实这三个修饰符也是都可以省略的
  3. 接口中常量的名称,推荐使用完全大写的字母来命名

多态 - Polymorphism (Multi)

概念及访问规则

面向对象的三大特征:封装性、继承性、多态性

多态是指多种形态,继承是多态的前提

多态是父类引用指向子类对象(左父右子

1557584010865

访问成员变量的规则
  1. 直接通过对象名访问成员变量,看等号左边是谁,则优先用谁,没有则向上找
  2. 间接通过成员方法访问
  3. 编译看左边,运行看左边
访问成员方法的规则
  1. 在多态的代码中,看new的是谁,就优先用谁,没有则向上找

  2. 编译看左边,运行看右边

使用格式
父类名称 对象名 = new 子类名称();
接口名称 对象名 = new 实现类名称();

多态的优点:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化

上下转型

向上转型 - 父类引用指向子类对象

格式:父类名称 对象名 = new 子类名称();

含义:右侧创建一个子类对象,把他当作父类来使用

注意事项:向上转型一定是安全的,因为是从小范围转成了大范围

但是对象一旦转型为父类,那么就无法调用子类特有的内容

解决方法—> 使用向下转型

public static void main(String[] args) {
    Animal animal = new Cat();  //左父右子,这是一个典型向上转型 ,意为创建一只猫,把它视为动物
    animal.eat();
}
向下转型 - 还原

格式:子类名称 对象名 = (子类名称)父类对象;

含义:将父类对象,还原为本来的子类对象

必须保证对象本来创建的时候就是,才能还原为,不能还原为

那么我怎么知道他本来是猫还是狗呢?

使用 instanceof 来判断

假设鼠标和键盘都是USB的子类,而鼠标和键盘有特有的方法 clicktype

想要使用computer来调用USB接口的方法,在computer类里面定义好识别到usb对象时需要判断是鼠标还是键盘

public void UseDevice(USB usb) {
    
    if (usb instanceof Mouse) {
        Mouse mouse = (Mouse) usb;  //向下转型来调用特有的方法
        mouse.click();
    }
    if (usb instanceof Keyboard) {
        Keyboard keyboard = (Keyboard) usb; //向下转型来调用特有的方法
        keyboard.type();
    }
    
}

在使用向下转型的时候一定要用instanceof来作判断

重要的是能够用接口来作为方法的参数

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值