Лишний объект при инициализации через конструктор
Коллеги, будьте любезны, помогите новичку разобраться. У меня есть классWindow содержащий конструктор
public class Window {
Window(int marker){
System.out.println("Window #:"+marker);
}
}
Есть класс House. В этом классе также содержится конструктор, но есть так же объект класса Window и метод
public class House {
Window window1=new Window(1);
public House(){
System.out.println("HOUSE");
Window window2=new Window(2);
}
public void f(){
System.out.println("METHOD");
}
}
Почему, когда я с помощью конструктора инициализирую объект класса House, кроме этого объекта я получаю еще и объект window1?
public static void main(String[] args) {
House house=new House();
}
В моей голове это выглядит примерно так: Я создаю объект класса House, содержащий объект класса Window window2, с помощью конструктора. Объект window1 лежит за пределами этого конструктора. Почему он объявляется если его затрагивали только в классе Window?
Ответы (2 шт):
Порядок инициализации полей и блоков при наследовании
Есть суперкласс А, от данного суперкласса наследуется подкласс B:
public class A {
{
System.out.println("A class. No static block 1");
}
{
System.out.println("A class. No static block 2");
}
{
System.out.println("A class. No static block 3");
}
static {
System.out.println("A class. Static block 1");
}
static {
System.out.println("A class. Static block 2");
}
public static String a1 = psv("a1");
public String a11 = pnsv("a11");
static {
System.out.println("A class. Static block 3");
}
public static String a2 = psv("a2");
private static String psv(String a) {
System.out.println("A class. Static perem " + a);
return a;
}
private String pnsv(String a) {
System.out.println("A class. No static perem " + a);
return a;
}
public A() {
System.out.println("A class. Constructor");
}
public String a22 = pnsv("a22");
public static String a3 = psv("a3");
{
System.out.println("A class. No static block 4");
}
public String a33 = pnsv("a33");
}
И класс B, который наследуется от класса A:
public class B extends A{
private int b = bb(20);
public B(int b) {
this.b = b;
}
private int bb(int x) {
System.out.println("B class. No static perem " + x);
return 0;
}
public B() {
System.out.println("B class. Constructor");
}
static {
System.out.println("B class. Static block 1");
}
}
Вызов конструктора у класса B:
public class Test {
public static void main(String[] args) {
new B();
}
}
Вывод на консоль:
A class. Static block 1
A class. Static block 2
A class. Static perem a1
A class. Static block 3
A class. Static perem a2
A class. Static perem a3
B class. Static block 1
A class. No static block 1
A class. No static block 2
A class. No static block 3
A class. No static perem a11
A class. No static perem a22
A class. No static block 4
A class. No static perem a33
A class. Constructor
B class. No static perem 20
B class. Constructor
Т.е. порядок такой:
- Статические блоки и статические поля в порядке объявления суперкласса(А)
- Статические блоки и статические поля в порядке объявления подкласса(В)
- Не статические блоки и не статические поля в порядке объявления суперкласса(А)
- Конструктор суперкласса(А)
- Не статические блоки и не статические поля в порядке объявления подкласса(B)
- Конструктор подкласса(B)
В данном случае смотреть от 1 до 4, т.к. подклассов здесь нет.
public class House {
Window window1=new Window(1);
public House(){
System.out.println("HOUSE");
Window window2=new Window(2);
}
}
При создании дома создается window2 (в конструкторе) и window1 в поле класса
конструктор создает экземпляр класса и если твой код подразумевает инициализацию других объектов, например в полях класса, в твоем случае - ( Window window1=new Window(1);), то этот код тоже выполнится
