继承


继承

1.理解继承(几句很棒的话)

  • 继承是在保留原有类的数据成员和成员函数的基础上,派生出新类,新的类可以有某种程度的变异;
  • 通过继承,新类自动具有了原有类的成员属性和成员方法,因而只需定义原有类型没有的成员属性和成员方法。通过继承和派生形成的类族,反映了面向对象问题域、主题等概念
  • 子类拥有父类的所有属性和方法,只不过父类的私有属性和方法,子类是无法直接访问到的

2.子类构造器

  • 子类的构造方法(无论是否有参),若无显性调用,则会默认调用父类的无参构造方法;否则一般要对父类进行显性调用
    • 子类在创建对象时,利用父类的构造方法完成继承部分的创建,利用另写的构造方法完成拓展部分的创建
    • 注意this和supeer关键字的使用:其用作构造方法时需要放在第一句
  • 父类的构造方法不能被子类直接继承

3.继承中的权限问题(此处不讨论public)

Private

  • 若父类中有private修饰的属性和方法,则这些私有属性和方法是可以继承到子类中的,但子类无法访问这些属性和方法(supper调用也不行)

    子类的构造方法中涉及到父类构造方法的调用,而在父类的构造方法中可以访问上述的私有属性和方法,这也经常会给我们造成访问的错觉
    这里关于”继承”有个很有趣的辨析:在Java的官方文档中是这样描述private的:”子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的”。我觉得这样的描述模糊了”继承”这个词的含义。
    事实上,在我们创建一个子类的对象时,它会首先调用父类的构造方法来为所有父类中的属性和方法划分内存(无论它们是private的,还是被重写、覆盖的巴拉巴拉),即先创建了一个完整的父类对象,然后再在这个基础上添加子类独特的属性和方法。
    通过观察上述的过程,你会发现:欸嘿!我的子类对象中有那么几个成员,虽然访问不了,但它们的确实实在在存在呀!这个就是官方所说的”无法继承”的成员

  • 对于私有成员,真的只能远观而不可亵玩焉吗?非也非也!我们可以在父类中设置对应的public的Setter和Getter来访问这些不可”访问”的成员

    Default

  • 父类中默认的成员可以被同一个包中的子类中的实例对象直接访问,但不同包中是不行的

    Protected

  • 若位于不同包中,子类的实例对象可以访问protected成员,但是父类的实例对象不行

    这里访问的protected成员只能是改子类自己继承的,其他比如:父类实例对象的protected成员和其他子类的共同protected成员都是不能访问的
    若这个protected成员是静态的,则没有上述”亲自继承”的限制

  • 若父子类位于同一个包中,则与default一致

4.向上转型(重写与覆盖)

  • 所有属性,私有、静态的方法,若出现同名情况(名称、参数、返回值类型完全相同),都为隐藏型,即调用引用类型的成员
  • 其他方法,若出现同名情况,都为覆盖型,即调用实例对象的成员
  • 向上转型的意义:可以简化代码

    对于不同子类中类似的方法(即都是从父类中同一个方法覆盖而来)的分别使用,若使用向上转型:写一个函数,形参类型为父类类型(将输入的子类向上转型),函数体执行那个”被覆盖”的方法即可。
    因为方法为覆盖型,所以在函数体里调用的还是实例对象的方法,做到了函数体的复用,简化了代码


文章作者: yangyang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yangyang !
  目录