Понимание примера промежуточного теста, мультикласса с println

#java #class #this #public #void

#java #класс #это #общедоступный #пустота

Вопрос:

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

Напишите 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");
   }
}
  

Его ответы: ноль
занзибар
занзибар
циркон
герцогиня
колоссальный
снарк
барабан
зорт
зимургия

Ответ №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");
   }
}
  

Я надеюсь, что это поможет… Я думаю, что наиболее важным для понимания является номер 3, где у вас есть неявные вызовы super().

Ответ №2:

Чего вы, вероятно, не понимаете, так это того, что когда конструктор явно не вызывает 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 аргументом и т. Д.

Ответ №3:

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

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

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

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

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

Теперь попробуйте разобраться, как происходит вторая печать ‘zanzibar’.