.Net转Java自学之路—基础巩固篇六(继承)
Java中只支持单继承,不支持多继承(确切的说,是Java改良了多继承,避免了安全隐患的产生) Java可以存在多层(多重)继承。例:A,B extends A,C extends B
最父类(A)定义的功能是该体系中最共性的功能。要了解该体系的功能,只要参考最父类的功能即可。
多重继承原则:
1、最父类定义的时该体系中最共性的功能。
2、要使用该体系功能,建议建立最子类对象调用来完成。
好处:
1、提高代码的复用性。
2、继承的出现让类与类之间产生了关系,该关系的出现是面向对象第三个特征“多态”的产生;继承是多态的前提。
3、有利于程序的扩展。
什么时候定义继承?
继承是用于程序设计;只要一个事物是另一个事物的一种,就可以用继承体现。
继承的子父类成员特点:
成员变量、成员函数、构造函数
成员变量:
在子父类中出现同名的成员变量时,用this调用子类的成员变量,用super调用父类的成员变量。
成员函数:
当子父类中出现相同的函数时,在子类对象调用该函数时,父类的该函数貌似被覆盖。这就是函数的一个特性(覆盖、重写、override)。【函数还有另一个特性(重载、overload)】
覆盖/重写(override):在子父类中出现相同的函数时,就发生了覆盖操作。
什么时候使用覆盖?
重新对函数进行描述,并定义新功能时。
构造函数:
子父类中构造函数特点:
父类的构造函数优先运行于子类中的构造函数。因在子类构造函数的第一行其实隐藏了一个默认的隐式语句 super()
子类中都有一个默认的super()语句,是因在子类进行实例化时,需要先进行父类对其成员的初始化操作。
子类中所有构造函数默认都会访问父类的空参数的构造函数。当父类没有空参数的构造函数时,子类必须通过super()或this()语句来明确指向子类或父类的构造函数。
简单来说,子类的构造函数必须访问父类的构造函数,而父类的构造函数的初始化动作必须要优先完成,所以super()语句必须放在第一行。
当子类的构造函数中存在this()语句,那么该构造函数内就没有了super()语句。so、在一个构造函数中this()与super()语句只能存在一个。但子类的构造函数中至少有一个构造函数存在super()语句来调用附列的构造函数,以完成父类的初始化。
super 关键字
this 与 super 的区别:
1、this 调用的时本类的对象,super 调用的父类的存储空间。
2、this 可以区分成员变量与局部变量重名的情况。super 可以区分子父类中成员变量重名的情况。
this() 与 super() 语句的区别:
1、this()语句调用的是本类的构造函数;super()语句是调用的父类的构造函数。
final 关键字
继承的弊端:打破封装性。
如果恶意继承并进行不正确的覆盖,会导致原功能错误,打破封装性。那么可以用 final 关键字来完成不让其它类继承,来解决这个问题。
特点:
1、final 关键字可以修饰类、方法、变量。
2、final 关键字修饰的类时最终类,不可被继承。
3、final 关键字修饰的函数不可被覆盖。
4、final 关键字修饰的变量时一个常量,只能赋值一次。这个赋值是显示初始化赋值。
final 关键字修饰的常量一般都有规范书写,被 final 修饰的常量名称所有字母都要大写;如果有多个单词,则在每个单词中间加“_”分割。
抽象类 abstanct
多个类中都有共性的功能,但只有函数名相同,函数的具体功能不同。这时,用 sbstanct 关键字对相同的函数声明进行提取,不提取函数内容。那么当类中方法出现抽象方法时,该类也必须是抽象类。
抽象类可以定义事物的共性内容,而且定义抽象类,可以强迫子类来实现。
特点:
1、抽象类、方法必须用 abstanct 关键字修饰。
2、抽象方法必须放在抽象类中。
3、抽象方法不可被实例化。也就是不可创建该类的对象。
4、只有抽象类的子类将所有的抽象方法覆盖,则该子类才可以创建对象。否则该子类还是一个抽象类。
细节:
1、抽象类也有构造函数。
2、抽象类中可以不定义抽象方法。目的是为了不让该来创建对象。
3、抽象类不能与 final、static、private 关键字共存。因为所有的抽象方法都需要被覆盖。而 final 不可以;private 私有的,子类无法直接访问;static 不需要对象,类名可以直接调用方法,而直接调用抽象函数没有意义。
子父类覆盖细节:
1、子类覆盖父类的函数时,子类函数必须要保证权限大于等于父类。
2、子类无法覆盖父类的私有成员。