#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’.