JavaSE: 面向对象

面向对象

1. 继承

  • 当一个类继承了另一个类, 另一个类中所有的属性和方法,子类就天然具备了

  • Java中使用extends表示类的继承

    • Dog extends Animal Dog为子类/派生类 Animal为父类/基类
  • 继承原则

    • 要能使用继承,前提必须满足类之间的is a关系.
    • 一个子类只能使用extends继承一个父类(单继承).但是可以多层继承
    • 子类会继承父类的所有属性和方法,
      • 显示继承: public属性和方法可以直接使用.
      • 隐式继承: private属性和方法无法直接使用.
        • 通过使用父类提供的get/set使用属性

protected关键字

  • 对于类的调用者来说, protected 修饰的字段和方法是不能访问的
  • 对于类的 子类 和 同一个包的其他类 来说, protected 修饰的字段和方法是可以访问的
  • private < default < protected < public
    • protected > 包权限
    • 同包下的没有关系的类之间以及 不同包的有继承关系的类之间可见.

super关键字

super修饰属性
  • super先从直接父类中寻找同名属性, 不存在的话再向上寻找
  • this直接从当前类中找同名属性,不存在再向上
super修饰方法
  • 修饰构造方法
    • 语法: super(父类构造方法的参数), super(); //无参构造
    • 若父类中不存在无参构造, 则子类构造方法的首行必须显示使用super(有参构造).
    • 当产生子类对象时,默认先产生父类对象, 若父类对象还有继承,就继续向上
    • 在一个构造方法中,不能同时使用this()和super(), 但是super()是隐式的.
  • 修饰普通方法
    • 直接从父类中寻找同名方法.

final关键字

  • 修饰属性
    • final修饰属性,表示属性不能变, 值定义后不能修改
  • 修饰类
    • 表示这个类无法被继承

2. 组合关系

  • 类和类之间除了继承关系,还有组合关系
  • 例如: school有teacher和student

3. 多态

  • 多态是类在继承关系下的一种形态.
  • 一个引用可以表现出多种行为/特性 => 多态性
  • 多态就是同一方法对不同的子类对象所产生的不同的形态
    • 同一个调用用同一个方法名,根据引用指向不同的对象可以表现出不同的行为.
  • 最主要的多态: 继承 + 方法重写.

3.1: 向上转型

  • 将一个子类对象赋值给父类引用, 这个过程就是向上转型.

  • 最大的意义:向上统一化. 父类名称 父类引用 = new 子类实例(); Animal animal = new Dog();

  • 向上转型发生在有继承关系的类之间.

  • new的对象不一定是直接子类, 也可以是孙子类

  • 向上转型后,最顶端的父类引用可以指代所有的子类对象

    • 向上转型之前
      在这里插入图片描述
    • 向上转型之后
      在这里插入图片描述
  • 向上转型发生的时机

    • 方法传参: 使用最多
    • 直接赋值
    • 方法返回值
      在这里插入图片描述
  • 类名称 引用名称 = new 类实例(); | 引用名称.方法名称();
  • 能通过’.方法’的方法类名称,是前面的类名称说的算, 能访问的这些方法必须都在类中定义过,编译器会先在类中查找是否包含指定方法.
  • 至于这个方法到底表现出来是哪个类样子,实例所在的方法说的算
    - 方法能不能调用看父类
    - 方法能调用,但是是什么样子(表现出的具体行为)是看new的实例是通过哪个子类new的,该子类是否重写了该方法.

3.2: 向下转型

  • 将父类引用强制类型转换为子类引用
    • 想调用子类中特有的方法, 就要向下转型.
  • 子类名称 子类引用 = (子类名称) 父类引用 | Dog dog = (Dog) animal
  • 要发生向下转型: 首先要发生向上转型, 毫无关系的两个类之间无法强转.
  • 当发生向下转型时会有风险,类型转换异常

3.3: 动态绑定

  • 调用父类方法时, 根据父类引用指向的子类对象找到具体的方法进行调用
  • 方法能不能调用看父类, 方法表现出的具体行为看子类的重写方法.

4. 抽象类

  • 抽象类是普通类的’超集’, 只是比普通类多了一些抽象方法而已
  • 抽象方法所在的类必须是抽象类, 子类若继承了抽象类, 必须重写所有的抽象方法(前提子类是普通类)
  1. java中定义抽象类或者抽象方法使用abstract关键字

    • 抽象方法指的是使用abstract关键字声明, 只有函数声明,没有函数体
  2. 若一个类使用abstract声明为抽象类, 无法直接通过该类实例化对象, 哪怕该类中一个抽象方法都没有.

  3. 子类继承了抽象类, 就必须强制子类覆写抽象类方法, 也满足单继承局限

  4. 抽象类就是普通类的超集(普通类有的,抽象类全都有), 只是比普通类多了一些抽象方法而已, 抽象类虽然没法直接实例化对象, 但是也可以存在构造方法, 子类在实例化时, 仍然遵从继承的规则, 先调用父类的构造方法, 而后调用子类的

5. 接口

  1. 接口表示具备某种能力/行为, 子类实现接口时不是is a, 而是具备这种行为或能力
  2. 接口表示一种规范或者标准.
  • 接口中只有全局常量(1%可能会有)和抽象方法
  • 使用关键字interface声明接口
  • 子类使用implement实现接口, 必须覆写所有的抽象方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值