如何在Java中调用带有参数的祖父项构造函数?

时间:2015-08-31 01:48:56

标签: java constructor super

也许很多人都会问这个问题,但我仍然不知道如何得到答案。

我有A,B,C类。

C延伸B,B延伸A。

C类中的主要方法。

如果我想用C类中的参数调用一个构造函数方法,

我该怎么办?

非常感谢你。

一个班级

 public class A {

    public A() {
        System.out.println("A construtor");
    }

    public A(int a, int b)
    {
        System.out.println("A.a:"+ a + "/B.b:"+b);
    }
 }

B class

 public class B extends A{
    public B() {
        System.out.println("B construtor");
    }

    public B(int a, int b) {
        System.out.println("B.a:" + a + "/B.b:" + b);
    }
 }

C class

 public class C extends B{

    public static void main(String[] str)
    {
        C c = new C();
    }

    public C() {
 //     super(1,2);
        // how to call A constructor with parameters 
        System.out.println("C constructor");

    }

 }

2 个答案:

答案 0 :(得分:1)

C类没有显式扩展A类,只有通过B类C才能扩展A,因此您只能通过B类构造函数访问A的构造函数。

通过在C类构造函数中使用super(1,2),您将调用Class B的构造函数,该构造函数具有两个int参数。您需要将B类的arg构造函数更改为以下内容:

public class B extends A{
public B() {
    System.out.println("B construtor");
}

public B(int a, int b) {
super(a,b);
    System.out.println("B.a:" + a + "/B.b:" + b);
}

}

请记住以下内容:

1)当没有为类提供构造函数时,java会创建一个默认的非arg构造函数。

2)如果A类扩展了B类,B类需要一个构造函数,并且必须首先调用超类。

答案 1 :(得分:0)

我认为你不能直接来自C.它需要通过在C的构造函数中调用适当的B构造函数来完成。如,

一个班级

 public class A {

    public A() {
        System.out.println("A construtor");
    }

    public A(int a, int b)
    {
        System.out.println("A.a:"+ a + "/B.b:"+b);
    }
 }

B class

 public class B extends A{
    public B() {
        System.out.println("B construtor");
    }

    public B(int a, int b) {
        System.out.println("B.a:" + a + "/B.b:" + b);
    }

    // ****** added ******
    public B(int a, int b, boolean ignore) {
        super(a, b);
    }
 }

C class

 public class C extends B{

    public static void main(String[] str)
    {
        C c = new C();
    }

    public C() {
        super(1, 2, true);
        System.out.println("C constructor");

    }

 }

好奇 - 你能给出你为什么要这么做的充分理由吗?