从子类调用构造函数

时间:2014-01-30 17:39:04

标签: java

我是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()。但为什么?我给它提供了参数

4 个答案:

答案 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这样的字段,如果你不能想到任何其他名称。