复习一下
子类继承了父类除构造方法之外的所有东西
注意是先帮父类对象进行构造 注意先后顺序
这里的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,常量
在接口中随便写一个都是常量 常量是不可被修改的



