Понимание образца среднесрочного теста, мультикласс с println - PullRequest
0 голосов
/ 22 октября 2011

Привет всем, я учусь на промежуточном экзамене и изучаю выборочный промежуточный экзамен из предыдущего семестра, ответы даны, но я пытаюсь выяснить, как появились ответы. Вопрос и ответы ниже, я понимаю, как он получил «ноль», но не остальное:

Напишите 10-строчный вывод программы Bird.java, показанной ниже.

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 ]

1 голос
/ 22 октября 2011

Что вы, вероятно, не получите, так это то, что конструктор явно не вызывает super (), тогда компилятор все равно добавляет вызов super() в самое начало конструктора.Итак,

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

эквивалентно

public SillyBird() {
    super(); 
    System.out.println("duchess");
}

Добавьте вызовы super() в самом начале конструкторов, у которых их нет, затем следуйте вызовам, и вынайду ответ.Например, вызов

Silly s2 = new Loony();

вызывает конструктор Loony, который вызывает super ().Поэтому вызывается конструктор без аргументов SillyBird, который сначала вызывает super ().Таким образом, вызывается конструктор Bird без аргументов, который вызывает this(0).ТАК называется 1-аргументный конструктор Bird и т. Д.

1 голос
/ 22 октября 2011
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 ().

0 голосов
/ 22 октября 2011

Если вы не понимаете, как «он получил остальное» - вам нужно прочитать базовое руководство по объектам, классам и интерфейсам.Начните с того, что предоставлено Oracle .В двух словах, операторы print выполняются в том же порядке, в котором выполняются конструкторы и методы переопределения.Например, второе слово «zanzibar» печатается, потому что вызывается конструктор

public SillyBird(int i) {
    super(i);
}

Silly s = new SillyBird(1);, который вызывает:

public Bird(int i) {
    System.out.println("zanzibar");
}

через вызов super(i).

Теперь попытайтесь объяснить, как происходит вторая печать «Занзибар».

...