假设我有以下代码
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?
}
}
查看Decorator模式,了解一个著名的例子。该页面还提供了一个很好的java示例和UML图。
然而,现在我希望能够将一个超类对象传递给子类构造函数。我该怎么做?
你也在做同样的事
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中对象克隆的好文章
你不想为你的超类创建一个复制构造函数吗?
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是否足够聪明,以某种方式,将子类中的字段设置为父类中正确的字段?