当前位置: 首页 > 知识库问答 >
问题:

如何使用超类的实例构造子类?

易修洁
2023-03-14

假设我有以下代码

public class SuperClass {
    protected int super_class_value;

    public SuperClass (int value) {
        this.super_class_value = value;
    }
}

public class Subclass extends SuperClass {
    protected int subclass_value;

    public SubClass(int super_class_value, int subclass_value) {
        super(super_class_value);
        this.subclass_value = subclass_value;
    }
}

然而,现在我希望能够将一个超类对象传递给子类构造函数。我该怎么做?

public SubClass(SuperClass super_class, int subclass_value) {
    //What do I do here?
    this.subclass_value = subclass_value;
}

基本上,我想这样做。。。

public SubClass(SuperClass super_calss, int subclass_value) {
    super(super_class.super_class_value);
    this.subclass_value = subclass_value;
}

但是如果超类更复杂,我不想在super()调用中添加每个值。相反,我只想传入一个已经存在的对象,并将其用作超类。

我想这么做。。。

public SubClass(SuperClass super_class, int subclass_value) {
    super(super_class);
    this.subclass_value = subclass_value;
}

但我不确定这是否被允许?

如果我在超类定义中添加一个构造函数,似乎我可以完成上面的工作。但那会是什么样子呢?

public class SuperClass {
    protected int super_class_value;

    public SuperClass (int value) {
        this.super_class_value = value;
    }

    public SuperClass (SuperClass super_class_object) {
        //What is done here?
    }
}

共有3个答案

宗政法
2023-03-14

查看Decorator模式,了解一个著名的例子。该页面还提供了一个很好的java示例和UML图。

魏岳
2023-03-14

然而,现在我希望能够将一个超类对象传递给子类构造函数。我该怎么做?

你也在做同样的事

public SubClass(SuperClass super_class, int subclass_value) {
    //What do I do here?
    // Do Whatever you want to do here ,
    this.subclass_value = subclas_value;
}

现在我想你可能正在考虑如何将对象从子类传递到超类,然后可以通过Java中的super关键字来实现

    用于调用直接父类构造函数。

现在要将对象传递给超类,在子类的构造函数中,第一行必须是

super(super_class);

现在,在你的超类中,你必须有一个构造函数,它本身就是一个对象,否则上面这一行就会抛出编译时错误

public SuperClass (SuperClass object) {
         // Do whatever you want to do .
          this.anyInstanceVariable=object.thatInstanceVariable;
    }

附言:我仍然不明白你想用这个实现什么,但不管你提到什么,这都是你实现它的方式

最新消息

正如你在评论中所说,你不想复制每个变量,那么你可以使用对象类的克隆方法

下面是一个例子,你将如何在你的情况下实现它

class SuperClass implements Cloneable{ // otherwise clone() method will throw CloneNotSupportedException

    int a;
    SuperClass obj=null; // this will point to the copy of the cloned object

    SuperClass(int a){// just to test that cloning is successfull
        this.a=a;
    }
    SuperClass(SuperClass a){
        try{
        this.obj=(SuperClass)a.clone();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        display();
    }
    public void display(){// to Verify that Cloning has been done successfully
        try{
        System.out.println("Hello from cloned Object "+obj.a);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    @Override
    protected Object clone() throws CloneNotSupportedException  { // Overridden Method
        return super.clone();
    }
}

看看这篇关于java中对象克隆的好文章

长孙嘉容
2023-03-14

你不想为你的超类创建一个复制构造函数吗?

public class SuperClass {
    protected int super_class_value;

    public SuperClass (int value) {
        this.super_class_value = value;
    }
    protected SuperClass (SuperClass super_class) {
        this.super_class_value = super_class.supper_class_value;
    }
}

public class Subclass extends SuperClass {
    protected int subclass_value;

    public SubClass(SuperClass super_class, int subclass_value) {
        super(super_class);
        this.subclass_value = subclass_value;
    }
}

另请参见此处关于编写副本的问题:

Java是否有默认的复制构造函数(比如C)?

 类似资料:
  • 问题内容: 我正在创建一个类及其子类,需要在其中调用父级的静态方法以返回子级实例。 问题答案: 该静态方法被调用,其值是类对象,子类,你把它称为后的构造。因此,您可以使用实例化它:

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 我是Java的初学者。这是我的代码 有没有可能,如果有,请告诉我怎么做?我对这个问题的标题有一些问题,所以请建议我一个合适的,因为我已经解释了我在代码中想要的一切。

  • 为什么第一个输出有柱线 = 空?是因为在创建类 B 之前调用了 B.foo() 吗?如果是,那么为什么可以调用 B.foo()?还是因为 B.foo() 中的字段栏试图从 A 获取柱线字段但无法访问它? 我的问题与链接的问题不同,我不是在问调用顺序,我是在问为什么第一个输出为空?另一个问题不是关于字段或空变量。 我不明白B.foo中的bar变量是如何为空的,如果它是在A和B中定义的。

  • 问题内容: 我所拥有的是一组表示消息类型的Java类(接近25个)。它们都继承自我想抽象的Message类。每种消息类型都会在Message超类提供的集合中添加一些其他字段。 我正在使用RESTeasy实现一些RESTful Web服务,并希望具有以下方法: 而不是使用25种单独的persist方法,每种方法都针对特定的消息类型进行了量身定制。 目前,我已经为Message类添加了如下注释: 然后

  • 说我有以下课程 和 当我调用超级构造函数时,如何保证子构造函数调用“正确”的构造函数?更具体地说,我希望100%确保我传入的三个字符串值确实设置为父级中的正确字段,而不是设置为item1 in的字段。 我知道我可以,例如: 显式创建我自己的所有参数构造函数 在子构造函数中,调用父构造函数的所有setter 但是我只是好奇Lombok是否足够聪明,以某种方式,将子类中的字段设置为父类中正确的字段?