一、什么是继承
当多个类中有相同的属性或者方法时,我们将这些相同的方法和属性集中写在一个新的类里面,其他类(子类,派生类)可以使用这个类(父类,超类)中的所有非私有的成员变量和方法,这就叫做继承。
继承的特点
继承首先只能单继承,不能多继承,
继承的子类可以继承父类的父类。
父类的所有非私有方法和属性子类都可以继承。
子类对父类的构造方法只有调用,不能继承。
子类和父类有同名方法或属性,优先访问子类的
注意:子类只能继承父类的非私有属性和方法,构造方法也不能继承,只能调用。
继承中 子类的成员方法和属性与父类不同,直接调用即可,如果相同,由于就近原则,会优先调用子类的方法和属性,如果想要调用父类的方法和属性,需要用 super 关键字来调用。
在子类的所有构造方法中,每行的第一句都隐式调用super();及调用了父类的无参构造方法。所有,在调用子类实例化对象时,父类优先与子类初始化。
this和super
this代表的是当前对象,super是父类的对象
this解决的是局部变量隐藏成员的问题。
super解决的是子类隐藏父类成员的问题。
this在调用成员时语法 this.成员名; this.方法名();
this在调用其他构造方法时 this(); ()内写其他构造方法的参数名 不写默认调用空参构造
super在调用父类成员时语法 super.成员名; super.方法名();
super在调用父类构造方法时 super(); ()内写父类构造方法的参数名 不写默认调用空参构造
继承中成员变量的关系
在继承中,子类可以继承父类的所有非私有的成员变量。
如果子类中有和父类成员变量相同的,会优先执行子类的 具体为 子类成员变量>父类成员变量
继承中成员方法的关系
在继承中,子类可以继承父类所有非私有的成员方法。
如果子类中有和父类同名的成员方法,会优先执行子类的成员方法,具体为 子类成员方法>父类成员方法。
当子类中的成员方法中的 形式参数(局部变量),和子类的成员变量,父类的成员变量相同时,执行顺序大小时,形式参数>子类成员变量>父类成员变量
所有,我们要想使用子类成员变量,需要用 this.局部变量名 = 成员变量名 ;来指定是子类的成员变量;;;;;;; 我们要想使用父类的成员变量,需要用 super.变量名 = 变量名 来定义。
继承中构造函数的特点
在继承中,子类不会继承父类的构造函数,只能调用父类的构造函数来实现父类的初始化。
在子类的各个构造函数(无参,有参)都在第一句隐式调用了父类的无参构造函数。
当我们显示的调用父类的构造函数时,就不会自动调用父类无参的构造函数。但如果父类没有这个构造函数,比如没有在父类显示定义有参的构造函数,调用会出错,解决方法就是在父类写一个有对应参数的。
二、重写
方法的重写是对子类继承的成员方法才有的概念,子类继承父类的方法后,再次定义和父类成员方法所有都相同,出了方法体不同的方法,这个方法就是父类对应方法的重写。
父类的私有方法不能重写,重写后访问等级不能低于父类。建议同级。
重写是多态的前提。
final关键字
final是最终的意思,它可以修饰 属性,方法,类。
final修饰的类为最终类,最终类没有子类。
final修饰的方法为最终方法,最终方法不能被重写。
final修饰的属性:1.为基本类型:此时修饰的属性为最终属性,为常量;
2.为引用类型:此时修饰的属性为最终地址;引用类型的地址不变,但里面的内容可变。