public class Solution implements Serializable {
    String Name;

    public Solution(String Name) throws FileNotFoundException {
        this.Name = Name;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        System.out.println("just a line");
        out.flush();
    }

    public static void main(String[] args) throws Exception {
        File file = File.createTempFile("test", null);
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
        Solution solution = new Solution("test");
        out.writeObject(solution);
        out.close();

        ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
        Solution loaded = (Solution) in.readObject();
    }
}
Кто может объяснить, почему мы переписываем методы readObject/writeObject для нашего кастомного класса, но вызываем эти методы по прежнему у объектов ObjectInputStream/ObjectOutputStream, как логика переписанных методов передается в методы другого класса? Пример, переписываем writeObject для класса Solution:
private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        System.out.println("just a line");
        out.flush();
    }
Потом просто сериализируем вызывая writeObject, но НЕ объекта класса Solution, а у объекта ObjectOutputStream
out.writeObject(solution);
После чего объект solution будет записан, а в консоль выведется строка "just a line". Как так выходит? Правильно ли я понимаю, что в глубинах реализации метода writeObject класса ObjectOutputStream идет проверка на то, что writeObject переписан у объекта, который передают, и в случае совпадения, выполняется дальше наш переписанный writeObject. Хотя там идет вызов defaultWriteObject(), который снова отдает выполнение методу writeObject класса ObjectOutputStream, аааааааа, мозг плавиться, помогите)))