骖六龙行御九州之第十一天——关键字final和多态

final概述

  • 什么是final?

    • Java中的关键字,不可变的

  • 最近学的关键字?

    • break、return、continue、static、this、super、extends、final

  • final的修饰特点

    • 修饰类,类不能被继承

    • 修饰变量,变量成为了常量,只能被赋值一次

    • 修饰方法,方法就不能重写

  • final关键字修饰局部变量

    • 方法内部或者方法声明上

      • 基本类型,是值不能被改变

      • 引用类型,是地址值不能被改变,对象中的属性可以改变

  • final修饰变量的初始化时显示初始化

    • 成员变量

        • 在对象创建完成之前

        • 局部变量

        • 随着方法的调用

多态

  • 什么多态?

    • 多态指的是同一个事物在不同环境下表现出来的状态

  • 多态的前提

    • 必须有继承

    • 子类必须有方法重写

    • 父类引用指向子类对象

      • 注意

        • Java中所有的类,如果没有写extends关键字,默认都是继承Object类

        • 所有的最顶层那个类一定是Object

  • 多态的特点

    • 提高代码扩展性

      • 应用场景,方法的声明部分

    • 提高代码的维护性

      • 多态的基础是继承

  • 多态的弊端

    • 无法使用子类中特有的功能(方法)

  • 多态的成员访问(赋值、取值)特点

    • 成员变量

      • 编译看左边,运行看左边。

      • 注意:

        • 不能访问子类独有的

    • 构造方法

      • 创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。

      • 和继承现象一样

    • 成员方法:

      • 编译看左边,运行看右边。

      • 代码实验案例

    • 静态方法

        • 编译看左边,运行看左边。(静态和类相关,算不上重写,所以,访问还是左边的

  • 总结:

    • 除了成员方法之外,其余编译和运行都看父类引用

  • 多态的内存结构

    • 前期绑定和后期绑定:多态

      • 绑定

        • 变量和数值的关联

        • 调用方法的关联(类和方法,对象和方法)

    • 前期绑定

      • 在Javac,数值就知道,自己属于哪一个变量

      • Javac的时候,方法就知道自己该被谁调用

  • 后期绑定

      • 只有在运行的时候,数值才知道自己数哪一个变量

      • 只有在运行的时候,方法才知道自己被谁调用

    • 前期绑定关键字

      • static/ final 修饰的内容,其他的都是后期绑定!

多态转型(数据类型转换)
  • 向上转型

    • 多态的本质其实是子类对象的向上转型,转至父类引用,因而在使用过程中无法使用子类特有功能

    • 子类转换成父类类型

  • 向下转型:

    • 向下转型是指将已经向上转型的的对象再向下转型,即将指向父类引用改回指向子类引用

    • 父类类型转换为子类类型

    • 子类类型 变量名 = (子类类型)父类变量;Dog dog =(Dog)animal;

关键字instanceof
  • instanceof格式

    • 对象 instanceof 类名

    • 判断对象是否是类的一种 System.out.println(c instanceof A);

抽象类

  • 什么是抽象类?

    • 抽象类指的是在父类中使用abstract修饰类和其中的方法,使得子类必须对其抽象方法进行改写。

    • 一些方法和内容不明确的时候

  • 抽象类的格式:

    • 抽象类和抽象方法必须用abstract的关键字修饰

    • 抽象类的格式:abstract class 类名{}

    • 抽象方法格式:public abstract void eat();

  • 抽象的成员特点

    • 成员变量:

        • 既可以是变量,也可以是常量。

      • 构造方法:

        • 用于子类访问父类数据的初始化。

      • 成员方法:

        • 既可以是抽象的,也可以是非抽象的。

  • 抽象类的注意事项

    • 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

    • 抽象类中可以有构造方法,抽象类不能进行实例化

      • 抽象类的构造方法的作用,用于子类访问父类数据时的初始化(赋值操作)

      • 抽象类不能直接实例化那么,抽象类如何实例化呢?

        • 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

    • 抽象类的子类

      • 要么是抽象类

      • 要么重写抽象类中的所有抽象方法

  • 抽象类的成员方法特性

    • 抽象方法 强制要求子类做的事情。

      • 非抽象方法 子类继承的事情,提高代码复用性

接口

  • 什么是接口

    • 与类同级别,接口主要用来定义一些扩展额外的功能(接口不能实例化)

  • 接口使用的具体原则

    • 接口用关键字interface表示 格式: interface接口名 {}

    • 类实现接口用implements表示 格式: class类名 implements接口名 {}

    • 接口不能实例化,但是可以通过多态的方式实例。

    • 接口的子类

      • 可以是抽象类。但是意义不大。

      • 可以是具体类。要重写接口中的所有抽象方法。(推荐方案)

  • 接口的成员特点

    • 成员变量

      • 只能是常量,并且是静态的。默认修饰符:public static final建议自己手动给出。

    • 构造方法

      • 接口没有构造方法,成员方法

    • 只能是抽象方法

      • 默认修饰符:public abstract,建议自己手动给出。

类与类,类与接口,接口与接口的关系

1.类与类:

  • 继承关系,只能单继承,可以多层继承。

2.类与接口:

  • 实现关系,可以单实现,也可以多实现。

  • 并且还可以在继承一个类的同时实现多个接口

3.接口与接口:

  • 继承关系,可以单继承,也可以多继承。

接口与抽象类的区别

1.成员区别

  • 抽象类

    • 成员变量:可以变量,也可以常量

    • 构造方法:有

    • 成员方法:可以抽象,也可以非抽象

  • 接口

    • 成员变量:只可以常量

    • 成员方法:只可以抽象

2.设计区别

  • 抽象类中定义的是子类共性的属性功能,子类再进行方法重写接口中定义的是类的扩展的额外功能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值