【Рекомендации】【Идеи программирования на Java】【Примечания】

Java

Если вы хотите делать хорошую работу, вы должны сначала заточить свои инструменты!

Как бы быстро вы не освоили основы, и как бы ни был плох язык!

Глава 1. Введение в объекты

«Причина, по которой мы расчленяем естественный мир, организуем его в понятия и классифицируем их по значениям, заключается прежде всего в том, что мы являемся участниками соглашения, которого придерживается все сообщество устного общения, зафиксированного в форме языка. ... Мы вообще не можем разговаривать, если не согласимся с организацией и классификацией лингвистической информации, как это предусмотрено в этом соглашении. — Бенджамин Ли Уорф (1897–1941)».

1.1 Абстрактный процесс

  • Объектно-ориентированные функции:
    1. Все является объектом.Думайте об объекте как о причудливой переменной, которая может хранить данные, в дополнение к тому, что вы можете запросить ее. Выполните операцию над собой. Теоретически можно извлечь любую концептуальную конструкцию решаемой задачи (собака, здание вещи, услуги и т. д.), представленные в программе в виде объектов.
    2. Программа — это набор объектов, которые сообщают друг другу, что делать, отправляя сообщения.Чтобы запросить объект, Этому объекту должно быть отправлено сообщение. Более конкретно, сообщение можно рассматривать как ответ на метод определенного объекта. запрос на звонок.
    3. Каждый объект имеет собственное хранилище, состоящее из других объектов.Другими словами, можно включить существующие пары, создав Пакет изображений для создания новых типов объектов. Поэтому в программе можно строить сложные системы, и при этом Сложность прячется за простотой объектов.
    4. Каждый объект имеет свой тип.В общих чертах: «Каждый объект является экземпляром некоторого класса. Пример (экземпляр)», где «класс» — синоним «типа». Наиболее важная особенность каждого класса, отличающая его от других классов Это «какие сообщения могут быть отправлены на него».
    5. Все объекты определенного типа могут получать одно и то же сообщение.Это значимое заявление, вы немного увидим позже. Поскольку объекты типа "круг" также являются объектами типа "геометрия", объект "круг" Должна быть возможность принимать сообщения, отправленные объекту "геометрия". Это означает, что вы можете написать, чтобы взаимодействовать с «геометрией» и обрабатывать ее автоматически. Код для всех транзакций, связанных со свойствами геометрии. Эта взаимозаменяемость является самой сильной в ООП. Одна из сильных концепций.
  • Каждый объект имеет уникальный адрес в памяти(Каждый объект уникально отличим от других объектов).

1.2 У каждого объекта есть интерфейс

  • Создание абстрактных типов данных (классов) — одна из фундаментальных концепций объектно-ориентированного программирования.

    Абстрактные данные ведут себя почти так же, как и встроенные типы: вы можете создавать переменные определенного типа (нажав На объектно-ориентированном языке назовите это объектом или экземпляром), а затем манипулируйте этими переменными (назовите это отправкой сообщения или запросом запрос; отправьте сообщение, и объект знает, что делать).

  • Каждый объект принадлежит определенному классу, который определяет свойства и поведение.

  • Поскольку класс описывает набор объектов с одинаковыми характеристиками (элементами данных) и поведением (функциональными возможностями), класс фактически является типом данных.

  • Интерфейс определяет запросы, которые могут быть сделаны к конкретному объекту.

1.3 Каждый объект предоставляет услугу

  • Высокая сплоченность и низкая связанность

    Сплоченность:Хороший целостный модуль должен делать ровно одну вещь. он описывает функциональная связь внутри модуля;

    связь:Это мера взаимосвязи между модулями в структуре программного обеспечения.Сила связи зависит от сложности интерфейса между модулями. степень, точка входа или доступа к модулю и данные через интерфейс.

    Высокая связность и низкая связанность - это концепция разработки программного обеспечения и критерий оценки качества дизайна, в основном объектно-ориентированного дизайна. Расчет в основном зависит от того, высока ли сплоченность класса и низка ли степень связанности.

    Связь:Также называется межблочной связью. Относится к мере степени взаимосвязи между модулями в структуре программной системы. форма Чем теснее соединение между блоками, тем сильнее связь и тем хуже независимость модулей. Уровень связи между модулями зависит от режима Сложность интерфейса между блоками, способ вызова и передаваемая информация

    Сплоченность:Также известна как внутриблочная связь. Относится к показателю функциональной силы модуля, то есть комбинации элементов внутри модуля друг с другом. Мера близости. Если элементы в модуле (между названиями языков и между сегментами программы) более тесно связаны, то Это более сплоченно.

    Так называемая высокая связность означает, что программный модуль состоит из сильно связанных кодов и отвечает только за одну задачу, то есть часто принцип единой ответственности.

    связь:Мера степени взаимосвязи между различными модулями в структуре программного обеспечения.

    Для низкой связанности поверхностное понимание: полная система между модулями, насколько это возможно, чтобы сделать их независимыми существует.То есть пусть каждый модуль выполняет определенную подфункцию независимо, насколько это возможно. модуль к модулю Интерфейс, как можно меньше и проще. Если взаимосвязь между двумя модулями сложна, лучше сначала рассмотреть дополнительные Модульное деление. Это облегчает модификацию и комбинирование.

  • Представление об объектах как о поставщиках услуг имеет побочное преимущество: оно помогает улучшить связность объектов. высокая сплоченность Одно из фундаментальных требований к качеству разработки программного обеспечения: это означает, что программная конструкция (например, объект, разумеется, также может относится к различным аспектам метода или библиотеки объектов). Одна из проблем, с которыми сталкиваются люди при проектировании объектов Проблема в том, что в один объект втиснуто слишком много функций.

  • В хорошем объектно-ориентированном дизайне каждый объект хорошо справляется с одной задачей, но не пытается делать больше.

  • Отношение к объектам как к поставщикам услуг — отличный инструмент упрощения, не только полезный в процессе проектирования, но и И когда другие люди пытаются понять ваш код или повторно использовать объект, если они видят, что этот объект может предложить Ценность услуги в том, что она значительно упростит процесс адаптации объекта к его дизайну.

