java - 复合继承: how to assign a final field at sub-class constructor which depends on 'this' value (backward reference)?

标签 java inheritance variable-assignment final composite

我使用复合类来对功能进行分组。
但是,类 A(具有复合 A1)被 B(具有复合 B1)继承,并且 A1 中存在的行为将在 B1 中进行调整,但最终的 a1 必须是 B1 实例才能工作。

观察:我有ways确保复合实例化正确发生(仅由其复合伙伴)。

无法将 B1 对象分配给 a1 最终字段:

class finalFieldTestFails{
    class A1{
      A1(A a){}
    }

    class A{
      protected final A1 a1;
      A(){
        this.a1 = new A1(this);
      }

      A(A1 a1){
        this.a1 = a1;
      }
    }

    class B1 extends A1{
      B1(B b){
        super(b);
      }
    }

    class B extends A{
        //B(){ super.a1=new B1(this); } //FAIL: cant change final value
        //B(){super(new B1(this));} //FAIL: cant use 'this' or 'super'
    }
}

PS:如果可能的话,答案不应涉及反射安全技巧。

最佳答案

B(){ super.a1=new B1(this); } //FAIL: cant change final value

您不能为已分配的最终变量赋值,您可以在构造函数中实例化它,但不能如下所示。

B(){super(new B1(this));} //FAIL: cant use 'this' or 'super'

仅在创建实例后才能使用它。由于有继承树,它没有完全实例化,所以编译器会提示,

在调用父类(super class)型构造函数之前无法引用 this

关于java - 复合继承: how to assign a final field at sub-class constructor which depends on 'this' value (backward reference)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34822434/

相关文章:

c# - Newtonsoft 在基类的序列化中包含子属性?

c++ - 声明继承的模板化对象并将它们推回 vector - 优雅的方式?

c++ - <?= operator C++ greater less 问号等于号

java - SQL 序列 : Hibernate and Liquibase

java - 将数据从 infile 存储到二维数组中

class - 静态内部类是个好主意还是糟糕的设计?

我们可以在 if 语句中赋值吗?

java - 使用 JSoup 帮助抓取 HTML

java - 无法解析的构建扩展 : or one of its dependencies could not be resolved: Failed to read artifact descriptor

VB.NET:运算符 '=' 未定义...用于相同类型的变量和对象?