将超类对象作为参数传递给子类构造函数(java)

时间:2016-01-15 18:29:56

标签: java inheritance

我已经做了一些搜索,但我要么没有问正确的问题,要么没有正确记住。在任何情况下,在Java中,我想知道是否可以将超类对象作为参数传递给子类,以及将该对象的数据提供给类的最有效方法是什么?超级。

代码示例:

public class superclass {
  String myparm1;
  String myParm2;
  int myParmN;

  public superclass(String p1, String p2, int pn)
  {
    this.myparm1 = p1;
    this.myparm2 = p2;
    this.myParmN = pn;
  }
  // other methods here
}

public class subclass extends superclass {
  double b1;
  double b2;

  public subclass(superclass sc, double b1, double b2) {
    // easy way to make sc data available to this class?
    // Do I create a copy or clone method, or some other way?
    // calling super(sc); wouldn't exactly work 
    this.b1 = b1;
    this.b2 = b2;
  }
}

如果我的超类中有public superclass(superclass sc) { // assign sc properties to this properties, correct? }的构造函数,那么我可以简单地使用super(sc);

3 个答案:

答案 0 :(得分:5)

在构造函数中传递对象的超类的引用是没有意义的。您的子类已经是超类的实例。

即使您无法直接查看超类的私有组件,但它们仍然存在,并且对公共访问器方法的调用仍将产生正常行为。

在回答第二个问题时,访问父类内部数据的最有效方法是使用该父类的访问器方法。如果它有get / set属性方法来填充一些充满属性的数据结构,那么只需从子类中调用这些方法,它们的工作方式与它们对父类完全相同。现在,如果这些内部数据结构由父类的构造函数填充,则在创建需要它们的子构造函数的实例时,您必须使用正确的方法调用该构造函数 - 通常通过调用相应的super()在孩子的构造函数的开头。

如果你试图绕过限制,你无法看到超类的私有部分,java故意不允许你这样做。你可以通过反射解决这个问题,除非你被困在一个不允许这样做的执行环境中,但我通常不会认为这是一种安全或优雅的方法。

从下面的评论中,我了解OP正在尝试做什么,这应该有效,但显然这取决于你对超类进行更改的能力:

public class Super
{
    public Super (Super other)
    {
        //copy stuff from other to this
    }
}

public class Child extends Super
{
    public Child (Super other)
    {
        super(other);
        //continue constructor
    }

}

答案 1 :(得分:2)

你做不到。当您使用Java构建对象时(例如使用new),该实例具有一个类,并且该类具有父(可能是Object)。

父子关系只存在于类之间,而不是在对象之间!没有对象具有父对象(至少,不在语言级别) - 因此您无法接受构造函数中的父对象并将其存储在Java定义的某个位置。

但是,您的域可以有父实体和子实体,在这种情况下,您需要字段或数据结构来存储它们之间的链接。

答案 2 :(得分:0)

要回答上一个问题,假设超类具有大量属性。在这种情况下,课程的设计当然可能不好。

也许最好的答案是:

public class superclass {
  // properties and constructors as defined in OP

  public void copy(superclass sc) {
    this.myParm1 = sc.getMyParm1();
    this.myParm2 = sc.getMyParm2();
    this.myParmN = sc.getMyParmN();
  }

  // other methods as needed
}

这样,子类就可以调用super.copy(sc)。当然,我需要在超类中设置默认值的另一个构造函数:public superclass() { // set defaults }

所以子类可以是:

public class subclass extends superclass {
  //properties as defined in OP

  public subclass(superclass sc, double b1, double b2) {
    this.b1 = b1;
    this.b2 = b2;
    super.copy(sc);
  }
}

通过这种方式,我只需要输出那些参数,并且任何想要接受超类对象的子类都不必每次都定义该结构。 (减少打字,减少错误或遗忘的机会。)