继承
继承是java面向对象三大特征之一,可以使得子类具有父类的方法,还可以在子类中重新定义,追加属性和方法
格式:
public class 子类名 extends 父类名{
}
父类也被称为基类,超类
子类也被称为派生类
继承的好处和弊端
1.继承的好处:
- 提高了代码的复用性(多个类的相同的成员放在同一个类中)
- 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
2.继承的弊端:
继承让类和类之间产生了关系,类的耦合性增强了,当父类发生改变时子类也不得不发生改变,削弱了子类的独立性
3.什么时候使用继承?
- 继承体现的关系:is A,两个类A和B,满足A是B的一种或B是A的一种,说明他们存在继承关系,这个时候就可以考虑使用继承来体现,否则不能滥用继承
- 举例:苹果和水果(√),猫和动物(√),猫和狗(×)
继承中变量访问特点
- 首先在子类局部范围内查找
- 没有就到子类成员范围内查找
- 还是没有就到父类成员范围内查找
- 如果还是没有就报错 (不考虑父亲的父亲)
super关键字
super关键字和this关键字用法相似
- this代表本类中对象的引用
- super代表f父类存储空间标识(父类中对象的引用)
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
---|---|---|---|
this | this.成员变量 ,访问本类的成员变量 | this.成员方法() ,访问本类的成员方法 | this(...) ,访问本类的构造方法 |
super | super.成员变量 ,访问父类的成员变量 | super.成员方法() ,访问父类的成员方法 | super(...) ,访问父类的构造方法 |
继承中构造方法访问特点
子类中所有的构造方法默认都会访问父类中无参构造方法。
为什么?
- 因为子类会继承父类中数据,可能还会使用父类中的数据,所有在子类初始化之前,一定要先初始化父类的数据
- 所有子类方法中默认语句第一句都是**
super()
**
如果父类中没有无参构造方法,只有带参构造方法怎么办? - 在子类中通过super()去显式得调用父类中的带参构造方法
- 在父类中自己提供一个无参构造方法(推荐)
继承中成员方法访问特点
- 先到子类成员范围中查找,可以通过在子类成员方法中使用
super.方法名()
,调用父类中同名方法 - 没找到再到父类成员范围中查找
- 如果都没有就报错(不考虑父亲的父亲)
super内存图
public class demo2 {
public static void main(String[] args) {
//创建对象
Zi zi = new Zi();
zi.method();//父类中show()方法被调用
zi.show();//子类中show()方法被调用
}
}
Zi zi;
main()方法入栈后,在栈内存中调用子类new Zi();
子类对象初始化,在堆内存中分配地址给子类对象,并初始化子类数据,- 子类的构造方法入栈,因为子类构造方法中第一句默认都是
super();
所以会访问父类,在堆内存中初始化父类,及父类数据 - 父类构造方法入栈,执行父类中构造方法的方法体,再执行子类构造方法中的方法体
- 调用
method()
方法,子类中没有找到,去父类中找,找到后调用 - 调用子类中
show()
方法
方法重写
- 方法重写,指子类中出现了和父类中一样的方法声明
- 方法重写的应用场景,当子类需要父类的功能,而子类又有自己的特定功能时,可以重写父类中的方法,这样既沿袭了父类中的方法,又有了子类自己的特有内容
@override
注解,检查重写方法时,声明的正确性
方法重写注意事项
- 父类中私有方法不能被重写(父类私有成员,子类不能继承)
- 子类中要重写的方法的访问权限不能低于父类中的方法访问权限(public>默认>private)
java中继承的注意事项
- java中类只支持单继承,不能多继承
- java中类支持多层继承
包
- 包的作用就是对类进行分类和管理
- 定义格式:
package 包名
(多级包用. 点号分开),例如:package.com.test
- 导包import
修饰符
修饰符分类及总结见:https://www.cnblogs.com/benon94/p/12435064.html
权限修饰符
修饰符 | 本类中 | 同一个包中的子类或无关类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
状态修饰符
- final
final修饰局部变量:
final修饰基本类型变量:变量的数据值不能发生改变
final修饰引用类型变量:变量的地址值,即其引用不能改变不能发生改变,但其地址里的内容值可以改变 - static
static是静态的意思,可以修饰成员变量,成员方法
static修饰的成员变量(包括数据),被类的所有对象共享(判断是否使用static修饰的条件)
可以通过类名直接调用(推荐),也可以通过对象名调用
static访问特点:
非静态方法可以访问:静态与非静态成员变量,方法
静态方法只能访问静态成员变量和方法