无法理解程序的输出。接口

时间:2018-12-13 03:54:55

标签: java interface

我在期中有这个问题,我很难回答。 我不了解接口如何工作。有人可以给我解释一下吗? 问题是要像这样编写程序的输出:

输出行1

第2行输出

第3行输出

第4行输出

第5行输出

我已经尝试过计算程序,但仍然无法理解...

程序就在这里;

PolyMorph类:

public class PolyMorph{
    public static void main(String[] args){
        Worker w1 = new B(); // line #1
        Worker w2 = new C(); // line #2
        w2.collaborate(w1);  // line #3
        w1.collaborate(w2);  // line #4
        System.out.println("Who gets fired?"); // line #5
    }
}

界面:

interface Worker {
    public void collaborate(Worker worker);
    public void snooze();
}

A类:

class A implements Worker{
    private String name;
    public A(){
        this("New guy!");
    }
    public A (String s){
        name = s;
        System.out.println(name);
    }
    public void collaborate(Worker worker){
        worker.snooze();
    }
    public void snooze(){
        System.out.println("Zzzz");
    }
}

B级:

class B extends A{
    public B(){
        System.out.println("This is B reporting");
    }
    public B(String s){
        super(s);
    }
    public void snooze(){
        System.out.println("Watch out for the boss!");
        super.snooze();
    }
}

C类:

class C extends B{
    public C(){
        System.out.println("It's C here!");
    }
    public void snooze(){
        System.out.println("Do this till 5pm.");
    }
    public void collaborate(Worker w){
        System.out.println("Try to work together...");
        super.collaborate(w);
    }
}

1 个答案:

答案 0 :(得分:0)

在这里,在第1行和第2行,您需要了解动态多态性是如何工作的,以及构造函数的调用顺序。

由于Worker接口是由类A实现的,而类A是由类B和类C继承的,因此可以创建类B和类C的对象,并带有Worker接口的引用。因此,当创建类B或类C的对象时,将首先调用父类A的构造函数,然后将执行子类构造函数< / p>

因此,在第1行的输出将是:

New guy!
This is B reporting

第2行的输出为:

New guy!
It's C here!

现在在第3行和第4行,您需要了解在 collaboration 方法中作为参数传递的对象是哪个,以及与哪个对象一起调用。

在第3行,collaboration方法由类C的对象调用,而类B的对象作为参数。因此,将调用类collaboration的{​​{1}}方法。但是,由于您将类C的对象作为参数传递,因此,将根据类B的行为进行进一步的调用。

现在,类B中的collaboration方法具有一条打印语句,然后将参数传递给父类(即类C)的collaboration。在您的情况下,类A的对象将传递给类B中的collaboration方法。因此,在类A的{​​{1}}方法中,调用了工作对象的collaboration方法(本例中为类A),现在控件将转到类snooze的{​​{1}}方法,在那里将进一步执行。在类B的{​​{1}}方法中,有一条print语句,并且调用了父类(即类snoozeB方法。 因此,第3行的输出将是:

snooze

在第4行,B类的对象以参数A的对象调用snooze方法。 由于类Try to work together... Watch out for the boss! Zzzz 没有自己的collaboration方法的实现,因此将调用父类(即类B)的C方法。在类B的{​​{1}}方法中,调用了collaboration的参数方法(它是类collaboration的对象),因此输出为:

A

在第5行,输出是直接的:

collaboration

答案很具有描述性,请仔细阅读答案...