Java 了解样本期中考试,带println的多类

Java 了解样本期中考试,带println的多类,java,class,this,public,void,Java,Class,This,Public,Void,大家好,我正在准备期中考试,我正在研究上学期的期中考试样本,答案已经给出了,但我正在试图弄清楚答案是如何产生的。下面的问题和答案,我理解他是如何得到“零”的,而不是其他的: 编写程序Bird.java的10行输出,如下所示 interface Silly { public void narf(); public void poit(Silly s); } public class Bird implements Silly { public static void main(Str

大家好,我正在准备期中考试,我正在研究上学期的期中考试样本,答案已经给出了,但我正在试图弄清楚答案是如何产生的。下面的问题和答案,我理解他是如何得到“零”的,而不是其他的:

编写程序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");
   }
}
他的答案是:零 桑给巴尔 桑给巴尔 锆石 公爵夫人 惊人的 咆哮 鼓 佐尔特
发酵术

如果你不明白“他是如何得到其余的”——你需要阅读关于对象、类和接口的基本教程。从提供的一个开始。简而言之,print语句的执行顺序与构造函数和重写方法的执行顺序相同。例如,打印第二个单词“桑给巴尔”,因为

public SillyBird(int i) {
    super(i);
}
调用构造函数
s=new-SillyBird(1),它调用:

public Bird(int i) {
    System.out.println("zanzibar");
}
通过
super(i)
调用


现在试着解释一下第二次“桑给巴尔”打印是如何发生的。

你可能没有得到的是,如果构造函数没有明确地调用super(),那么编译器会在构造函数的最开始添加一个
super()
调用。所以

public SillyBird() {
     System.out.println("duchess");
}
相当于

public SillyBird() {
    super(); 
    System.out.println("duchess");
}
在没有构造函数的最开始处添加
super()
调用,然后按照调用进行操作,您将找到答案。例如,调用

Silly s2 = new Loony();
调用调用super()的
Loony
构造函数。因此调用了SillyBird no arg构造函数,它首先调用super()。因此调用Bird no arg构造函数,它调用
this(0)
。因此调用Bird的1-arg构造函数,等等

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");
   }
}
我希望这有助于。。。我认为需要了解的最重要的一点是第3点,这里有隐式super()调用