1.4 Конкретная реализация скрытия

  • Разделите разработчиков-программистов по ролям на создателей классов (тех, кто создает типы данных строк) и клиентских программ. Члены (те потребители классов, которые используют типы данных в своих приложениях) приносят большую пользу. Цель клиентского программиста – получить Коллекция различных классов для быстрой разработки приложений. Целью создателя класса является создание классов, доступных только клиентским программам. Оператор выставляет нужные части и прячет остальные части.
  • Почему существует контроль доступа
    • Первая причина состоит в том, чтобы не допустить, чтобы программисты-клиенты касались частей, которые им не следует делать.
    • Вторая причина существования — позволить разработчикам библиотек изменять внутреннюю работу класса, не беспокоясь о том, что это повлияет на программистов-клиентов.
  • Граничное значение JAVA
    • публичный:Указывает, что следующий за ним элемент доступен всем.
    • частный:Ключевое слово представляет элемент, который недоступен никому, кроме создателя типа и внутренних методов типа. приватный — это как кирпичная стена между вами и программистом клиента, если кто-то попытается получить доступ к приватному компоненту При компиляции вы получите сообщение об ошибке.
    • защищено:Ключевое слово protected эквивалентно private, с той лишь разницей, что унаследованный класс может получить доступ защищенные члены, но не могут получить доступ к закрытым членам.
    • Права доступа по умолчанию:Это работает, когда ни один из спецификаторов доступа, упомянутых ранее, не используется. Это разрешение часто называют доступом к пакету, потому что при этом разрешении класс может получить доступ к членам других классов в том же пакете (библиотечном компоненте), но вне пакета эти члены ведут себя так, как если бы были указаны частные.

1.5 Конкретная реализация мультиплексирования

  • Повторное использование кода — одно из величайших преимуществ, которые обеспечивают блокировки объектно-ориентированного языка программирования.

  • Новый тип может быть составлен из любого количества других объектов любого типа любым способом, который может обеспечить желаемую функциональность в новом классе.

  • Поскольку вы создаете новые классы других объектов, используя существующие классы, эта концепция называется композицией, а если композиция происходит динамически, ее часто называют агрегацией.

  • При создании новых классов в первую очередь следует учитывать композицию, поскольку она проще и гибче.Таким образом, дизайн становится более ясным, и когда у вас есть некоторый опыт, вы можете видеть, где необходимо использовать наследование.

1.6 Наследование

  • Когда исходный класс (называемый базовым классом, суперклассом или родительским классом) изменяется, модифицированная «копия» (называемая производным классом, унаследованным классом или подклассом) также отражает изменение.

  • Базовый класс может быть создан для представления основных концепций некоторых объектов в системе, а другие типы могут быть производными от базового типа для представления различных способов реализации этого ядра.

  • При наследовании существующего типа также создается новый тип.Этот новый тип не только включает в себя все члены текущего типа (хотя закрытые члены скрыты и недоступны), но, что более важно, он дублирует интерфейс базового класса. То есть все сообщения, которые могут быть отправлены объектам базового класса, также могут быть отправлены объектам производного класса.

  • Эквивалентность типов через наследование — важный порог для понимания смысла методов объектно-ориентированного программирования!

  • Есть два способа отличить базовый класс от экспортированного класса.

      1. Добавляйте новые методы непосредственно в экспортируемый класс. Эти новые методы не являются частью интерфейса базового класса. Это означает, что базовый класс не отвечает всем вашим потребностям, поэтому вы должны добавить больше метод.
      1. Способ сделать различие между производным классом и базовым классом состоит в том, чтобы изменить поведение существующего метода базового класса, что называется переопределением этого метода.
  • Наследование должно только переопределять методы базового класса (без добавления новых методов, которых нет в базовом классе), в некотором смысле это идеальный способ обработки наследования. В этом случае мы часто называем отношение между базовым классом и производным классом отношением «есть-а».

  • Иногда к экспортируемому типу необходимо добавлять новые элементы интерфейса, тем самым расширяя интерфейс. Мы можем описать эту ситуацию как отношения «как-как».

