• java学习笔记 --- 继承


    继承

       (1)定义:把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
             这多个类就具备了这些内容。这个关系叫继承。
        (2)Java中如何表示继承呢?格式是什么呢?
          A:用关键字extends表示
          B:格式:
            class 子类名 extends 父类名 {}

          

    class 父类 {
    }
     
    class 子类 extends 父类 {
    }


       (3)继承的好处:
          A:提高了代码的复用性
          B:提高了代码的维护性
          C:让类与类产生了一个关系,是多态的前提
       (4)继承的弊端:
          A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
             原则:低耦合,高内聚。
             耦合:类与类的关系
             内聚:自己完成某件事情的能力
          B:打破了封装性
       (5)Java中继承的特点
          A:Java中类只支持单继承,不支持多继承,为什么呢?    

          (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量

          (2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法


          B:Java中可以多层(重)继承(继承体系)

      (6)什么时候使用继承呢?
          A:继承体现的是:is a的关系。
          B:采用假设法

      (7)重写

        子类中出现与父类一模一样(返回值类型,方法名,参数都相同)的方法时,会出现覆盖操作,也称为override重写、复写或者覆盖。

        好处:子类可以根据需要,定义特定于自己的行为。

        注意事项:

             1、子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

             2、静态只能覆盖静态,或者被静态覆盖。

             3、写法上稍微注意:必须一模一样:函数的返回值类型 函数名 参数列表都要一样。

      (8)super关键字

        当子类重写了父类中的成员变量时,在子类中若要访问父类中的成员变量,必须使用关键字super来完成。

        注意:super和this的用法相似,this:代表本类的对象引用。super:代表的父类内存空间,而不是父类的引用。

      (9)final关键字

        final是个修饰符,它可以修饰类,类的成员,以及局部变量。

               final修饰类不可以被继承,但是可以继承其他类。 

        final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。

        final修饰的变量称为常量,这些变量只能赋值一次。

        final修饰的引用类型变量,表示该引用变量的引用不能变,而不是引用所指的对象中的数据还是可以变化的;

        
       (10)继承的注意事项:
          A:子类不能继承父类的私有成员
          B:子类不能继承父类的构造方法,但是可以通过super去访问
          C:不要为了部分功能而去继承
       
      (11)Java继承中的成员关系
          A:成员变量
             a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
             b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
                子类的方法访问变量的查找顺序:
                   在子类方法的局部范围找,有就使用。
                   在子类的成员范围找,有就使用。
                   在父类的成员范围找,有就使用。
                   找不到,就报错。
          B:构造方法
             a:子类的构造方法默认会去访问父类的无参构造方法
               是为了子类访问父类数据的初始化
             b:父类中如果没有无参构造方法,怎么办?
                子类通过super去明确调用带参构造
                子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
                让父类提供无参构造
          C:成员方法
             a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
             b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
                通过子类对象访问一个方法的查找顺序:
                   在子类中找,有就使用
                   在父类中找,有就使用
                   找不到,就报错

    其他说明:

      1、在创建子类对象时,父类的构造函数会先执行,因为子类中所有构造函数的第一行有默认的隐式super();语句,调用本类中的构造函数用this(实参列表)语句,调用父类中的构造函数用super(实参列表)。

      2、为什么子类对象初始化都要访问父类中的构造函数?因为子类继承了父类的内容,所以创建对象时必须要先看父类是如何对内容进行初始化的。

      3、子类中的构造函数为什么有一句隐式的super()呢?

        原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。才可以更方便的使用父类中的内容。

           当父类中没有空参数构造函数时,子类的构造函数必须有显示的super语句指定要访问的父类中的构造函数。

      4、如果子类的构造函数第一行写了this调用了本类其他构造函数,那么super调用父类的语句还有吗?

        这时是没有的,因为this()或者super(),只能定义在构造函数的第一行,因为初始化动作要先执行。

      5、父类构造函数中是否有隐式的super呢?

         也是有的。记住:只要是构造函数默认第一行都是super();

      6、父类的父类是谁呢?super调用的到底是谁的构造函数呢?

        Java体系在设计,定义了一个所有对象的父类Object ,

    注意:

        类中的构造函数默认第一行都有隐式的super()语句,在访问父类中的构造函数。

        所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。

        如果默认的隐式super语句没有对应的构造函数,必须在构造函数中通过this或者super的形式明确调用的构造函数。

  • 相关阅读:
    IDEA常用快捷指令整理
    Python dict 字典
    内联函数
    【MFC】编辑框 CEdit Ctrl控件自动换行设置
    mysql 多sql文件恢复方案
    Linux: 用64位的系统,能编译32位的程序吗?
    C++ 遍历数组
    工业现场传感器传感器为什么采用电流形式输出?
    【转】电磁阀、电磁铁的工作原理说明
    PCB板强弱电隔离距离不够导致损坏和问题检查记录
  • 原文地址:https://www.cnblogs.com/flei/p/6604739.html
Copyright © 2020-2023  润新知