java学习——继承
前言
继承是面向对象语言的一种特性,利用继承,人们可以基于一个已存在的类构造一个新类。
继承已存在的类就是复用(继承)这些类的方法和域。
在此基础上,还可以添加一些新的方法和域,以满足需求。
继承是java程序设计中的一项核心技术
关键字extends表示继承
继承的格式
public class Animals {}
public class Cat entends Animals {}
代码块
- 在java中,使用{}括起来的代码被称作代码块,根据其位置和生命的不同,分为局部代码块,构造代码块,静态代码块和同步代码块
- 局部代码块:在方法中出现,限定变量生命周期,及早释放,提高内存利用率
- 构造代码块:在类中方法外出现,多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法之前执行
- 静态代码块:在类中方法外出现,并用static修饰符修饰,用于给类初始化,在类加载时执行一次,并且只执行一次
- 一个类的静态代码块,构造代码块,构造方法的执行流程:
静态代码块 > 构造代码块 > 父类无参构造方法 > 子类构造方法
继承的优势与弊端
- 继承的优势
- 提高了代码的复用性
- 提高了代码的维护性
- 让类与类产生了关系,是多态的前提
- 继承的弊端
- 类的耦合性增强
- 类的耦合性增强
开发的一个原则:低耦合,高内聚
耦合:类与类的关系
内聚:就是自己完成某件事情的能力
继承的特点
- java中只支持单继承,不支持多继承,即只能有一个父类
- java支持多层继承,即一个子类继承一个父类,另一个类可以继承这个子类
继承的注意事项
- 子类只能继承父类的非私有成员,父类的构造方法不继承
- 可以通过super关键字访问父类的私有成员和构造方法
- 不要为了部分功能使用继承
原因:因为子类继承了父类的所有非私有成员,注意是所有成员,里面可能有我们不想用的成员
继承中成员变量的关系
- 子类中成员变量和父类成员变量名称不同的时候,直接使用即可
- 子类中成员变量和父类成员变量名称相同的时候,通过this关键字和super关键字来区别
this关键字和super关键字的用法和区别
- this关键字:this代表本类对象的引用
- super关键字:代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
- 用法:
- 调用成员变量
- this.成员变量 调用本类的成员变量
- super.成员变量 调用父类的成员变量
- 调用构造方法
- this(…) 调用本类的构造方法
- super(…) 调用父类的构造方法
- 调用成员方法
- this.成员方法 调用本类的成员方法
- super.成员方法 调用父类的成员方法
- 调用成员变量
注意: 不能在类方法(用static修饰的方法)中使用this
原因:静态方法随着类的加载而加载,成员变量和成员方法随着对象的创建而创建
继承中构造方法的关系
子类中所有的构造方法都会默认访问父类的无参构造方法
原因:子类会继承父类中的数据,还可能会使用父类的数据,所以子类初始化之前一定要先完成父类数据的初始化
注意:子类的每个构造方法的第一条语句都是super()父类没有无参构造方法报错时的解决办法
- 在父类中加一个无参构造方法
- 通过super关键字去显示调用父类的其他带参构造方法
注意:this(…)或者super(…)必须出现在构造方法的第一条语句上
继承中构造方法的关系
- 子类中的方法与父类中的方法声明不一样,直接调用即可
- 子类中的方法与父类中的方法声明一样时,通过子类对象调用方法的查找使用顺序:子类 > 父类
方法重写与方法重载
- 方法重写:子类中出现了和父类中方法声明一模一样的方法,也被成为方法覆盖,方法复写
- 方法重载:本类中出现的方法命一样,参数列表不同的方法,与返回值无关
- 子类对象调用方法时先找子类本身,再找父类
- 方法重写的应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容
方法重写的注意事项:
1. 父类中的私有方法不能被重写(因为父类私有方法子类无法继承)
2.子类重写父类方法时,访问权限不能更低