Java 无法理解程序的输出。接口
我在期中考试时遇到过这个问题,我很难回答。 我不理解接口是如何工作的。有人能给我解释一下吗? 问题是这样写程序的输出: 输出线#1 输出线#2 输出线#3 输出线#4 输出线#5 我已经试过计算程序,但仍然无法理解 节目就在这里, 变形类:Java 无法理解程序的输出。接口,java,interface,Java,Interface,我在期中考试时遇到过这个问题,我很难回答。 我不理解接口是如何工作的。有人能给我解释一下吗? 问题是这样写程序的输出: 输出线#1 输出线#2 输出线#3 输出线#4 输出线#5 我已经试过计算程序,但仍然无法理解 节目就在这里, 变形类: public class PolyMorph{ public static void main(String[] args){ Worker w1 = new B(); // line #1 Worker w2 = n
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行和第2行,您需要了解动态多态性是如何工作的,以及构造函数的调用顺序 由于
Worker
接口由classA
实现,classA
由classB
和classC
继承,因此可以参照Worker
接口创建classB
和classC
的对象。因此,当创建类B
或类C
的对象时,首先调用父类A
的构造函数,然后执行子类构造函数
因此,第1行的输出将为:
New guy!
This is B reporting
New guy!
It's C here!
第2行的输出为:
New guy!
This is B reporting
New guy!
It's C here!
现在在第3行和第4行,您需要了解在协作方法中作为参数传递的对象以及调用它的对象
在第3行,collaboration
方法由类C
的对象调用,类B
的对象作为参数。因此,将调用类C
的collaboration
方法。但由于您将类B
的对象作为参数传递,因此,将根据类B
行为进行进一步的调用
现在类C
中的collaboration
方法有一个print语句,然后它将参数传递给父类(即类a
)的collaboration
)。在您的情况下,类B
的对象将传递给类A
中的协作方法。因此,在类A
的collaboration
方法中,调用了worker对象的snooze
方法(在本例中为类B
),现在控件将转到类B
的snooze
方法,并在那里执行进一步的操作。在类B
的snooze
方法中,存在print语句,并调用父类(即类a
)snooze
方法。
因此,第3行的输出为:
Try to work together...
Watch out for the boss!
Zzzz
在第4行,collaboration
方法由类B
的对象调用,类C
的对象作为参数。
由于类B
没有自己的协作
方法实现,因此将调用父类(即类A
)的协作
方法。在类A
的collaboration
方法中,调用了snooze
参数方法(它是类C
的对象),因此输出为:
Do this till 5pm.
在第5行,输出是直接的:
Who gets fired?
答案很有描述性,请仔细阅读答案…我使用接口作为回调内容的一种方式。接口
被用作多态性的一部分。它允许“对象”充当不同的类型(通过保证实现接口
描述的功能。例如苹果
可能被视为水果
,因此它可以传递到碗
,其中作为猫
,不是水果
,因此不能传递到碗
。清除为泥:P