Есть package p1, в котором расположены 3 файла:
Demo.java:
package p1;
public class Demo
{
public static void main(String [] args)
{
Protection ob1 = new Protection();
Derived ob2 = new Derived();
}
}
Protection.java:
package p1;
public class Protection
{
int n = 1;
private int n_pri = 2;
protected int n_pro = 3;
public int n_pub = 4;
public Protection()
{
System.out.println("Konstruktor bazovoo klassa.");
System.out.println("n = " + n);
System.out.println("n_pri = " + n_pri);
System.out.println("n_pro = " + n_pro);
System.out.println("n_pub = " + n_pub);
}
}
Derived.java:
package p1;
public class Derived extends Protection
{
Derived()
{
System.out.println(12);
}
}
Вывод:
Konstruktor bazovoo klassa.
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
Konstruktor bazovoo klassa.
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
12
Почему срабатывает 2 раза конструктор класса Protection, если я его не вызывал в классе Derived, например, Derived() {super()}; ?
При срабатывании конструктора потомка всегда вызывается конструктор предка, даже если вы не вызываете его явно. Компилятор сам дописывает вот такую строчку за вас:
Derived()
{
super(); // autogenerated
System.out.println(12);
}
Причем вызов коструктора супер класса всегда идет первым ! (таковы правила). Если вы попробуете изменить порядок, то компилятор сообщит вам об ошибке.
Потому что он вызывается неявно
Сборка персонального компьютера от Artline: умный выбор для современных пользователей