Day 14 多态

发布于:2023-01-20 ⋅ 阅读:(369) ⋅ 点赞:(0)

什么是多态

描述某一个事务在不同时间的状态

多态的前提条件访问特点

前提条件

  • 必须有继承关系

  • 有方法重写

  • 父类引用指向子类对象

访问特点

  1. 成员变量编译看左,运行看左
  2. 成员方法编译看左,运行看右
  3. 静态方法,算不上重写,跟类相关
  4. 构造方法,分层初始化,先执行父类初始化,再执行子类

多态的弊端

-----不能访问子类特有的功能

多态的格式

FU fu = new Zi(); //向上转型

解决方案

  1. 创建具体子类对象

    Zi zi = new Zi() ; //Zi:子类名

    不好:需要重新开辟堆内存空间,消耗内存空间

  2. 向下转型

    Zi z = (Zi)fu; //符号强转的语法

    z.特有功能() ;

    不需要单独去开辟堆内存空间

多态的好处

  1. 可以提高代码复用性,有继承关系的保证
  2. 可以提高代码的扩展性,由多态保证

abstract 抽象类

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

public abstract 返回值类型(参数);

抽象类的特点

  • 成员变量:可以是变量,也是自定义常量

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

  • 构造方法:可以存在无参/有参构造方法;分层初始化:先父类初始化,然后再是 子类初始化;

抽象类不能实例化:不能new对象

所以通过抽象类多态来实例化,通过具体的子类进行实例化

抽象类名 对象名 = new 具体的子类名() ;

abstract 不能和哪些关键字使用

抽象类不能实例化,而且它是强制子类必须重写抽象方法;

abstract不能和 static使用:

​ -----static被类名访问.跟类相关,静态方法算不上方法重写;

不能和private使用:

​ ------被private修饰的:只能在当前类访问 而abstract修饰的方法需要被子类重写

不能和final使用

​ -------被final修饰的成员方法,不能被重写; (有的jdk源码中会看到) abstract修饰的方法必须子类重写;

interface 接口

什么是接口

接口:体现的是一种额外功能

接口比抽象类还抽象:抽象类都不能直接new对象,接口也不能 实例化

接口多态: 接口名 对象名 = new 子实现类名() ;

接口的定义

interface 接口名{}

接口和类名的命名规范同理,遵循"大驼峰命名法"

接口的成员特点

  • 成员变量----没有成员变量,成员变量只能是常量

    -存在默认的public static final 修饰的

  • 成员方法----成员方法默认抽象 abstract

  • 构造方法----没有构造方法

接口和抽象类的区别

1)成员的区别

成员变量:

--------抽象类:

可以是变量,也可以是自定义常量

-------接口:

成员变量只能是常量: 存在默认修饰符 public static final 修饰的 ,可以省略

成员方法

--------抽象类:

即可以是抽象方法,也可以是 非抽象方法

--------接口:

只能是抽象方法,存在默认修饰符:public abstract :可以省略

构造方法

--------抽象类:

既可以存在无参构造方法/有参构造方法,存在继承关系,分层初始化先父类初始化,再是子类初始化(子类需要用到父类中)

---------接口:

没有构造方法的 ,意义:就是通过接口暴露给外面功能,实现这些功能接口

2)关系区别

Java中最基本的单元是类,Java本身就面向接口编程

类和类:继承关系 extends,Java语言中只支持单继承,不支持多继承,但是可以多层继承

类和接口: 实现关系 implements;一个类继承另一个类的同时,可以实现多个接口

接口和接口:继承关系:extends 不仅支持单继承,也可以多继承!

3)设计理念的区别

抽象类:

存在继承关系, 体现的是一种"is a"的关系 ,什么是什么的一种A类是B类的一种,B类是A类的一种 ,这个时候要使用继承;

接口:

子实现类 实现关系,体现的一种"like a"的关系,什么像什么的一种额外的扩展功能 ;

本文含有隐藏内容,请 开通VIP 后查看