我已经做了一些搜索,但我要么没有问正确的问题,要么没有正确记住。在任何情况下,在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);
答案 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);
}
}
通过这种方式,我只需要输出那些参数,并且任何想要接受超类对象的子类都不必每次都定义该结构。 (减少打字,减少错误或遗忘的机会。)