1.7 Взаимозаменяемые объекты с полиморфизмом

  • Возможность легко расширять проект путем экспорта новых подтипов — один из основных способов инкапсуляции изменений.

    Эта возможность может значительно улучшить наши проекты, а также снизить стоимость обслуживания программного обеспечения.

  • Самый важный совет объектно-ориентированного программирования: компилятор не может генерировать вызовы функций в традиционном смысле.Необъектно-ориентированный компилятор производит вызов функции, который вызывает так называемуюРаннее связывание, термин, о котором вы, вероятно, никогда раньше не слышали и, вероятно, никогда не думали о других способах вызова функции. Это означает, что компилятор сгенерирует вызов к определенному имени функции, а среда выполнения разрешит вызов по абсолютному адресу исполняемого кода. Однако в ООП (объектно-ориентированном программировании) программа не может определить адрес кода до момента выполнения, поэтому должны использоваться другие механизмы, когда сообщение отправляется обобщенному объекту.

  • Когда сообщение отправляется объекту, вызываемый код не может быть определен до времени выполнения.Компилятор обеспечивает существование вызываемого метода и выполняет проверку типов параметров вызова и возвращаемых значений (языки, которые не могут предоставить такие гарантии, называются слабо типизированными), но не знает точного кода, который будет выполняться. .

  • В java динамическое связывание является поведением по умолчанию, и нет необходимости добавлять дополнительные ключевые слова для достижения полиморфизма.

  • Процесс обращения с экспортированным классом в качестве его базового класса называется повышением приведения.

    Преобразование имени вдохновлено формирующим действием приведения модели, а слово «вверх» происходит от того, как обычно укладываются графы наследования: обычно базовые классы располагаются вверху, а производные классы располагаются ниже него. Таким образом, приведение к базовому классу — это продвижение вверх по графу наследования или «повышение приведения».

  • Именно из-за полиморфизма вещи всегда обрабатываются правильно. Компилятор и среда выполнения позаботятся о деталях, все, что вам нужно знать сразу, это то, что что-то произойдет, и, что более важно, как спроектировать это. При отправке сообщения объекту, даже если задействовано восходящее преобразование, объект знает, какое поведение следует выполнять правильно.

1.8 Структура наследования с одним корнем

  • В ООП все классы в конечном итоге наследуются от одного базового класса? Ответ — да, имя этого конечного базового класса — Object.Оказывается, однокорневая структура наследования приносит массу преимуществ.
  • Все объекты в структуре наследования с одним корнем имеют общий интерфейс, поэтому все они сводятся к одному и тому же базовому типу.
  • Структура наследования с одним корнем гарантирует, что все объекты обладают определенными возможностями.
  • Структура наследования с одним корнем значительно упрощает реализацию сборщика мусора, а сборщик мусора является одним из важных улучшений Java по сравнению с C++.Поскольку все объекты гарантированно имеют информацию о своем типе, взаимоблокировка не возникает из-за невозможности определить тип объекта. Это особенно важно для операций системного уровня, таких как обработка исключений, и обеспечивает большую гибкость программирования.

