栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多态 抽象类 接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多态 抽象类 接口

复习一下

子类继承了父类除构造方法之外的所有东西

注意是先帮父类对象进行构造  注意先后顺序 

这里的super表示帮助父类先进行构造

super表示对父类对象的引用

this表示当前对象的引用

这里this.huzi=huzi表示对子类自己特有的进行赋值构造 

在子类中构造出一个方法

由于子类继承了父类  并且super帮助父类进行了构造

所以子类这里可以用this对当前对象进行引用 

向上转型

注意什么是对象

这里的Cat就是一个子类对象

向上转型就是父类引用了子类对象  并且调用了子类的构造方法name  huzi0

但是进行通过animal这个对象进行访问时

只能访问父类中的属性

因为animal这个对象的类型就是Animal

所以不能访问子类的huzi这一属性 

运行时绑定  也叫运行时多态 也叫动态绑定

由于父类与子类含有共用的eat方法

因此发生此过程

重写的时候我们要明白子类的访问修饰限定符必须大于父类的访问修饰限定符

 一个坑

在这个过程也一样会发生动态绑定的

何为动态绑定?即是运行时绑定

在编译的时候调用的时父类自己的func方法

但是在运行时我们调用的是子类的func方法

多态

重写状方法  这个状方法就是形状的方法

我们这里用alt+insert

 重写状方法

 注意这里Cycle继承了父类Shape

为什么这里会报错呢?

因为这里我们发生的是重写

Java程序中类的继承特性可以产生一个子类,

子类继承父类就拥有了父类的非私有的属性(方法和变量),

在子类中可以增加自己的属性(方法和变量),

同时也可以对父类中的方法进行扩展,以增强自己的功能,这样就称之为重写,也称为复写或者覆盖。

所谓方法重写就是子类的方法和父类中继承下来的方法具有完全相同的方法名、返回值类型、方法的参数个数以及参数类型,这样才能被称为方法重写。

 这里报错的原因是我们重写应当保持方法名  返回值类型  方法的参数个数以及参数类型都相同

注释@Override表示的就是重写

好吧

扯了这么多 还是回归主题

何为多态?

我把这个例子拿过来

好的  先看例子

 分析:

我们可以知道父类是Shape类型

父类通过调用子类对象  这一过程中我们说

发生了向上转型对吧

然后呢?

由于这个父类包含了多个子类对象

因此他发生向上转型时引用的子类对象不止一个

那么通过我们构造出的shape1 shape2

然后进行调用状方法时

我们既可以通过shape1或者shape2进行调用

无论调用哪一个我们都会发生运行时绑定

可以父类调用多个子类对象进行调用状方法

因为父类的子类对象不止一个

那么我们不知道是通过哪一个shape进行调用状方法 是shape1还是shape2呢?

即是可以发生不同情况下多个运行时绑定的情况我们称之为多态

注意上面的drawMap方法是同等的意思 都是表示调用状方法时展现的不同情况

意思就是在调用引用一个drawMap方法时 当这个方法可能会有多种表现形式 我们把这称之为多态

 发生多态的前提

多态的好处

 如下

 意思就是通过一个drawMap方法我们就可以展现出不同的形态

只需要是它的一个子类就行 并且重写了状方法就可以

总结多态

我们通过父类的向上转型构造出了不止一个对象

然后构造一个方法

当我们调用这个方法时 传的对象不一样

有可能是shape1 也可能是shape2或shape3等等一系列的对象

 所以我们运行时 调用的子类状方法时不一样的(因为会发生运行时绑定 运行时绑定就是  在编译的时候我们调用的是父类的状方法 但是在运行时我们调用的是子类的状方法)

所以我们称这多样的玩意叫做多态

抽象类

 注意

1.

抽象类不可以被实例化 

不能实例化一个对象shape

 

2.

但是类内的成员和普通类是没有区别的

 3.

抽象类主要就是用来继承的

 4.

如果一个类继承了这个抽象类 那么这个类必须重写抽象类当中的所有的抽象方法

方法一  :alt+insert 实现这个抽象类中的状方法才可以避免报错 

方法二:

把继承的子类改为abstract类型即可

5.

 6.

不可加final修饰  抽象类就是为了继承和重写 但加了final之后就不可重写了

 public也不可以改为private

 总结:

 使用抽象类  注意不可以new  Shape 不可以被实例化

 

接口 

是抽象类的进一步抽象

interface表示抽象类 

接口当中的方法都是抽象方法 

3.

在接口当中 定义的成员变量 默认是常量 

4.

接口中的方法是默认是abstract类型的

5.接口是不可以被实例化的

不可以new

 6.

接口和类之间的关系是implements 

 但值得一提的是这里的报错原因

是因为一旦一个类实现了这一个接口 那么就要重新这个接口 alt+insert

7.

为了解决java单继承的问题 可以实现多个接口  

 

8.

只要这个类实现了这个接口 那么就可以发生向上转型了

 

总结: 

 

接口时implements 是实现

 如何在idea中实现接口呢?

右键包 然后点Java class往下一拉点interface 

在项目当中

一个接口必须新创建一个类 

新创建一个类

protected表明name属性

public创建Animal构造方法

 如图

 

注意一点

我们必须先extends继承再implements实现

不要搞反顺序

分析一下

在子类继承父类的过程中我们知道

首先子类必须实现父类的构造方法

其次

我们不是还得implements使用嘛

所以我们需要重写接口的方法  

当然为了弥补Java这个玩意的单继承性的这一缺陷

我们研究出来了接口

可以使用多个接口以达到多继承的效果 

哎  

说实话 挺绕的

没办法头一次学起来就是这样复杂 我也迷了两天了

我们总结一下:

有些人要说了为什么不把这个接口的方法直接放到父类中呢?

直接继承不就省事了吗?

举个例子  

刚才我们举的是鱼和青蛙的例子:先继承Animal然后使用接口的例子

如果说我们把游泳和跑这两个方法都写在Animal这个父类中去

好家伙

确实省事了 不用再开发出接口了

但是你想一想  鱼真的会跑吗?都继承过来不就坏了吗?

什么是继承?

继承就是继承父类处构造方法之外的所有东西

我们Java当中也不可以继承多个类对吧?那么只能把这些方法放到接口

所以这里我们需要实现接口

需要谁 我们就接谁  因为Java允许使用多个接口

然后让类去implement去使用

 

接口的出现完美的解决了Java的多继承问题

实现接口的好处 

使用接口让我们忘记了类型

implements使用时我们必须记住重写方法 

举个例子

重写alt+insert

或者crtl+o

实现接口并且使用IRunning这个接口

 

 

 

草!

接口的实例使用:

首先我们创建一个类

记住我们创建属性之后

要记得搞一下构造方法 

alt+insert选中即可

 

final修饰的东西不可以变

抽象类无法创建对象

 

 

对象是存在的 所以我们通过类来创建一个对象

但是类不是真实存在的 所以我们不可以通过抽象类来创建一个类对象即是我们无法实例化

 

 

定义一个接口我们用interface

定义一个类我们用class

定义一个抽象类我们用abstract class

修饰符列表就是pubic protected  private 等等 

接口中的方法都是抽象方法

 不可以有方法体 

 

 接口中的常量中的public static final是可以省略的

 因此我们可以知道

在接口中我们只可以出现两种东西

1,抽象方法

2,常量

在接口中随便写一个都是常量  常量是不可被修改的

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434227.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号