嘿大家我正在为期中考试而学习,我正在研究上一学期的样本期中考试,给出了答案,但我想弄清楚答案是如何产生的。下面的问题和答案,我理解他是如何“零”而不是其余的:
写下如下所示的Bird.java程序的10行输出。
interface Silly {
public void narf();
public void poit(Silly s);
}
public class Bird implements Silly {
public static void main(String args[]) {
System.out.println("zero");
Silly s = new SillyBird(1);
Silly s2 = new Loony();
s.poit(s2);
s2.poit(s);
System.out.println("zymurgy");
}
public Bird() {
this(0);
System.out.println("zircon");
}
public Bird(int i) {
System.out.println("zanzibar");
}
public void narf() {
System.out.println("zort");
}
public void poit(Silly s) {
s.narf();
}
}
class SillyBird extends Bird {
public SillyBird() {
System.out.println("duchess");
}
public SillyBird(int i) {
super(i);
}
public void narf() {
System.out.println("drum");
super.narf();
}
}
class Loony extends SillyBird {
public Loony() {
System.out.println("stupendous");
}
public void narf() {
System.out.println("snark");
}
}
他的答案是:零 桑给巴尔 桑给巴尔 锆石 公爵夫人 巨大的 魅 鼓 zort zymurgy
答案 0 :(得分:1)
你可能没有得到的是构造函数没有明确地调用super(),然后编译器总是在构造函数的最开头添加一个super()
调用。所以,
public SillyBird() {
System.out.println("duchess");
}
相当于
public SillyBird() {
super();
System.out.println("duchess");
}
在构造函数的最开头添加super()
调用,但没有调用,然后按照调用,您将找到答案。例如,调用
Silly s2 = new Loony();
调用Loony
构造函数,该构造函数调用super()。所以调用了SillyBird no-arg构造函数,它首先调用super()。因此调用Bird no-arg构造函数,调用this(0)
。所以Bird的1-arg构造函数被调用等等。
答案 1 :(得分:1)
interface Silly {
public void narf();
public void poit(Silly s);
}
public class Bird implements Silly {
public static void main(String args[]) {
System.out.println("zero"); // 1. zero
Silly s = new SillyBird(1); // 2. zanzibar
Silly s2 = new Loony(); // 3. zanzibar zircon duchess stupendous
s.poit(s2); // 4. snark
s2.poit(s); // 5. drum zort
System.out.println("zymurgy");// 6. zymurgy
}
public Bird() {
this(0);
System.out.println("zircon");
}
public Bird(int i) {
System.out.println("zanzibar");
}
public void narf() {
System.out.println("zort");
}
public void poit(Silly s) {
s.narf();
}
}
class SillyBird extends Bird {
public SillyBird() {
System.out.println("duchess");
}
public SillyBird(int i) {
super(i);
}
public void narf() {
System.out.println("drum");
super.narf();
}
}
class Loony extends SillyBird {
public Loony() {
System.out.println("stupendous");
}
public void narf() {
System.out.println("snark");
}
}
我希望这会有所帮助......我认为最重要的一点就是你可以进行隐式super()调用。
答案 2 :(得分:0)
如果您不理解“他得到了什么” - 您需要阅读有关对象,类和接口的基本教程。从Oracle提供的那个开始。简而言之,print语句的执行顺序与构造函数和覆盖方法的执行顺序相同。例如,打印第二个单词'zanzibar'是因为
public SillyBird(int i) {
super(i);
}
构造函数被调用Silly s = new SillyBird(1);
,调用:
public Bird(int i) {
System.out.println("zanzibar");
}
通过super(i)
调用。
现在尝试推断第二次'zanzibar'印刷的发生方式。