1.9 Контейнеры (коллекции)

  • Контейнеры (также называемые коллекциями, хотя в библиотеке классов Java термин «коллекция» используется в другом смысле, поэтому в этой книге используется слово «контейнер»), которые могут расширяться, чтобы хранить все, что вы в них помещаете, когда это необходимо. Таким образом, нет необходимости знать, сколько объектов будет помещено в контейнер в будущем, просто создайте объект-контейнер и позвольте ему обрабатывать все детали.

  • Java-контейнер

    • Список (для хранения последовательностей)
    • Карта (также известная как ассоциативный массив, используется для установления связей между объектами)
    • Set (содержит только один объект каждого типа)
    • Много очередей, деревьев, стеков и многого другого.
  • Выбирать контейнер при его использовании все же необходимо по следующим причинам:

    • Разные контейнеры предоставляют разные типы интерфейсов и внешнее поведение. Стек имеет другой интерфейс и поведение, чем очередь, а также отличается от интерфейса и поведения списка коллекции. Некоторые из этих контейнеров могут предложить гораздо более гибкое решение, чем другие.
    • Различные контейнеры имеют разную эффективность для определенных операций. Лучшим примером является сравнение двух списков: ArrayList и LinkedList. Все они представляют собой простые последовательности с одинаковым интерфейсом и внешним поведением, но стоимость некоторых операций у них очень разная. В ArrayList произвольный доступ к элементам — это операция, занимающая фиксированное время, однако для LinkedList случайно выбранные элементы нужно перемещать по списку, что затратно, а доступ к элементам ближе к концу списка занимает больше времени . . . С другой стороны, если вы хотите вставить элемент в середину последовательности, LinkedList имеет меньше накладных расходов, чем ArrayList.
  • Мы можем начать создавать программы с помощью LinkedList и вместо этого использовать ArrayList при оптимизации производительности системы. Абстракция, обеспечиваемая интерфейсом List, сводит к минимуму влияние на код при преобразовании между контейнерами.

  • Параметризованные типы (дженерики)До Java SE5 объекты, хранящиеся в контейнере, имели в Java только общий тип: Object.

    Структура наследования с одним корнем означает, что все имеет тип Object., поэтому контейнер, в котором может храниться объект, может хранить что угодно. Это упрощает повторное использование контейнеров.

  • Переход вверх безопасен, например, Circle — это тип Shape, но вы не знаете, является ли Object типом Circle или Shape, поэтому, если вы точно не знаете, с каким типом объекта вы имеете дело, приведение вниз почти небезопасно.

  • Если приведение вниз неверно, вы получите ошибку времени выполнения, называемую исключением.

  • Параметризованный тип (универсальный) — это класс, который компилятор может автоматически настроить для использования в конкретном типе.Например, используя параметризованные типы, компилятор может настроить контейнер, который принимает и извлекает только объекты Shape.

  • Многие сборки стандартных библиотек были изменены, чтобы использовать преимущества дженериков. Как мы увидим, парадигмы оказывают существенное влияние на большую часть кода в этой книге.

1.10 Создание объекта и время жизни

  • При работе с объектами одним из наиболее важных вопросов является то, как они создаются и уничтожаются.

    Каждому объекту нужны ресурсы, особенно память, чтобы выжить. Когда нам больше не нужен объект, его нужно очистить. Ресурсы, которые он занимает, могут быть высвобождены и использованы повторно.

  • В погоне за максимальной скоростью выполнения объем памяти и время жизни объекта можно определить при написании программы.

    • Этого можно добиться, поместив объекты в стек (их иногда называют автоматическими переменными), ограниченные переменные или статические области хранения.

      При таком подходе приоритет отдается выделению и освобождению хранилища, и в некоторых случаях такой контроль может оказаться полезным. Однако гибкость также приносится в жертву, поскольку точное количество, время жизни и тип объектов должны быть известны во время написания программы.

    • Второй способ — динамически создавать объекты в пуле памяти, называемом кучей.

      Таким образом, не известно до времени выполнения, сколько объектов не требуется, каковы их жизненные жизни, а какие их конкретные типы.

  • Если необходим новый объект, его можно создать непосредственно в куче, когда это необходимо. Поскольку хранилище динамически управляется во время выполнения, выделение хранилища в куче занимает значительное время, что может быть намного дольше, чем создание хранилища в стеке.

  • Время создания пространства для хранения стека зависит от конструкции механизма хранения.

  • Динамический подход имеет общее логическое допущение: объекты имеют тенденцию усложняться. Таким образом, накладные расходы на поиск и освобождение места для хранения не оказывают существенного влияния на создание объекта. Большая гибкость, обеспечиваемая динамическим подходом, необходима для решения общих задач программирования.

  • Java полностью использует динамическое выделение памяти. Всякий раз, когда вы хотите создать новый объект, используйте ключевое слово new для создания динамического экземпляра этого объекта.

  • Другой вопрос — жизненный цикл. Для языков, позволяющих создавать объекты в стеке, компилятор может определить, как долго объект жив, и может автоматически его уничтожить.

  • Java предоставляет механизм, называемый «сборщик мусора», который автоматически определяет, когда объект больше не используется, и соответствующим образом уничтожает его.

    Сборщик мусора очень полезен, потому что он уменьшает количество проблем, которые необходимо учитывать, и код, который необходимо написать. Что еще более важно, сборщик мусора обеспечивает более высокий уровень гарантий против скрытых утечек памяти.

  • Сборщик мусора Java предназначен для освобождения памяти (хотя он не охватывает другие аспекты очистки объектов). Сборщик мусора «знает», когда объект больше не используется, и автоматически освобождает память, занятую объектом.

1.11 Обработка исключений: обработка ошибок

  • Исключение — это объект, который «выбрасывается» из места ошибки и «перехватывается» соответствующим обработчиком исключений, специально разработанным для обработки определенного типа ошибок. Обработка исключений похожа на другой путь, который проходит параллельно нормальному пути выполнения программы при возникновении ошибки. Поскольку это еще один совершенно отдельный путь выполнения, он не мешает нормальному выполнению кода.
  • Исключения, которые выбрасываются, не игнорируются, как значения ошибок, возвращаемые методами, и флаги, установленные методами для обозначения условий ошибки.Исключения нельзя игнорировать, поэтому они гарантированно будут где-то обработаны.
  • Исключения обеспечивают способ надежного восстановления после ошибок. Вместо того, чтобы просто выйти из программы, вы часто можете внести исправления и возобновить выполнение программы, что помогает писать более надежные программы.

