为了把具有相同内容的多个类的相同内容定义到一个类中,让这个类与这多个类具有一定的关联,这多个类就可以具备这一个独立类的功能,针对这一情况,Java提供了一个关键字:extends 继承。
继承概述:多个类中具有相同属性和行为时,将这些内容抽取到一个单独类中,那么这些多个类就不需要在定义这些属性和行为,只需要继承这个类即可。
通过extends可以实现继承关系。
class 子类名 extends 父类名{}
单独的这个类被称为父类,基类或超类,这多个类可以称为子类或者派生类。
有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。
继承的好处:
1、提高代码的复用性:多个类相同的成员可以放到同一个类中。
2、提高了代码的维护性:如果代码需要修改只需要改一处即可。
3、让类与类之间产生关系,其实是多态的前提,其实这也是继承的一个弊端,类的耦合性很强。(开发的原则:低内聚,高耦合。耦合:类与类的关系;内聚:就是自己完成某件事的原则)
Java中继承的特点:
1、Java中继承只支持单继承,不支持多继承;()有些语言是支持多继承的,如C++。)
2、Java支持多层继承(继承体系)
继承的注意事项:
1、子类只能继承父类的非私有成员;(这也是继承的另一个弊端:打破了封装性)
2、子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法
3.不要为了部分功能而建立继承
例如:public A{
public void show()1{}
public void show()2{}
}
public B{
public void show()2{}
public void show()3{}
}
这里如果B为了A中的show2()方法而建立继承,也会继承了多余的show1()方法
4、继承中体现的是 ”is a“ 的关系
继承中的成员变量:
名称不同:soeasy
名称相同:在子类方法中访问一个变量的查找顺序:
1、在子类方法的局部范围找,有就使用;
2、在子类的成员范围找,有就使用;
3、在父类成员范围内找,有就使用;
4、如果还找不到,报错。
上礼中我们不仅要输出局部和本类的age ,还想要输出父类的age 怎么办呢?有一个关键字super 和this 相似,可以直接访问父类的数据。
this和super的区别:
this代表本类对应的引用;
super代表父类存储空间的标记(可以理解为父类的引用,可以操作父类的成员)
怎么用?
调用成员变量:
this.成员变量:调用本类的成员变量;
super.成员变量:调用父类的成员变量;
调用构造方法:
this.(…):调用本类构造方法;
super.(…):调用父类构造方法;
调用成员方法:
this.成员方法:调用本类成员方法;
super.成员方法:调用父类成员方法;
继承中构造方法的关系:
1、子类中的构造方法都默认访问父类的空参数构造方法:因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化之前,一定先进行父类数据初始化。
注意:子类的每一个构造方法的语句默认都是super();
如果父类中没有无参构造方法,该怎么办?
1、在父类中加一个无参构造。
2、使用super显式调用父类的一个带参构造,
3、子类通过this调用子类其他构造方法。
一个类的初始化过程:
1、成员变量进行初始化;
2、默认初始化;
3、显式初始化;
4、构造方法初始化;
看程序写结果1:
1、一个类的静态代码块>构造代码块>构造方法的执行
2、静态内容随着父类的加载而加载,静态代码块的内容会优先执行
3、子类初始化之前先进行父类初始化
看程序写结果2:
1、成员变量的问题:
成员变量是基本类型:int x =10;
成员变量是引用类型:Son s =new Son();
2一个类的初始化过程:
成员变量进行初始化;默认初始化;显式初始化;构造方法初始化;
3、子类初始化之前先进行父类初始化(分层初始化)
上例中,虽然子类中构造方法有一个默认的super();但是在初始化的时候不是按照这个进行的,而是按照分层初始化进行的,先进行父类数据初始化,在进行子类数据初始化。所以说。输出结果是YXYZ,而不是YXYXZ.
Java学习之继承
最新推荐文章于 2021-09-07 07:58:36 发布