[英]Java: extending an object to another
例如我有这个:
class A{
private int mine = 0; //Some field...
public A(int a){mine+=a; /*Some operation1...*/}
}
class B extends A{
private int mine = 0; //Some field...
public B(int a){mine-=a; /*Some operation2...*/}
}
我得到:
error: constructor A in class A cannot be applied to given types;
public B(int a){}
required: int
found: no arguments
reason: actual and formal argument lists differ in length
1 errors
我不明白这个错误? 什么告诉我做什么?
但是,如果“A”的构造函数没有参数,则代码可以工作。
但我需要做Operation1(又名mine+=a;
),所以我需要A的参数,但后来我失败了。
我在这个神奇的圈子里关闭了。 我该怎么办?
每个构造函数的第一条指令总是调用它的一个超类构造函数。 如果您没有明确地执行此操作,编译器会为您插入此实例。 构造函数
public B(int a) {
mine-=a;
/*Some operation2...*/
}
因此相当于
public B(int a) {
super(); // invoke the no-arg super constructor
mine-=a;
/*Some operation2...*/
}
由于A没有no-arg构造函数,因此编译失败。 在这种情况下,您必须明确地调用其中一个超级构造函数:
public B(int a) {
super(a);
mine-=a;
/*Some operation2...*/
}
每个构造函数都必须调用超类构造函数作为它的第一件事。 如果你没有通过super()
显式地执行它,编译器将隐式调用超类中的no-arts构造函数。 但在你的情况下,超类没有no-args构造函数,此时编译器放弃了。
顺便说一下,在子类中重新声明一个字段通常是一个非常糟糕的主意,因为它会隐藏超类字段,但仍然会有两个字段。
我认为你需要从B构造函数中调用类A的构造函数,如下所示: super(a);
如果B扩展A,则B的构造函数的第一个操作是,调用A的构造函数。
如果A中没有显式定义构造函数,则调用标准构造函数。 如果不明确调用ctor,则会隐式调用它。
但是如果有一个明确的ctor,它接受参数,它就不会被自动调用 - 它应该如何 - 使用哪些参数? 你必须自己打电话。
但你的班级hierarchie有点神秘。 如果要在子类中访问我的,请将其保护或保持默认状态 - 不要将其设为私有。
如果将其设为私有,则具有相同名称的新引入属性会隐藏父属性,但这是错误的并且令人恼火。
在大多数情况下,可能通过方法(getter / setter)访问会更好,或者打开可见性。
或者子类中的东西的不同名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.