了解样本期中考试,使用println进行多课程

时间:2011-10-22 16:59:11

标签: 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(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

3 个答案:

答案 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'印刷的发生方式。