我是java的新手,我的代码有问题。我试图从子类的构造函数中调用超类的构造函数。虽然我可以通过 super 来实现,但我正在尝试做使用其他方法,在子类的构造函数中创建一个将调用Class A constructor
的超类对象。
class A
{
private int x;
A()
{
System.out.println("INISDE A");
}
A(int h)
{
System.out.println("a");
x = h;
}
}
class B extends A
{
int g, add;
B(int j, int h)
{
A a = new A(h);
g = j;
add = g + h;
}
void add()
{
System.out.println("SUM" + add);
}
}
public class Ja
{
public static void main(String[] args) {
// TODO code application logic here
B v = new B(1, 2);
v.add();
}
}
问题是我得到输出
INISDE A
a
SUM3
而不是
a
SUM3
这意味着它也在使用A()
。但为什么?我给它提供了参数
答案 0 :(得分:5)
此:
B(int j,int h) {
A a=new A (h);
g=j;
add=g+h;
}
通过A()
和实例化超类,然后创建一个新的A
实例(使用单参数构造函数)与底层B
分开。我怀疑你真的想要:
B(int j,int h) {
super(h);
g=j;
add=g+h;
}
正确实例化你的超类。
答案 1 :(得分:3)
要调用超类构造函数,您应该使用super(...)。 所以你的B类构造函数必须看起来像这样
B(int j,int h) {
super(h);
g=j;
add=g+h;
}
答案 2 :(得分:1)
如果我正确读取您的代码,那是因为您没有指定要在B构造函数中使用哪个A构造函数。因此,默认情况下,您的B构造函数将调用您的无参数构造函数。这就像对super()的调用暗示为B构造函数中的第一行。
我不知道你在B构造函数中用A的实例做了什么,但你可能想要super(h)。
答案 3 :(得分:0)
正如其他上面提到的,我们需要做的是使用super(h)而不是创建一个新变量。但是,我要补充一点,你真的不应该只使用这样的简单字母来命名变量。尝试并使用建设性的名称,为读者提供有关正在发生的事情的信息。它还可以更容易地跟踪代码中的内容。对于初学者来说很常见,但是当你有A级和变量a时,它会让人感到困惑。尝试使用简单的名称,如TestClass,以及像firstField这样的字段,如果你不能想到任何其他名称。