1.12 Параллельное программирование

  • Фундаментальной концепцией компьютерного программирования является идея одновременной обработки нескольких задач.
  • Части программы, которые выполняются независимо друг от друга, называются потоками.
  • Для большого количества задач разделите задачу на несколько независимо выполняемых частей (задач), тем самым повысив скорость отклика программы. Назовите это «параллельность».
  • Потоки — это всего лишь средство распределения времени выполнения для одного процессора.
  • Проблемы могут возникнуть, когда несколько параллельных задач обращаются к одному и тому же ресурсу. Например, два процесса не могут отправлять информацию на принтер одновременно. Чтобы решить эту проблему, ресурсы, которые могут использоваться совместно, например принтеры, должны быть заблокированы во время использования. Таким образом, весь процесс таков: задача блокирует ресурс, завершает свою задачу, а затем снимает блокировку ресурса, чтобы другие задачи могли использовать этот ресурс.

Глава 2 Все является объектом

«Если мы говорим на другом языке, то открываем для себя несколько иной мир. — Лудуинг Витгерштейн (1889–1951)».

2.1 Управление объектами со ссылками

  • В Java все рассматривается как объект, поэтому можно использовать единый синтаксис. Хотя все рассматривается как объект, идентификатор операции на самом деле является «ссылкой» на объект.

    Пример: Пульт дистанционного управления (эталон) управляет телевизором (объектом).

    • Идентификатор операции Java на самом деле является «ссылкой» на объект
    • Идентификатор операции Java на самом деле является «ссылкой» на объект
    • Идентификатор операции Java на самом деле является «ссылкой» на объект

2.2 Вы должны создать все объекты

  • Новое ключевое слово означает «дайте мне новый объект».
  • Где хранить данные:
    • регистр:Самая быстрая область памяти, но так как количество регистров крайне ограничено, она выделяется по требованию. У вас нет прямого контроля, и вы не чувствуете никаких признаков существования регистра в программе.

    • куча:Находится в ОЗУ общего назначения (оперативное запоминающее устройство). Если указатель стека перемещается вниз, выделяется новая память, а если он перемещается вверх, память освобождается.

      Стек: это СТЕК. По сути, это очередь только с одним входом и выходом, то есть First In Last Out, и память, выделенная первой, должна быть освобождена позже. Как правило, он автоматически выделяется системой, а значения параметров функции, локальные переменные и т. д. сохраняются и автоматически очищаются.

      Стек делится на небольшой блок при входе каждой функции и освобождается при выходе из функции.

      Локальные переменные помещаются в стек, поэтому, когда функция возвращается, локальные переменные исчезают.

    • куча:общий пул памяти (расположенный в области оперативной памяти),Используется для хранения всех объектов Java.

      Когда вам нужен объект, вам нужно всего лишь написать простую строку кода с new, и когда эта строка кода будет выполнена, выделение памяти будет автоматически выполнено в куче.

      Выделение памяти и очистка с помощью кучи могут занять больше времени, чем выделение памяти со стеком.

    • Постоянное хранение:Постоянные значения обычно хранятся непосредственно внутри программного кода.

    • Хранилище без оперативной памяти:Если данные живут полностью вне программы, то они могут быть свободны от какого-либо контроля программы и могут существовать даже тогда, когда программа не запущена. Например: потоковые объекты и постоянные объекты.

  • базовый тип данных
    • Примитивные типы данных не создают объект с new, а вместо этого создают «автоматическую» переменную, которая не является ссылкой. Эта переменная хранит «значение» напрямую и помещается в стек, поэтому она более эффективна.
    • Все типы данных имеют знаки, беззнаковых числовых типов нет.
    • Примитивный тип имеет класс-оболочку, который позволяет создать непримитивный объект в куче для представления соответствующего и этого типа.
    • Функция автоматической упаковки в java SE5 автоматически преобразует примитивные типы данных в типы-оболочки.
    • Java предоставляет два класса для высокоточных вычислений: BigInteger (поддерживает целые числа произвольной точности) и BigDecimal (поддерживает числа с фиксированной точкой любой точности).

2.3 Объекты никогда не нужно уничтожать

  • объем
    • Область действия определяется положением фигурных скобок.
    • Переменные, определенные в области, доступны только до конца области.
  • сфера действия объекта
    • Когда new создает объект Java, он может выйти за рамки.
    • В Java есть сборщик мусора, который отслеживает все объекты, созданные с помощью new, и идентифицирует те, на которые больше не будут ссылаться. Впоследствии пространство памяти этих объектов освобождается, чтобы можно было использовать другие новые объекты.

