【问题标题】:Java inheritance: is the parent class instantiantiated every time a child class extends it?Java继承:每次子类扩展父类时都会实例化它吗?
【发布时间】:2017-05-05 13:28:42
【问题描述】:

我想为我项目中的所有片段提供基本功能。

父片段 (FragmentP) 本身扩展了 android Fragment 类。在这里,我将为所有将扩展它的片段提供一个通用功能。

现在我的问题是:

  1. FragmentP 的片段生命周期与其所有子级有何不同?
  2. FragmentP 何时创建和销毁?当它的任何孩子被创建(实例化)时,它是否被重新创建(重新实例化)?

【问题讨论】:

  • 我建议您在开始 Android 开发之前阅读一些有关 POO 基础知识的文档。 :)

标签: java android android-fragments inheritance


【解决方案1】:

当你扩展一个类时,你唯一要做的就是专门化父类的功能。

现在,如果您在子构造函数中调用super();,它不会实例化父对象。相反,它在运行子类构造函数中的代码之前运行父构造函数。 这通常在您的子类需要在实例化时执行相同的行为时使用。

编辑:

假设您有一个超级班级Vehicle 和两个孩子CarQuad。 这两款车都有4个轮子。因此,您的超级构造函数可以将 wheel 字段初始化为 4 的值。

但是两个孩子都有不同: 例如,Car 有窗口,而Quad 没有。 所以你的Car 构造函数应该初始化一个窗口字段,而你的Quad 构造函数不应该。

【讨论】:

    【解决方案2】:

    不,它与实例化无关。继承的概念是您扩展预先存在的类的功能,在这种情况下,它是带有扩展方法、字段等的FragmentP

    它仍然是一个Fragment,具有来自 android 的通常生命周期。

    【讨论】:

      【解决方案3】:

      1) 实例化类时,不会实例化父类,但必须调用父类的构造函数:

      public childClass(){
         super();
      }
      

      但只有一个实例存在,即 childClass,内存中不会出现 parentClass 的实例。所以任何类的生命周期都是一样的,继承是一个静态过程,而不是动态过程。这意味着它发生在编译期间,而不是在执行期间。

      2) FragmentP 仅在您明确决定实例化时才会实例化,具体取决于您选择的实例化策略(工厂、构造函数、构建器等)。当没有对实例的剩余活动引用时,它会被销毁(实际上由垃圾收集器收集)。

      【讨论】:

        猜你喜欢
        • 2018-12-09
        • 1970-01-01
        • 2014-09-22
        • 2021-02-19
        • 2020-04-06
        • 2013-12-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        相关资源
        最近更新 更多