Лишний объект при инициализации через конструктор

Коллеги, будьте любезны, помогите новичку разобраться. У меня есть класс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 шт):

Автор решения: Leviathan_ZC

Порядок инициализации полей и блоков при наследовании

Есть суперкласс А, от данного суперкласса наследуется подкласс 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

Т.е. порядок такой:

  1. Статические блоки и статические поля в порядке объявления суперкласса(А)
  2. Статические блоки и статические поля в порядке объявления подкласса(В)
  3. Не статические блоки и не статические поля в порядке объявления суперкласса(А)
  4. Конструктор суперкласса(А)
  5. Не статические блоки и не статические поля в порядке объявления подкласса(B)
  6. Конструктор подкласса(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);), то этот код тоже выполнится

→ Ссылка