前言
继承:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
继承:多个类有共同的成员变量和成员方法,抽取到另外一个类中(父类),在让多个类去继承这个父类,我们的多个类就可以获取到父类中的成员了。
子类可以直接访问父类中的非私有的属性和行为。
通过 extends 关键字让类与类之间产生继承关系。
一、继承的特点
Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2…//error
Java支持多层继承(继承体系)
class A{}
class B extends A{}
class C extends B{}
二、继承中的成员变量
如果子父类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this;访问父类中的同名变量 用super。
super的使用和this的使用几乎一致。
this代表的是本类对象的引用;super当前子类对象父类的引用
继承中成员变量的特点
子类只能获取父类非私有成员
子父类中成员变量的名字不一样,直接获取父类的成员变量
子父类中成员变量名字是一样的,获取的是子类的成员变量
就近原则:谁离我近我就用谁
如果有局部变量就使用局部变量
如果没有局部变量,有子类的成员变量就使用子类的成员变量
如果没有局部变量和子类的成员变量,有父类的成员变量就使用父类的成员变量
啥都没有,出错了!!!
super:可以获取父类的成员变量和成员方法,用法和this是相似的
三、继承中的成员方法
当子类出现和父类一模一样的方法时,当子类对象调用该方法,会运行子类方法的内容。如同父类的方法被覆盖一样。
这种情况是方法的另一个特性:
重写(覆盖)(override)
重载(overload)同名不同参数
方法的重写(override):在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类重写了父类的方法之后,使用子类对象调用的就是子类的方法
方法的重载(overload):在一个类中,有多个重名的方法,但是其参数不一样(参数的个数,参数的类型,参数的顺序),和返回值无关
- 方法重写的应用场景:当父类的方法不能完全满足子类使用,这个时候子类重写父类的方法,并可以在方法中使用关键字super调用父类的方法,这样做即可以保有父类的功能,也可以拥有子类特有的功能
- 方法重写的注意事项:不能重写父类私有的方法。权限必须大于等于父类方法的权限。
@override:方法上有该注解说明是重写。
四、继承中的构造方法
在对子类对象进行初始化时,父类的构造方法也会运行,那是因为子类的构造方法默认第一行有一条隐式的语句super()。
super():会访问父类中的空参数构造方法。而且子类中所有的构造方法默认第一行都是super( )。
继承中构造方法的执行顺序
- 在子父类中,创建子类对象,调用子类的构造方法,子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造
- 为什么要调用父类构造?因为需要给父类的成员变量初始化,肯定会先把父类的构造执行完毕,再去执行子类构造中的其他代码
总结
this和super的区别
- this:当前对象的引用
调用子类的成员变量
调用子类的成员方法
在子类的构造方法第一行调用子类其他构造方法 - super:子类对象的父类引用
调用父类的成员变量
调用父类的成员方法
在子类的构造方法第一行调用父类的构造方法 - 继承的优缺点
优点
提高了代码的复用性
提高了代码的可维护性
缺点:
类的耦合性增强了
开发的原则:高内聚低耦合
内聚:就是自己完成某件事情的能力
耦合:类与类的关系