面向对象概述4


  • 目录

    多态

    抽象类

    接口


1、多态的概述


  • 多态概述

    ​ 同一种事物,在不同时刻表现出来的不同状态;

    ​ 例如:Cat c=new Cat(); Animal a=new Animal(); 猫可以是猫类型,同时猫也是动物的一种,就是动物类型

  • 多态的前提

    ​ A:要有继承关系

    ​ B:要有方法重写。其实没有也是可以的,但是如果没有这个,语法上不报错,那么多态就没有意义。

    ​ C:要有父类引用指向子类对象。父 f=new 子();


2、多态中的成员访问特点


  • 成员变量

    ​ 编译看左边,运行看左边------我们采用多态的形式去访问成员变量,访问的是父类

  • 构造方法

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

  • 成员方法

    ​ 编译看左边,运行看右边-------我们采用多态的形式调用成员方法(用父类引用调用方法),以子类重写过后的为准

  • 静态方法

    ​ 编译看左边,运行看左边。(静态和类相关,算不上重写,所以还是左边父类的为准)


3、多态的好处


  • 提高了代码的维护性(继承保证)
  • 调高了代码的扩展性(由多态保证)

4、多态的弊端以及多态中向上转型和向下转型


  • 多态的弊端

    ​ 不能调用子类特有的方法/功能

  • 解决办法

    ​ 把父类的引用强制转换为子类的引用(向下转型)

  • 多态本身就是一种向上转型

    注意事项:堆内存中,父类空间标识在子类里面,先初始化父类


5、抽象类的概述及其特点


  • 抽象类的概述

    ​ 我们将多个子类的共性功能向上抽取到父类当中,我们父类肯定知道这些子类的共性功能,但是父类没有必要知道这些功能的具体实现是怎么样,因为也没有必要知道,因为每个子类都有差异性,如果我在父类中给出了这个功能的具体实现,那么每个子类的这个功能其实都是一样的,并不能体现出每个子类对这个功能的具体实现,所以父类只需要给出这个功能的声明,而不需要给出功能的具体实现,具体实现交由子类根据自身的差异去实现。

    ​ 在Java中,一个没有方法体的方法应该定义为抽象方法(交给子类去做),而类中如果有抽象方法,该类必须定义为抽象类。

  • 抽象类的特点

    ​ A:抽象类和抽象方法必须用abstract关键字修饰

    ​ 抽象类格式:abstract class 类名{}

    ​ 抽象方法格式:public abstract void eat(){};

    ​ B:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

    ​ C:抽象类中可以有构造方法,抽象类不能进行实例化(抽象类不能创建对象),那么要构造方法有什么作用呢?

    ​ 用于子类访问父类数据时的初始化

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

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

    ​ E:抽象类的子类

    ​ 要么是抽象类,要么重写抽象类中的所有抽象方法。

    ​ 当一个类继承了一个抽象类,抽象类中的抽象方法是要求子类必须重写,非抽象方法子类可以直接继承使用。

  • 抽象类的成员特点

    ​ 成员变量:既可以是变量,也可以是常量。

    ​ 构造方法:有。在创建子类对象时,对父类数据进行初始化。作用就是我们采用多态的形式可以间接的初始化抽象类。

    ​ 成员方法:既可以是抽象的,也可以是非抽象的。

    ​ 抽象方法:带有强制性,要求子类必须重写。

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


6、抽象类中的面试题


  • 一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

    ​ 可以,外界不能创建该类的对象

  • abstract不能和哪些关键字共存?

    ​ private ------------冲突(abstract强制重写,private私有的不能继承,何谈重写)

    ​ final---------------- 冲突(abstract强制重写,final不让重写)

    ​ static---------------不能共存,没有意义


7、接口的概述及其特点--------接口与类同级别


  • 接口概述

    ​ 为了体现事物功能的扩展性,java中就提供了接口来定义这些额外的扩展功能,并不给出具体实现。接口中定义的方法是抽象的,不给出功能的具体实现。

    ​ 接口也会定义规范和规则;

  • 接口特点

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

    ​ B:类实现接口用implments表示 格式:class 类名 implments 接口名 {}–>父子关系,子类实现接口

    ​ C:接口不能实例化也就是接口不能创建对象,那么接口如何实例化呢?

    ​ 按照多态的方式来实例化。

    ​ D:接口的子类

    ​ 可以是抽象类,但意义不大

    ​ 可以是具体类,要重写接口中的所有抽象方法


8、接口的成员特点


  • 接口成员特点

    ​ 成员变量:只能是常量,并且是静态的。接口中的成员变量全部是公共的静态常量,接口名直接调用。默认修饰符:public static final 建议自己手动给出

    ​ 构造方法:接口中没有构造方法

    ​ 成员方法:接口中的所有方法都是抽象方法。默认修饰符:public abstract ,建议自己手动给出


9、类、接口以及之间的关系


  • 类与类

    ​ 继承关系***extends***,只能单继承,可以多层继承

  • 类与接口

    ​ 实现关系***implments***,可以单实现,也可以多实现。一个类可以实现多个接口

    ​ 一个类在继承一个类的同时,也可以实现多个接口,用逗号隔开。

  • 接口与接口

    ​ 继承关系***extends***,可以单继承,也可以多继承


10、抽象类和接口的区别


  • 抽象类和接口均不能实例化,不能new对象

  • 成员区别:

    ​ 抽象类:

    ​ 成员变量:可以是变量,也可以是常量

    ​ 构造方法:有

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

    ​ 接口:

    ​ 成员变量:只可以是常量

    ​ 没有构造方法

    ​ 成员方法:只可以是抽象方法,没有非抽象方法

  • 关系区别:

    ​ 类与类 ------继承,单继承,多层继承

    ​ 类与接口-------实现,单实现,多实现

    ​ 接口与接口-------继承,单继承,多继承

  • 设计理念区别

    ​ 抽象类 被继承体现的是is a的关系。抽象类中定义的是该继承体系的共性功能。

    ​ 接口 被实现体现的是like a的关系。接口中定义的是该继承体系的扩展功能。

  • JDK1.8之后在接口中提供了用default修饰的方法,可以给出功能的具体实现,子类可以继承下去用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值