Java教程

继承

本文主要是介绍继承,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

继承

语法格式

public class 子类名 extends 父类名 { }

​ 注意事项:Java 不支持多继承 可以多层继承 (一个类不可以直接有多个父类,可以有父类的父类)

作用

​ 让类3与类之间产生关系,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法

好处

​ 提高了代码的复用性和可维护性.

​ 复用性:父类有的代码子类都有 (成员变量 和成员方法 不包括构造方法)

​ 维护性:父类统一管理子类 父类修改代码所有子类都跟着改变(也是弊端)

弊端

​ 增强了代码的耦合性(削弱了子类的独立性),子类不得不受父类影响

什么时候使用继承

​ 继承虽好,但是要满足 is a 关系才可使用 让两个类产生关系

​ 苹果 是 一种 水果 设计水果为父类 苹果为子类

​ 猫 是 一种 动物 设计 动物为父类 猫为子类

​ 经理 程序员 员工 设计 员工 为父类 经理 程序员分别继承 员工类

​ 而 经理类 和程序员类 不应该产生继承关系

子类中成员和构造方法的使用

super关键字

  1. super是一个关键字,并不是一个引用,也不指向任何对象;
  2. super只代表当前对象内部的那一块父类型特征;
  3. super.xxx() 中super中不指对象 (只是一个语法糖),长得像

在子类中方法使用一个变量 (就近原则)

  • 子类局部变量

  • 子类成员变量

  • 父类成员变量

  • 如果没有就报错(不考录父类的父类)

    • Tips:

      成员变量 和 局部变量重名 使用this.变量名 表示成员变量

      子类成员变量和局部变量 成员变量重名 使用 super.变量名 表示 父类成员变量
      
      在没有重名的情况下 根据变量作用域使用变量
      

子类的对象使用一个方法 (就近原则)

  • 子类成员范围找

  • 父类成员范围找

  • 如果没有就报错(不考录父类的父类)

    • Tips:

      在一个类中调用 本类的方法 实际上是this.方法名()

      在子类方法名和父类重名的情况下 可以用super.方法名()

重写

​ 定义:子类中出现了和父类中"一模一样"的方法声明

​ 书写:重写时

​ 修饰符范围 要大于等于父类

​ 返回值类型 为父类返回值的类型 或 父类返回值的类型的子类

​ 范围原因:(里氏原则) /多态时执行看右边 要保证程序能被执行到(其他类其他包中可能不能够被取到)

使用场景:父类方法不能满足子类的要求

​ Tips:用 @Override 注解 可帮助我们检查重写方法声明的正确性

​ 子类不能重写父类private修饰的方法 访问不到

构造方法

  • 子类中的所有构造方法 默认访问父类中的无参构造方法

    即子类所有构造方法第一行默认有一个super()

  • 为什么?

    子类除了继承父类数据,子类可能使用父类的数据 所以在子类初始化之前,要完成对父类数据的初始化

  • 在显示调用 super(参数列表)后 java 将不在提供super()

  • super(参数列表)只能放在第一行

扩展:
  • 继承时的内存图

  • this和super 都能调用构造方法 都需要书写在构造方法的第一行(要先初始化在使用)

  • this和和super 只能存在一个 1.只有一个第一行 2.无论this在前还是super在前 都会对父类进行两次初始化

  • new 关键字

    https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

    • 创建一个对象 Apple apple = new Apple()

      三个过程:

      • 声明Declaration:将变量名称与对象类型关联的变量声明。
      • 实例化Instantiating :new关键字是一个java运算符,它用来创建对象。
      • 初始化Initialization:new运算符,随后调用构造函数,初始化新创建的对象。
    • 实例化

      new运算符实例化一个类对象,通过给这个对象分配内存并返回一个指向该内存的引用。new运算符也调用了对象的构造函数。

      注意:“实例化一个类的对象”的意思就是“创建对象”。创建对象时,你正在创造一个类的“实例”,因而“实例化”一个类的对象。

      new运算符需要一个单一的,后缀参数,需要调用构造函数。构造函数的名称提供了需要实例化类的名称。

      new运算符返回它所创建的对象的引用。此引用通常被分配给一个合适的类型的变量,如:Point originone =new Point(23,94);

      由new运算符返回的引用可以不需要被赋值给变量。它也可以直接使用在一个表达式中。例如: int height = new Rectangle().height;


    当Java语法层面使用new关键字创建一个Java对象时,JVM首先会检查相对应的类是否已经成功经历加载、解析和初始化等步骤;当类完成装载步骤之后,就已经完全确定出创建对象实例时所需的内存空间大小,才能对其进行内存分配,以存储所生成的对象实例。

    实例化之后,进行初始化

修饰符

权限修饰符

是否可以访问(使用) 、作用域 该表针对成员变量来说的

修饰符 同一个类中 包中无关类 非同包有继承关系 非同包无继承
private Y
default(不写) Y Y
protected Y Y Y
public Y Y Y Y

状态修饰符

final

​ final:表示最终 可以修饰 成员变量 ,成员方法,类

    • 修饰类 表示类是最终类,不能被继承
    • 修饰方法 表示是最终方法,不能被重写
    • 修饰基本数据类型变量
      • 成员变量 表示常量,不能被再次被赋值 常量全部大写 词与词之间" _ "连接
      • 局部变量 表示 数据值不能改变
    • 修饰引用数据类型变量 表示地址值不能改变 地址值中的内容可以改变

static

static:表示静态的意思,可以修饰成员方法,成员变量
  • 特点:

    • 被类的所有对象共享 这也是判断是否使用该关键字的标准
    • 静态的成员随类加载 比构造函数作用的时期早
  • 怎么调用: 直接 类名.变量名 /直接类名.方法名()

  • 静态成员和非静态成员 访问规则:静态成员方法只能访问静态成员

  • 使用场景:工具类

    工具类特点:

    1. 没有成员变量
    2. 所有成员变量 用 静态化
    3. 构造方法私有化 不能 new 对象
这篇关于继承的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!