.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、子类无法覆盖父类的私有成员。

猜你喜欢

转载自www.cnblogs.com/drop/p/9038947.html