我想在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中使用什么?
提前致谢!
答案 0 :(得分:1)
您肯定需要使用super
来调用超类构造函数 - 但您想要使用的参数取决于您。我们不知道这些课程的目的是什么。
就Java而言,子类构造函数具有超类类型参数的事实基本上是无关紧要的 - 这只是巧合。您需要遵循Java的所有常规规则,在这种情况下,这意味着链接到超类构造函数。由于您在超类中没有无参数构造函数,因此必须明确地执行此操作,为x
和y
提供值。
答案 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
}
}