Java SE-核心-抽象类

抽象类的使用
接口
总结
Objects类

抽象类的使用

  • 不能直接new创建抽象类对象
  • 必须使用子类继承抽象类
  • 子类必须重写覆盖父类中所有的抽象方法
  • 创建子类对象进行使用
  • 抽象类中可以有抽象方法,在创建子类对象时会自动调用抽象类的构造方法,或是可以通过在子类构造方法中调用
  • 若子类没有全部实现抽象类中抽象方法,那么子类必须是抽象类我i
发红包案例图解

在这里插入图片描述

接口

接口概述
  • 接口就是一种公共的规范标准
  • 接口是一种引用的数据类型
  • 编译生成的代码仍是class文件
接口中抽象方法
  • 不可以写大括号方法体
  • 方法默认都为public abstract 可以全省略也可以省略部分
接口实现方式
  • 接口不能直接使用,必须有一个实现类来实现该接口
  • 实现接口的实现类必须重写接口中的所有抽象方法,若没有全部实现,则该类必须是抽象类
接口的默认方法
  • 在jdk1.8开始,接口里允许定义默认方法
  • 抽象方法可以有方法体
  • 接口中默认方法,可以解决接口升级的问题
  • 可以通过接口的实现类对象直接调用
  • 也可以被接口实现类进行覆盖重写
  • 默认方法会被实现类继承下去
  • 注意:所谓的接口升级:当接口的所有实现类都已实现,入突然在接口中添加一个抽象方法时,那么实现类等等还需要重写添加的该方法,这是可以在接口中添加一个默认方法,那么通过接口的实现类对象调用可以直接使用,也可以在接口的实现类中重写该方法
接口中静态方法
  • 用接口名.方法名直接调用
  • 可以有方法体
接口中的私有方法
  • 在jdk9中接口中可以定义私有方法
  • 1、普通私有方法
  • 解决多个默认方法重复代码的问题
  • 2、静态私有方法
  • 解决多个静态方法之间的重复代码问题
  • 注意:是为了解决方法中的重复代码问题,当接口中多个方法有共同代码,可以将这些共同代码抽取出来,作为一个共有方法但是这个共有方法若不定义为private类型,可以被实现类对象直接调用,这样很不恰当,所以可以将这个方法被private修饰
接口中变量
  • 接口中变量都被public static final 修饰
  • 变量在定义时必须初始化
  • 命名规则:大写字母加下划线
  • 通过接口名.变量名调用

总结

成员变量
  • 成员变量定义时必须初始化,且一旦定义不可改变
  • 命名规则使用大写字母加下划线
抽象方法
  • 实现类必须覆盖重写抽象类中的所有抽象方法,除非实现类是抽象类
默认方法
  • 从jdk8开始,Java中允许定义默认方法,且实现类默认继承默认方法默认方法也可以被覆盖重写
  • pubic default 返回值类型 方法名(参数列表){方法体};
静态方法
  • 从jdk8开始,Java允许定义静态方法,应该通过接口名.方法名调用,不能通过实现类对象调用
  • public static 返回值类型 方法名(参数列表)(方法体);
私有方法
  • 从jdk9开始,Java允许定义私有方法,只有接口自己调用,不能被实现类和其他类调用
  • 普通私有方法:private 返回值类型 方法名(参数列表){方法体};
  • 静态私有方法:private static 返回值类型(参数列表){方法体};
注意
  • 接口中没有静态代码块
  • 接口中没有构造方法
  • 实现类中继承了多个接口,有重复的抽象方法,只需要覆盖重写一次
  • 实现类的多个接口中存在重复的默认方法,那么实现类一定要对冲突的默认方法重写
  • 如果一个类的直接父类中和接口的默认方法产生了冲突,优先使用父类中的方法(继承优先实现)

总结

  • 类与类之间是单继承,父类只有一个
  • 类与接口之间是多实现的,一个类可以有多个接口
  • 接口与接口之间是多继承的
接口的多继承
  • 多个父接口中的抽象方法如果重复没关系
  • 多个父接口中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,而且必须待default关键字
向上转型
  • 父类引用指向子类对象,是安全的
向下转型
  • 将父类对象还原为本来的子类对象
图解

在这里插入图片描述

  • 注意事项:必须保证对象本来创建的时候,就是猫,才能向下转型成为猫
  • 如果对象创建的时候不是猫,现在非要向下转型为猫则要报错
  • 再基本类型中称为强制类型转换,而引用类型中称为转型
instanceof关键字
  • animal instanceof Dog
  • 判断父类引用animal本来是不是Dog类型
final关键字
  • 被final修饰的类时,该类不能被继承
  • 被final修饰的方法时,该方法不能被覆盖重写
  • 被final修饰的局部变量,该变量内容不能被修改,而且要确保一次赋值,定义变量时初始化或仅仅赋值一次
  • 对于被final修饰的成员变量,要么直接定义时初始化要么再构造方法中赋值
Java权限修饰符

在这里插入图片描述

内部类
  • 内部类在文件中名称:外部类$内部类
权限修饰符的使用选择
  • 外部类:public/(default)
  • 成员内部类:public/protected/(default)private
  • 局部内部类:什么都不能写
注意:
  • 局部内部类,如果希望访问所方法的局部变量,那么这个局部变量必须是有效的final(即在定义时只能初始化或赋值一次,不能二次赋值)
  • 原因:new出的对象在堆内存中,局部变量跟着方法走,在栈内存中
  • 方法运行结束后,就会立刻出栈,局部变量就会立刻消失,但是new出来的对象还是在堆内存中,直到被垃圾回收
  • 归根于生名周期不同

匿名内部类

匿名内部类定义格式
  • 接口名称 对象名 = new 接口名称() {//覆盖重写所有抽象方法};
  • 匿名内部类使用使用一次
接口作为成员变量类型
接口作为方法参数和返回值

Objects类

equals()方法
  • 基本类型比较俩个值
  • 引用数据类型比较地址值
  • null不能调用方法,可用Objects.equals(a, b)避免
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页