2.4 Создание нового типа данных: класс

  • За ключевым словом class следует имя нового типа.
  • Все, что вы делаете в Java, — это определяете классы, создаете объекты этих классов и отправляете сообщения этим объектам.
  • Поле может быть любого типа, с которым оно может быть связано через его ссылку, или одного из примитивных типов.
  • Если поле является ссылкой на объект, ссылка должна быть инициализирована так, чтобы она была связана с фактическим объектом.

2.5 Методы, параметры и возвращаемые значения

  • Метод Java определяет, какое сообщение может получить объект, составленный (имя, параметр, возвращаемое значение, метод).
  • Имя метода и список параметров однозначно идентифицируют метод.
  • Акт вызова метода часто называют отправкой сообщения объекту.
  • Объектно-ориентированное программирование часто описывается просто как «отправка сообщений объектам».
  • Часто, несмотря на передачу объекта, фактически передается ссылка на объект.

2.6 Создание Java-программы

  • Java использует доменное имя, чтобы гарантировать, что каждый класс уникален.
  • статическое ключевое слово
    • Когда new выполняется для создания объекта, выделяется пространство для хранения данных, а его методы вызываются внешним миром.
    • Два сценария, которые новые объекты создания не могут удовлетворить:
        1. Просто хочу выделить одно место для хранения для определенного домена, независимо от того, сколько объектов нужно создать или даже вообще без объектов.
        1. Желательно, чтобы метод не был связан ни с одним объектом содержащего его класса. То есть этот метод можно вызывать без создания объекта.
      • [Решение] Объявление объекта статическим означает, что поле или метод не будут связаны ни с одним экземпляром объекта содержащего его класса.
    • Вам не нужно создавать какие-либо объекты перед использованием статических методов (или полей).
    • Статическое поле имеет только одно место для хранения для каждого класса, в то время как нестатическое поле имеет одно место для хранения для каждого объекта.

Глава 3 Операторы

3.7 Реляционные операторы

  • Два целых числа из нового, хотя содержимое объекта такое же, но ссылка на объект другая, == и ! = сравнивает ссылки на объекты.
  • Если вы хотите сравнить, действительно ли два объекта одинаковы, вы должны использовать equals(), который применим ко всем объектам.
  • Примитивные типы напрямую используют == и ! знак равно

Глава 4 Управление потоком выполнения

  • java не позволяет нам использовать число как логическое значение!
  • Ключевое слово return служит двум целям:
    • С одной стороны укажите, какое значение возвращает метод
    • С другой стороны, это приведет к выходу текущего метода и возврату этого значения.
  • break используется для принудительного выхода из цикла без выполнения оставшихся операторов в цикле.
  • Continue останавливает выполнение текущей итерации, а затем возвращается к началу и концу цикла, чтобы начать следующую итерацию.

Глава 5 Инициализация и очистка

5.1 Обеспечение инициализации с помощью конструкторов

  • Конструктор берет то же имя, что и класс.При создании объекта newXXX() выделит место для хранения объекта и вызовет соответствующий конструктор. Это гарантирует, что объект инициализируется перед манипулированием им.
  • Каждый класс будет иметь конструктор по умолчанию, который в документации по java называется "конструктором без аргументов".
  • Конструктор — это особый тип метода, который не имеет возвращаемого значения.
  • В Java «инициализация» и «создание» связаны друг с другом, их нельзя разделить!

5.2 Перегрузка метода

  • Перегрузка: имя метода такое же, но формальные параметры разные.
  • Каждый перегруженный метод должен иметь уникальный список типов параметров.
  • Перегруженные методы нельзя отличить по возвращаемому значению.
  • Самый распространенный вариант использования перегрузки — это перегрузка конструктора!

5.3 Конструкторы по умолчанию

  • Конструктор по умолчанию (он же конструктор "без аргументов") не имеет формальных параметров - он создает "объект по умолчанию".
  • Если в классе нет конструктора, компилятор автоматически создаст для вас конструктор по умолчанию. Но если вы написали конструктор (конструкция параметра), конструктор по умолчанию будет автоматически перезаписан (то есть в классе в данный момент нет конструктора по умолчанию (конструкции параметра), если вам также не нужна конструкция параметра, которую вы нужно вручную добавить конструктор без аргументов самостоятельно).

5.4 это ключевое слово

class Banana { void peel(int i) {/*...*/} }

public class BananaPeel{
    public static void main(String[] args) {
        Banana a = new Banana();
        Banana b = new Banana();
        a.peel(1);
        b.peel(2);
    }
}

[Вопрос] Как peer() узнает, вызывается ли он a или b?

