类的继承

Posted 乌龟王八蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的继承相关的知识,希望对你有一定的参考价值。

类的封装

类的三大特性,封装、继承、多态,其中,实现封装的关键字是 private

Java中,类的封装只有一个目的:隐藏内部实现细节,提供功能实现

  • 对于内部,类的属性访问、修改不可直接进行,而是通过特定的方法 get、set
  • 对于外部,只需要 在意该类可以提供的功能,而不必要关心其内部细节

喜欢吃鸡蛋,而不必在意下蛋的细节或下蛋的母鸡,这是封装的理解

访问权限修饰符

Java 中的四个关键字 privatedefaultprotectedpublic,作为访问权限修饰符存在

作用于类、属性、方法,代表着不同的可访问级别,具体的细节如下

image

以上,是详细的访问级别,当不添加访问修饰符时,默认为 default

对于 Java 中的 package 包,简单理解为文件夹即可,代表 Java 源文件存放的层次目录

类的继承

Java 中,实现继承的关键字是 extends

在继承中,存在几个注意点

  1. Java 只支持单继承,即一个子类只可以继承一个父类
  2. 子类可以继承父类的(非私有)属性、(非有参构造)方法
  3. 子类自动调用父类的默认无参构造

根父类 Object()

在 Java 的继承体系中,存在一个最高父类 Object,由它派生出其它的 Java 类

Object 类中,定义了一系列的公用方法,常见的有

  • toString():返回该对象的字符串表示
  • equals():比较两个对象的相等
  • hashCode():返回该对象的哈希值
  • clone():对象的克隆

==、equals() 的区别

在 Java 中,两个数据元素是否相同,存在两个方法判断,==equals()

  • == :对 原始 类型进行 判断,而 引用 类型则通过 堆存储地址 判断
  • equals()不可以用于 原始 类型判断引用 类型则通过 堆存储地址 判断

简单的理解,== 对于原始类型,就是比较内容上的是否相同

而对于引用类型,==equals() 则是比较两个变量的对象引用地址是否相同

值得注意的是,equals() 可以被重写,更改它的判断条件,多见于 String、Integer

Java 中不支持 运算符重载,所以 == 的定义不会改变

方法的重写

方法重写的前提,是父类方法可以被子类继承

在 Java 的继承,子类可以在继承父类方法的基础上,重写该方法,存在以下限制

  • 子类不可以重写父类的静态成员方法、默认构造方法,但允许存在同名静态方法
  • 方法重写时,必须使用 @Override 注解进行声明,标注这是一个有效的方法重写
  • 类的属性不存在重写!!!

父类静态方法可以继承、不可重写,但允许存在同名静态方法,细节参考之后的 多态

@Override 注解可以对方法的重写做出约束(了解即可)

  1. 子类重写方法的访问权限,大于、等于父类方法
  2. 子类重写方法的返回类型,是父类返回类型或其子类
  3. 子类重写方法抛出的异常,是父类抛出的异常类型或其子类

方法重写的约束,也可以满足里氏代换的要求

方法的重写与方法的重载只是看似一样,实质完全不同的两个概念

super 关键字

super 关键字可以访问父类的构造方法、实例属性、实例方法

简单的理解为,子类继承了父类,父类相当于实例化了一个对象

基于此,可知 super 关键字的两个用途

  1. 在子类的构造方法中,调用父类的构造方法
  2. 访问父类的(非静态、私有)属性、(非静态、私有)方法

super 关键字与 this 关键字 都必须置于构造方法首行,率先执行,故二者又不可同时存在

final 关键字

最早见到 final,是在常量中,表示 final 常量,定义变量的不可变性

值得注意的是,final 关键字的用法很多,但含义上是一致的

在继承中,final 又意为不可继承

final 修饰类,则该类不可被继承;若 final 修饰类实例方法,则该方法不可被重写

值得注意的是(多次提醒),static 是可继承、不可重写,但可存在静态同名属性、函数

继承中的执行顺序

在 Java 的继承中,父类、子类的各种属性、方法、代码块,存在不同的执行优先级

若属性、方法、代码块的优先级相同,则顺序执行,自上而下

  1. 父类静态字段、静态代码块
  2. 子类静态字段、静态代码块
  3. 父类成员变量、非静态代码块
  4. 父类构造方法
  5. 子类成员变量、非静态代码块
  6. 子类构造器

简单的理解,父类、子类的静态部分是第一优先级,其次是父类其他部分、最后是子类

值得注意的是,构造方法的执行优先级,低于实例属性、方法

这也是为了方便 通过构造方法,为对象的实例属性赋值

以上是关于类的继承的主要内容,如果未能解决你的问题,请参考以下文章

类的继承与派生

类的继承

用类的继承关系实现简易后台代码模板

python系统学习14类的继承与创新

静态代码块类的继承和接口

类的继承和多态细思