继承
面向对象三大特征:封装 继承 多态
封装:对象代表什么,就封装对应的数据,并提供数据对应的行为,把零散的数据变成一个整体
为什么要继承
两个类中重复的代码(数据和方法)太多,所以要继承
extend关键字
类与类之间的父子关系
让一个类和另一个类建立起继承关系
public class Student extends Person{}
student 子类 派生类
preson 父类 基类 超类
继承的好处
1.可以把子类的重复代码放入父类,提高代码的复用性
2.子类可以在父类的基础上,增加其他的功能,使子类更强大
继承怎么用
1.自己设计
2.使用别人
继承注意点
类与类存在共性 子类是父类的一种 可以考虑继承优化代码
设计继承不能全部抽用 要考虑 种类
物品的的名称 人物的名称 不能放到一个父类里面
手机的名称 零食的名称 文具的名称可以放到一个父类里面
继承的特点
1.java只支持单继承
一个子类只能继承一个、去
2.java不支持多继承
一个子类不能同时继承多个父类
3.java能支持多层继承
多层继承不是多继承
子类A可以继承父类B,父类B可以继承父类C,B是A的直接父类,C是A的间接父类
4.Object类
每一个类都直接或者间接的继承于Object(爷爷类 祖宗类)
查看当前类是否有父类,如果没有,虚拟机则会将该类继承到Object类(加一个默认继承关系)
继承练习
学会画图
从下(子类)往上(父类)
共性内容抽取
子类是父类的一种
书写代码时从上往下一个类一个类的写
一个圆圈就是一个类
写完所有类,类属于javabean
然后写main方法
再创建对象,调用类中的方法
如果访问修饰符为private而不是public
私有的成员方法,成员变量只能在本类中被使用
就无法在主类中被调用
子类到底能继承父类中的哪些内容
父类中有什么
构造方法 成员变量 成员方法
构造方法
统称为类的成员 分为非私有和private两种
父类构造方法不能被子类继承 能继承无法调用
因为public修饰的类名要与文件名一致
如果一个类中没有构造方法,虚拟机会给你一个构造方法(空参构造)
一个java文件中只写一个类
成员变量
set方法赋值 get方法获取值
成员方法
子类可以继承父类中的虚方法
继承的内存图
1.记载字节码文件时同时加载父类字节码文件
2.创建对象时 父类 子类 同时在堆内存内开辟空间 树状结构
方法出栈后 堆内存里面的垃圾(对象)会被自动清除
如果父类用中的成员变量用private修饰了 栈里面就找不到堆里面的了 相当于加了保险柜
成员变量的访问特点
就近原则:谁离我近,我就用谁
一级一级往上找
this关键字:指向本类中的成员变量
super关键字:指向父类中的成员变量
super不能链式编程
成员方法的访问特点
还是就近原则
super this 调用
和成员变量访问一样
方法重写
方法重写建立在子类和父类关系上
方法重写的本质
通过虚方法表
覆盖了虚方法中的方法
方法重写的注意事项的要求
1.重写方法的名称,形参列表必须与父类中的一致
2.子类重写父类方法时,访问权限子类必须大于等于父类
3.子类重新父类方法时,返回值类型子类必须等于父类
4.重写方法尽量与父类保持一致
5.私有方法不能被重写
6.子类不能重写父类的静态方法,如果重写会报错
重写方法就是在父类的虚方法表里找方法覆盖
方法重写练习
画图法
从下往上 抽取
当父类行为不能满足子类的需求
重写时候用super。调用父类
@override注释可以检验重写是否正确
构造方法的访问特点
特点
1.父类中的构造方法不会被子类继承
2.子类中的所有构造方法默认先访问父类中的无参构造,再执行自己
为什么
1.子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
2.子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化
怎么调用父类的构造方法
子类构造方法的第一行语句默认是super(),不写也存在,且必须在第一行
super() 访问父类的无参构造
父类中的空参构造是数据初始化
因为父类的属性都共享的被继承的
用子类构造方法中隐藏的super()去访问父类的无参构造
赋值
小结
1.子类不能继承父类的构造方法,但是可以通过super调用
2.子类构造方法的第一行,有一个默认的super()
3.默认先访问父类中无参数的构造方法,再执行自己
4.如果想要方法中父类有参构造,必须手动书写
this 是一个变量 表示当前方法调用者的地址值 局部变量
super 表示父类的存储空间
super 把属性从子类传递给父类进行赋值