【答】:为了能简便面向对象的语法来编写代码,编译器暗自把“操作对象的引用”作为第一个参数传递给peel(),
       a.peel(a,1);这是内部表现形式。
  • Если вам нужно получить ссылку на текущий объект внутри метода, вы можете использовать ключевое слово this!
  • Ключевое слово this может вызываться только внутри метода!
  • обычно пишутthisКогда он используется, он ссылается на «этот объект» или «текущий объект», а сам представляет собой ссылку на текущий объект.
  • Вы можете использовать это для вызова одного конструктора, но вы не можете вызвать два, и конструктор должен быть помещен в самое начало, иначе будет сообщено об ошибке.
  • Компилятор запрещает вызывать конструктор из любого метода, кроме конструктора!
  • staticэто метод без этого
  • Нестатический метод нельзя вызвать из статического метода.
  • static может вызывать статические методы только через сам класс без создания объекта.

5.5 Очистка: финализаторы и сборка мусора

  • Сборщик мусора в java отвечает за утилизацию ресурсов памяти, занятых бесполезными объектами.

  • Сборщик мусора знает только об освобождении памяти, выделенной new.

  • finalize(): метод, вызываемый перед тем, как сборщик мусора будет готов освободить пространство хранения, занимаемое восстановленным объектом, который можно настроить для выполнения некоторой работы по очистке.

    [Вопрос] Разница между finalize() и деструктором:

      析构函数(C++中销毁对象必须用这个函数):“析构”函数与构造函数相反,当对象结束其生命周期,
      如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后”的工作。
    
  • Объекты Java не всегда удаляются сборщиком мусора:

    1. Объекты не могут быть удалены сборщиком мусора.
    2. Сбор мусора не равно "уничтожение".
    3. Сборка мусора касается только памяти.
  • В java, пока программа не находится на грани исчерпания памяти, пространство, занимаемое объектом, никогда не будет освобождено.

  • Единственная причина использования сборщика мусора — освободить память, которая больше не используется программой.

  • Цель finalize() - освободить место:

    1. Независимо от того, как был создан объект, сборщик мусора отвечает за освобождение всей памяти, занятой объектом.

    Когда в коде используются «собственные методы», такие как вызов серии функций malloc() языка C для выделения места для хранения, вам нужно вызвать free() в finalize, чтобы освободить место в памяти.

    Примечание. Собственный метод — это метод вызова не-java-кода в java, который обычно модифицируется с помощью ключевого слова «native».

  • Цель finalize() - проверка конечного условия:

    Проверяйте определенное состояние объекта до того, как ресурсы объекта будут освобождены, и поместите содержимое проверки в метод finalize(), чтобы избежать некоторых дефектов, вызванных проблемами написания кода.

    Примечание. В [Effective Java] это упоминается в разделе «Избегание использования финализированных методов и четких методов»: методы финализации обычно непредсказуемы, опасны и, как правило, не нужны. Использование финализаторов может привести к неустойчивому поведению, снижению производительности и проблемам с переносимостью, и, как правило, финализаторов следует избегать.

  • Как работает сборщик мусора

    Выделение объектов в куче очень дорого, поэтому способ размещения всех объектов в Java также очень дорог. Однако сборщик мусора оказывает существенное влияние на повышение скорости создания объектов.

    • В некоторых виртуальных машинах Java реализация кучи эквивалентна конвейерной ленте: каждый раз, когда объект выделяется, он перемещается вперед на одну позицию, что означает, что хранилище объектов выделяется очень быстро.
    • Куча Java не совсем работает как конвейер.
    • По мере работы он высвобождает пространство и сжимает объекты в куче, так что «указатель кучи» можно легко переместить ближе к началу карусели и избежать ошибок страницы. Объекты переупорядочиваются сборщиком мусора для получения высокоскоростной модели кучи с бесконечным пространством для выделения.
  • Реализация сборщика мусора:

    Сборщик мусора основан на идее, что любой «живой» объект должен в конечном итоге быть отслежен до ссылки, которая существует в стеке или статическом хранилище.

    • Счетчики ссылок: простая, но медленная техника сборки мусора.

      Каждый объект имеет счетчик ссылок, который увеличивается на 1, когда к объекту присоединяется ссылка. Когда ссылка выходит за пределы области видимости или имеет значение null, счетчик ссылок уменьшается на 1. Сборщик мусора удобен для списка всех объектов, и когда счетчик ссылок объекта равен 0, он освобождает место, которое он занимает. Но циклическая ссылка приводит к тому, что «объект должен быть возвращен, но счетчик не равен 0».

      Подсчет ссылок не используется ни в одной реализации виртуальной машины Java.

    • остановись, скопируй:

      Сначала приостановить работу программы (не в режиме фоновой рециркуляции), а потом скопировать все уцелевшие объекты из текущей кучи в другую, все что не скопировано - мусор. При перемещении объекта из одного места в другое все ссылки на него должны быть зафиксированы. Ссылки, расположенные в куче или статическом хранилище, могут быть изменены напрямую, но есть и другие ссылки, которые указывают и могут быть найдены только в процессе обхода.

      В этом случае эффективность будет очень низкой. С одной стороны, ей нужно ходить туда-сюда между двумя отдельными кучами, с другой стороны, после того, как программа станет стабильной, она может генерировать лишь небольшое количество мусора или вообще не генерировать мусора, но все равно копировать всю память. из одного места в другое.

      Действие по сбору мусора не выполняется в фоновом режиме, и программа будет приостановлена, когда произойдет действие по сбору мусора.

      «Остановить копирование» требует, чтобы все уцелевшие объекты были скопированы из старой кучи в новую до освобождения старых. Это приведет к большому количеству операций копирования памяти.

    • отметить, очистить

      Начиная со стека и статического хранилища, пройдитесь по всем ссылкам, чтобы найти все живые объекты. Всякий раз, когда обнаруживается живой объект, объекту присваивается отметка, но в это время объекты не возвращаются. Уборка начинается только после завершения всех работ по разметке. Немаркированные будут освобождены, а отмеченные будут скопированы. Это должно быть сделано с приостановленной программой.

    • «Адаптивный сборщик мусора с генерацией, остановкой копирования, маркировкой и очисткой»

      • Выделение памяти выполняется большими «кусками», и если объект большой, он занимает отдельные куски. После использования блока сборщик мусора может копировать объекты в отброшенный блок при его сборе.
      • Каждый блок имеет соответствующийколичество поколенийчтобы записать, жив ли он еще.
      • Если на блок где-то ссылаются, номер его поколения увеличивается, и сборщик мусора очистит вновь выделенные блоки с момента последнего действия по сбору (хорошо для работы с большим количеством недолговечных временных объектов).
      • Сборщик мусора делает полную очистку через равные промежутки времени — крупные объекты по-прежнему не копируются (просто увеличивается их генерация), а те, которые содержат более мелкие объекты, копируются и сортируются.
      • Виртуальная машина java следит, и если все объекты стабильны, а эффективность работы сборщика мусора снижается, переключаемся на"отметить-подметать"Способ;
      • Виртуальная машина Java отслеживает эффект «отметки-развертки», и если в пространстве кучи большая фрагментация, она переключится на"остановить копирование"Способ;Переключение разными способами в зависимости от ситуации называется «адаптивной» технологией.

