JAVA如何将初始化信息传递给多个超类

JAVA如何将初始化信息传递给多个超类,java,Java,我还有一个关于建设者的问题。比如说,我有一个超过2层的层次结构 A. B扩展A, C延伸到B。 当我创建一个C实例时,我能让所有三层的构造函数都启动吗?如果我想通过上级的辩论,怎么办;这可能吗?似乎这就是它要去的地方,但我找不到一种方法来区分a和B的参数。默认构造函数和B似乎在运行,我无法为它提供运行不同构造函数所需的值,因为我不知道如何操作。可以让每个层调用super。。。设置每个层中的信息 public Class A { public A(Object a, Object b)

我还有一个关于建设者的问题。比如说,我有一个超过2层的层次结构

A. B扩展A, C延伸到B。
当我创建一个C实例时,我能让所有三层的构造函数都启动吗?如果我想通过上级的辩论,怎么办;这可能吗?似乎这就是它要去的地方,但我找不到一种方法来区分a和B的参数。默认构造函数和B似乎在运行,我无法为它提供运行不同构造函数所需的值,因为我不知道如何操作。

可以让每个层调用super。。。设置每个层中的信息

public Class A
{
    public A(Object a, Object b)
    {
        //do any initialization needed
    }
}

请记住,我认为不建议使用这些构造函数在每个级别将对象设置为变量。因此,您不希望A、B和C的构造函数都在构造函数中设置某个对象x=A。层次结构中最多只有一个级别应该维护对传递给构造函数的对象的引用。

您可以让每个层调用super。。。设置每个层中的信息

public Class A
{
    public A(Object a, Object b)
    {
        //do any initialization needed
    }
}

请记住,我认为不建议使用这些构造函数在每个级别将对象设置为变量。因此,您不希望A、B和C的构造函数都在构造函数中设置某个对象x=A。层次结构中最多只有一个级别应该维护对传递给构造函数的对象的引用。

在Java世界中,当您扩展另一个类时,您只能看到直接超类的构造函数。超类应该适当地封装超类构造函数

这意味着,在您的情况下,B应该提供一个正确封装a的构造函数。如果B无法确定要传递给a的构造函数的参数,则在B自己的构造函数中要求它是合理的:

class A {
  A (int aArg) {
    // init base on aArg
  }
}

class B extends A {
  B (int aArg, int bArg) {
    super(aArg);
    // extra initialization base on bArg and aArg
  }
}

class C extends B {
  C() {
    super(SOME_A_ARG, SOME_B_ARG);
  }
}

在Java世界中,当您扩展另一个类时,您只能看到直接超类的构造函数。超类应该适当地封装超类构造函数

这意味着,在您的情况下,B应该提供一个正确封装a的构造函数。如果B无法确定要传递给a的构造函数的参数,则在B自己的构造函数中要求它是合理的:

class A {
  A (int aArg) {
    // init base on aArg
  }
}

class B extends A {
  B (int aArg, int bArg) {
    super(aArg);
    // extra initialization base on bArg and aArg
  }
}

class C extends B {
  C() {
    super(SOME_A_ARG, SOME_B_ARG);
  }
}

根据Java规范,构造函数不是由子类继承的。 因此,根据您的需求,您应该记住,超类应该具有传递对象的范围

当您通过扩展另一个类B扩展a和C扩展B来声明一个类时,您应该定义构造函数 这样您就可以为初始化定制它。此声明始终取决于文档的深度和层次结构 继承权

class A{
    A(Object firstObj, Object secondObj){
        //Do you stuff for initialization
    }
}

class B extends A{
    //Keep in mind that this B class will be inherited by other class
    B(Object firstObj,Object secondObj,Object thirdObj){
        //Call super class constructor
        super(firstObj,secondObj);

        //Do other initialization stuff here
    }
}

class C extends B{
    //Keep in mind that this C class will be inherited by other class
    C(Object firstObj,Object secondObj,Object thirdObj){
        //Call super class constructor
        super(firstObj, secondObj, thirdObj); //call constructor of B

        //Do other initialization stuff here
    }
}
它始终取决于父类构造函数的定义方式。它取决于传递给父类构造函数的参数的数量,您需要从子类构造函数相应地调用


希望它能帮助您。

根据Java规范,构造函数不是由子类继承的。 因此,根据您的需求,您应该记住,超类应该具有传递对象的范围

当您通过扩展另一个类B扩展a和C扩展B来声明一个类时,您应该定义构造函数 这样您就可以为初始化定制它。此声明始终取决于文档的深度和层次结构 继承权

class A{
    A(Object firstObj, Object secondObj){
        //Do you stuff for initialization
    }
}

class B extends A{
    //Keep in mind that this B class will be inherited by other class
    B(Object firstObj,Object secondObj,Object thirdObj){
        //Call super class constructor
        super(firstObj,secondObj);

        //Do other initialization stuff here
    }
}

class C extends B{
    //Keep in mind that this C class will be inherited by other class
    C(Object firstObj,Object secondObj,Object thirdObj){
        //Call super class constructor
        super(firstObj, secondObj, thirdObj); //call constructor of B

        //Do other initialization stuff here
    }
}
它始终取决于父类构造函数的定义方式。它取决于传递给父类构造函数的参数的数量,您需要从子类构造函数相应地调用


希望能对您有所帮助。

太好了,谢谢大家。现在我明白了。我必须首先将任何用于A的初始化信息传递给B,然后让B将其传递给A。我认为情况正好相反。这更有意义。但是答案是不正确的:在C中,你不能调用A的构造函数。而且,编码风格不符合Java的惯例。太好了,谢谢大家。现在我明白了。我必须首先将任何用于A的初始化信息传递给B,然后让B将其传递给A。我认为情况正好相反。这更有意义,但答案并不正确:在C中,不能调用A的构造函数。而且,编码风格与Java的约定不一致