java在子类中创建构造函数,超类作为参数

时间:2012-02-05 07:36:20

标签: java constructor arguments subclass superclass

我想在Java中做这样的事情:

超类:

public class mysupclass {

    public mysupclass(int x, int y) {
       // code here
    }
}

子类:

public class mysubclass extends mysupclass {

    public mysubclass (mysupclass a, mysupclass b) {
        // code here
    }
}

如何将mysupclass定义为我的子类构造函数的参数? 我是否必须在子类构造函数中使用super,我应该在super中使用什么?

提前致谢!

7 个答案:

答案 0 :(得分:1)

您肯定需要使用super来调用超类构造函数 - 但您想要使用的参数取决于您。我们不知道这些课程的目的是什么。

就Java而言,子类构造函数具有超类类型参数的事实基本上是无关紧要的 - 这只是巧合。您需要遵循Java的所有常规规则,在这种情况下,这意味着链接到超类构造函数。由于您在超类中没有无参数构造函数,因此必须明确地执行此操作,为xy提供值。

答案 1 :(得分:0)

作为一个很好的一般规则,超类应从不了解子类。

考虑重新设计类层次结构,或者使用抽象,例如实现接口的子类和在该接口实例中期望的超类。

答案 2 :(得分:0)

嗯,我认为你会考虑编辑你的问题并提供mysupclass在上下文中代表的更多细节。其他人已经解释过你试图将mysupclass作为参数传递给mysupclass构造器实际上是期望int值作为参数。显然,如果你没有将int value传递给mysupclass的构造函数,则该类不能被实例化为提供参数化构造函数的类,并且它不会调用默认构造函数。请详细说明您的要求是什么?我的意思是通过传递那些mysupclass作为参数你想做什么?因为它更容易设置你想要使用super.variable=value;传递给构造函数的变量而不是直接传递mysupclass作为参数。

答案 3 :(得分:0)

参考资料: how to inherit Constructor from super class to sub class

以下解决方案:

超类:

PropertyMap<PersonWrapper, PersonDTO> orderMap = new PropertyMap<Order, OrderDTO>() {
  protected void configure() {
    map().setName(source.getPerson().getName());
    ....
  }
};

子类:

public class mysupclass {

    public mysupclass(int x, int y) {
       // code here
    }
}

答案 4 :(得分:0)

以下是您如何做到这一点的示例:

超类(Point2D.java):

package test_superArg;

public class Point2D {
    private float x;
    private float y;

    public Point2D(float x, float y) {
        this.x = x;
        this.y = y;
        System.out.println("Parent class constructor:");
        System.out.println("X = " + this.x + ", Y = " + this.y);
    }
    public float getX() {return x;}
    public float getY() {return y;}
    public void setX(float x) {this.x = x;}
    public void setY(float y) {this.y = y;}
}

子类(Point3D.java):

package test_superArg;

public class Point3D extends Point2D {
    private float z;

    public Point3D(Point2D point2d, float z) {
        super(point2d.getX(), point2d.getY());  // must be the 1st statement in a constructor
        System.out.println("After calling super()");
        this.z = z;
        System.out.println("Child class constructor:");
        System.out.println("X = " + getX() + ", Y = " + getY() + ", Z = " + this.z);
    }
    public float getZ() {return z;}
}

主类(Start.java):

package test_superArg;

public class Start {

    public static void main(String[] args) {
        System.out.println("Creating parent type class object...");
        Point2D point2d = new Point2D(2.0f, 4.0f);
        System.out.println("Creating child type class object...");
        Point3D point3d = new Point3D(point2d, 8.0f);
        System.out.println("Changing child class type object...");
        point3d.setX(10.0f);
        point3d.setY(20.0f);
        System.out.println("Parent type class object:");
        System.out.println("X = " + point2d.getX() + ", Y = " + point2d.getY());
        System.out.println("Child type class object:");
        System.out.print("X = " + point3d.getX() + ", Y = " + point3d.getY());
        System.out.println(", Z = " + point3d.getZ());
    }
}

输出:

Creating parent type class object...
Parent class constructor:
X = 2.0, Y = 4.0
Creating child type class object...
Parent class constructor:
X = 2.0, Y = 4.0
After calling super()
Child class constructor:
X = 2.0, Y = 4.0, Z = 8.0
Changing child class type object...
Parent type class object:
X = 2.0, Y = 4.0
Child type class object:
X = 10.0, Y = 20.0, Z = 8.0

答案 5 :(得分:0)

正如Jon Skeet已经指出的那样,你必须在子类构造函数中使用super(只要没有定义默认构造函数,Java编译器就会强制你执行它)。作为超级参数传递的内容取决于您自己决定。

我假设你的mysupclass是一个点,而mysubclass是一个矩形。作为默认行为,您可以使用第一个点作为初始化mysupclass的那个。

public class mysubclass extends mysupclass {
    public mysubclass (mysupclass a, mysupclass b) {
        super(a.getX(), a.getY());
        this.x2 = b.getX();
        this.y2 = b.getY();
        // anything else...
    }
}

答案 6 :(得分:-1)

您可能希望添加默认构造函数,因为一般编码实践说如果您正在重载默认构造函数,那么您应该自己添加它。 在继续之前,您可能想要对java构造函数进行一些研究。

supclass:

public class mysupclass {

    public mysupclass(int x, int y) {
       // code here
       // Overloaded constructor.
    }
}

子类:

public class mysubclass extends mysupclass {

    public mysubclass () {
        super(mysupclass a, mysupclass b);
        // code here
    }
}