5.7 Инициализация конструктора

  • Переменные в классе инициализируются перед конструктором

  • Независимо от того, сколько объектов создается, статические данные занимают только одну область хранения.

  • Статический ключ нельзя применять к локальным переменным, только к областям.

  • Если это поле статического базового типа и оно не инициализировано, то оно получит стандартное начальное значение базового типа.

    Если это ссылка на объект, ее начальное значение по умолчанию равно null.

  • Время инициализации статического хранилища:

    Статические члены в классе загружаются по мере загрузки класса, например, при создании объекта или при ссылке на него!

    Статические члены в классе загружаются по мере загрузки класса, например, при создании объекта или при ссылке на него!

    Статические члены в классе загружаются по мере загрузки класса, например, при создании объекта или при ссылке на него!

  • Порядок инициализации: сначала статические объекты, затем «нестатические» объекты.

  • процесс создания объекта

    1. Если статический метод не используется явно, конструктор фактически является статическим методом.Когда объект создается или к статическому методу/статическому полю класса обращаются в первый раз, интерпретатор Java находит путь к классу, а затем находит файл . файл класса.
    2. При загрузке файла .class выполняются все действия, связанные со статической инициализацией. Поэтому файл статической инициализации выполняется только один раз при первой загрузке объекта Class.
    3. При создании с помощью new() для объекта в куче будет выделено достаточно места.
    4. Это пространство для хранения будет обнулено, для всех основных данных будут установлены значения по умолчанию, а для ссылок будет установлено значение null.
    5. Выполняет все действия по инициализации, которые происходят в определениях полей.
    6. Выполнить конструктор.

5.10 Резюме

  • Конструкторы гарантируют правильную инициализацию и очистку (без надлежащих вызовов конструктора компилятор не позволит создавать объекты), поэтому полный контроль над ними безопасен.
  • Сборщик мусора автоматически освобождает память для объектов, поэтому во многих случаях подобные методы очистки в Java не нужны.
  • Сборщик мусора Java может значительно упростить программирование и быть более безопасным при работе с памятью.

【Рекомендация】- Примечания по расположению содержания книги адрес ссылки
【Рекомендации】【Идеи программирования на Java】【Примечания】 nuggets.capable/post/684490…
[Рекомендация] [Основная технология Java, том I] [Примечания] nuggets.capable/post/684490…

Продолжение обновления позже. . . . . .

Если есть какие-либо ошибки в письме, пожалуйста, оставьте сообщение, я надеюсь, что мы сможем добиться прогресса вместе и усердно работать вместе! 😜😜