继承可以解决代码复用,当多个类存在相同的属性(变量),和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。
基本语法:
class 子类 extends 父类{
}
1)子类会自动拥有父类定义的属性及方法
2)父类又叫超类或基类
3)子类又叫派生类
继承优点:
A: 代码的复用性提高
B: 代码的扩展性和维护性提高了
继承的细节:
1)子类继承了所有的属性和方法,非私有属性和方法在子类可以在子类直接访问但私有属性和方法不能在子类直接访问,要通过父类所提供的公共的方法进行访问。
2)子类必须调用父类的构造器,完成父类的初始化
3)当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中使用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不通过
4)如果希望指定去调用父类(基类)的某个构造器,则显示的调用一下:super(参数列表)
5)super在使用时,只能在构造器中使用且需放在构造器第一行,
6)super()和this()都只能放在构造器的第一行,因此这两个方法不能存在于一个构造器内(this()的含义为调用本类无参构造器,有参即在括号内加)
7)java的所有类都是Object类的子类,Object类是所有类的基类
8)父类构造器的调用不限于直接父类!将一直追溯到Object类(顶级父类)
9)子类最多只能继承一个父类(指直接继承),即java中是单继承机制(如果想要得到多继承的效果,不妨再在直接继承的子类再次进行继承定义)
10)不能滥用继承,子类与父类之间必须满足is-a的逻辑关系(即集合是否有相重合的部分)
super关键字
super代表父类的引用,用于访问父类的属性,方法以及构造器
基本语法:
a:访问父类的属性,但不能访问父类的private属性:super.属性名
b:访问父类的方法,但不能访问父类的private方法:super.方法名(参数列表)
c:访问父类的构造器:super(参数列表);只能放在构造器中的第一句,且只能出现一句
super的便利及细节:
1)调用父类构造器的好处(分工明确:父类构造器用于父类属性的初始化,子类构造器用于子类属性的初始化)
2)当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问都是一样的效果
3)super的访问不限于直接父类,如果隔代父类和本类中有同名的成员,也可以使用super去访问隔代类的成员;如果多个基类(上级类)都有同名成员,使用super访问遵循就近原则
super与this的比较
区别点 | this | super |
访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 从父类开始查找属性 |
调用方法 | 访问本类中的方法,如果本类中没有此方法则从父类继续查找 | 直接从父类开始查找方法 |
调用构造器 | 调用本类构造器,必须放在构造器首行 | 调用父类构造器,必须放在子类构造器首行 |
特殊 | 表示当前对象 | 子类中访问父类对象 |
方法重写/覆盖override
方法覆盖(重写):子类有一个方法,和父类的某个方法名称、返回类型、参数一样,那么我们就说子类这个方法覆盖了父类的方法
注意事项以及使用细节:
1)子类方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。
2)子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
3)子类方法不能缩小父类方法的访问权限:public>protected>默认>private
重写与重载的比较:
名称 | 发生范围 | 方法名 | 参数列表 | 返回值类型 | 修饰符 |
重载(overload) | 本类 | 必须一样 | 必须不一样(类型,个数或者顺序其中一种) | 无要求 | 无要求 |
重写(override) | 父子类 | 必须一样 | 必须一样 | 子类重写的方法返回的类型和父类返回的类型一致或者是其子类 | 子类方法不能缩小父类方法的访问范围 |