Решения для выбранных упражнений могут быть найдены в электронной документации The Thinking in Java Annotated Solution Guide, доступной за малую плату на www.BruceEckel.com.
Создайте класс с конструктором по умолчанию (который не принимает аргументов), печатающий сообщение. Создайте объект этого класса.
Добавьте перегруженный конструктор к Упражнению 1, который принимает аргумент типа String и печатает его наряду с вашим сообщением.
Создайте массив ссылок на объекты вашего класса из Упражнения 2, но не создавайте объекты для помещения их ссылок в массив. Когда вы запустите программу, обратите внимание, есть ли сообщения об инициализации, которые печатаются при вызове конструктора.
Завершите Упражнение 3, создав объекты, и присоедините их к ссылкам в массиве.
Создайте массив из объектов String и присоедините строку к каждому элементу. Распечатайте массив, используя цикл for.
Создайте класс с названием Dog с перегруженным методом bark(). Этот метод должен перегружаться, основываясь на различных примитивных типах данных, и печатать различные типы лая, завывания и т.п., в зависимости от того, какая перегруженная версия вызвана. Напишите main(), который вызывает различные версии.
Измените Упражнение 6 так, чтобы два разных перегруженных метода имели два аргумента (двух различных типов), но в разном порядке. Проверьте как это работает.
Создайте класс без конструктора, а затем создайте объект этого класса в main() для проверки того, что конструктор по умолчанию синтезируется автоматически.
Создайте класс с двумя методами. В первом методе вызовите второй дважды: первый раз без использования this, а второй раз, используя this.
Создайте класс с двумя (перегруженными) конструкторами. Используя this, вызовите второй конструктор внутри первого.
Создайте класс с методом finalize(), который печатает сообщение. В main() создайте объект вашего класса. Объясните поведение вашей программы.
Измените Упражнение 11 так, чтобы ваш finalize() вызывался всегда.
Создайте класс, называемый Tank, который может быть заполнен и опустошен, и имеет смертельное состояние, при котором он должен быть опустошен во время очистки объекта. Напишите finalize(), который проверяет смертельное состояние. В main() проверьте возможные сценарии, которые возникают при использовании вашего Tank.
Создайте класс, содержащий int и char, которые не инициализируются, и распечатайте их значения, чтобы проверить, что Java выполнил инициализацию по умолчанию.
Создайте класс, содержащий не инициализированную ссылку на String. Продемонстрируйте, что эта ссылка инициализируется Java значением null.
Создайте класс с полем String, которое инициализируется в точке определения, и другое поле, которое инициализируется конструктором. Какие отличия есть в этих двух подходах?
Создайте класс с полем static String, которое инициализируется в точке определения, и другое, которое инициализируется в блоке static. Добавьте static метод, который печатает оба поля и демонстрирует, что оба они инициализируются до использования.
Создайте класс с String, который инициализируется, используя “инициализацию экземпляра”. Опишите использование этой особенности (отличной от тех, которые описаны в этой книге).
Напишите метод, который создает и инициализирует двумерный массив типа double. Размер массива определяется аргументами метода, а диапазон начальных значений определяется начальным и конечным значением, которые так же передаются, как аргументы метода. Создайте второй метод, который будет печатать массив, сгенерированный первым методом. В main() проверьте методы, создав и распечатав несколько массивов с различным размером.
Повторите Упражнение 19 для трехмерного массива.
Закомментируйте строку, помеченную (1) в ExplicitStatic.java и проверьте, что предложение статической инициализации не вызывается. Теперь раскомментируйте одну из строк, помеченных (2) и проверьте, что предложение статической инициализации вызвано. Теперь раскомментируйте вторую строку, помеченную (2) и проверьте, что статическая инициализация происходит лишь однажды.
Поэкспериментируйте с Garbage.java, запуская программу, используя такие аргументы, как “gc”, “finalize” или “all”. Повторите процесс и посмотрите, обнаружите ли вы какие-нибудь шаблоны на выходе. Измените код так, чтобы System.runFinalization() вызывался передSystem.gc() и посмотрите результат.
[27] В части литературы по Java от Sun они говорят об этом неуклюжим, но описательным именем “конструктор без аргументов”. Термин “конструктор по умолчанию” был в использовании уже много лет, поэтому он используется и сейчас.
[28] Одна из причин, по которой это возможно, если вы передаете ссылку на объект в static метод. Поэтому, через ссылку (которая теперь аналогична this), вы можете вызвать не static методы и получить доступ к не static полям. Но обычно, если вы хотите сделать что-то подобное, вы сделаете обычный не static метод.
[29] Термин, который был введен Bill Venners (www.artima.com) во время семинара, который мы с ним проводили вместе.
[30] В отличие от этого, C++ имеет список инициализирующих конструкторов, который является причиной инициализации до попадания в тело конструктора и является обязательным для объектов. Смотрите Thinking in C++, 2nd edition (доступную на CD ROM, поставляемый с книгой и на www.BruceEckel.com).
[31] Смотрите Thinking in C++, 2nd edition о более полном описании агрегатной инициализации в C++.
lektsii.net - Лекции.Нет - 2014-2025 год. (0.006 сек.)
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав