2016-05-19 2 views
-1

Я хочу знать, почему следующий код:Почему вывод этого кода Java такой, какой он есть?

public class Vertebrate { 

    public Vertebrate() { 
     System.out.print("Vertebrate "); 
    } 

    public static void main(String[] args) { 
     Mammal rabbit = new Mammal(); 
     System.out.println("Rabbit"); 
    } 
} 

class Mammal extends Vertebrate { 
    public Mammal() { 
     System.out.print("Mammal "); 
    } 
} 

производит вывод: Vertebrate Mammal Rabbit.

Меня попросили объяснить подробно, но я не понимаю, почему результат такой, как есть. Пожалуйста, помогите мне.

+1

Как вы думаете? Почему результат такой, какой он есть? Вы пытались выполнить путь выполнения программы? –

+0

@AndreasFester Я думаю, что это потому, что млекопитающее расширяет позвоночные, но я не знаю, как написать подробное объяснение по этому поводу. – Leonardo

ответ

4

Вы экземпляр Mammalкакой неявном звонки super() до всего, что вызывает конструктор по умолчанию Vertebrate. Сначала это печатает Vertebrate. Затем он продолжается с конструктором Mammal, который печатает Mammal, а затем, наконец, Rabbit.

Для более сложного/расширенного случая наследования/конструкторов/переопределения У меня есть written a Q+A a назад.

+0

Большое вам спасибо :) – Leonardo

0

Существует неявное вызов по умолчанию конструктор супер-класса:

class Mammal extends Vertebrate { 
    public Mammal() { 
     super(); 
     System.out.print("Mammal "); 
    } 
} 
+0

@ pinquet62 Это имеет смысл для меня, большое вам спасибо :). – Leonardo

0

Как вы знаете метод main выполняет первый. Итак, эти две строки выполняются последовательно.

Mammal rabbit = new Mammal(); 
System.out.println("Rabbit"); 

Таким образом, вы можете понять, почему rabbit печатается последним. Теперь для первой строки,

Когда вы пишете Mammal rabbit = new Mammal();, вы создаете экземпляр справа класса млекопитающих. Теперь new Mammal() вызывает конструктор класса mammal. Для любого класса Java первая строка конструктора равна this.super() Неважно, пишете вы это или нет. Java делает это за вас.

Так внутри Mammal конструктор супер класс, т.е. Vertebrate получает экземпляр сначала. Это приводит к тому, что позвоночные печатают перед млекопитающим.

+0

большое спасибо Som: D – Leonardo

+0

добро пожаловать. –

0

Как конструктор подкласс неявно вызывает супер()

/* вызова супер() должен быть первым оператором в суб конструктору класса в случае явного вызова */

для получения дополнительной информации : http://docs.oracle.com/javase/tutorial/java/IandI/super.html

+0

Большое вам спасибо :) – Leonardo