Java继承-运行Fly(程序)时显示的内容是什么?

时间:2019-06-13 14:01:00

标签: java inheritance

给出以下类别:

public class Super {
    protected int x = 1;

    public Super() {
    System.out.print("Super");
    }
}
public class Duper extends Super {
    protected int y = 2;
    public Duper() {
    System.out.println(" duper");
}
public class Fly extends Super {
    private int z, y;
    public Fly() {
        this(0);
    }
    public Fly(int n) {
        z = x + y + n;
        System.out.println(" fly times " + z);
    }
    public static void main(String[] args) {
        Duper d = new Duper();
        int delta = 1;
        Fly f = new Fly(delta);
    }
}

运行Fly时显示什么?

我的想法是,因为它创建了Duper对象,所以它将打印出duper。然后,它使用int参数转到Fly构造函数。 x是来自Super的1,y是来自Duper的2,n是来自Fly的1,所以1 + 2 + 1 = 4,所以我认为它也会打印fly times 4。其实是

Super duper
Super fly times 2

如果有人可以解释,那就太好了!

4 个答案:

答案 0 :(得分:2)

在执行Duper构造函数的主体之前,它将执行超类Super的构造函数。因此,在“ duper”之前打印“ Super”。

Fly构造函数也是如此。

关于打印号码z = x + y + nxn为1,而y为0,所以总和为2。请注意,Fly不是Duper的子类,并且即使是y的{​​{1}}成员,仍然会包含Fly并隐藏0的{​​{1}}成员,因此{ {1}}的变量y初始化为2。

答案 1 :(得分:1)

  

y是Duper中的2

不。 y来自Fly并用0初始化,因此z为2(Super的x = 1,Fly的y = 0,n为delta,即1)。您将在super.y的构造函数中使用Fly来访问Duper的y。

此外,对于“超级duper”,除非您明确调用它,否则会自动调用super()。在某些情况下,您可能不希望使用super(),例如基类没有no-arg构造函数,但是有一个接受int的构造函数,因此在派生类的构造函数中,您将其称为super(42)

答案 2 :(得分:1)

在子类的构造函数中,如果不显式调用父类的构造函数,则隐式调用父类的默认构造函数。

因此,基本上,Duper类的编译就像是编译

public class Duper extends Super {
    protected int y = 2;
    public Duper() {
        super(); // call Super default constructor
        System.out.println(" duper");
    }
}

Fly也一样

答案 3 :(得分:1)

Duper d = new Duper();

实例化一个新的DuperDuper()构造函数隐式调用Super()构造函数

-> 打印“超级” (无行返回)

->然后打印“ duper” (带有换行符)

int delta = 1;
Fly f = new Fly(delta);

Fly构造函数隐式调用Super()构造函数-> 打印“超级” (无行返回) 然后调用this(0)

编辑:在Fly中,private int z, y;zy都初始化为0(这是默认值int) 然后从x = 1继承Super,然后将x的值设置为1yz的值保持{{ 1}}。 调用0时,构造函数n1设置为public Fly(int n)(增量为new Fly(delta)

并计算

1

然后打印“飞行时间2” (带有换行符)