1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-thinking-in-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
2.3 绝对不要清除对象.md 6.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:15 d56454c

2.3 Никогда не освобождайте объекты

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

2.3.1 Область видимости

Большинство языков программирования предоставляют концепцию области видимости. Для имени, определённого в области видимости, область одновременно определяет его видимость и время существования. В C, C++ и Java области видимости определяются положением фигурных скобок. Рассмотрим пример:

{ 
int x = 12; 
/* доступна только x */ 
{ 
int q = 96; 
/* доступны x и q */ 
} 
/* доступна только x */ 
/* q "за пределами области видимости" */ 
} 

Как переменная, определённая в области видимости, она может использоваться только до окончания этой области видимости.

В приведённом выше примере отступы делают Java-код более читаемым. Поскольку Java является свободно форматируемым языком, дополнительные пробелы, табуляция и переходы строки не влияют на конечный код программы.Обратите внимание, что хотя такой код допустим в C и C++, он недопустим в Java:

{
    int x = 12;
    {
        int x = 96; /* Недопустимо */
    }
}

Компилятор будет считать, что переменная x уже была определена. Поэтому в C и C++ можно было бы "скрывать" одну переменную внутри другой области видимости. Однако это недопустимо в Java, так как дизайнеры этого языка считают, что такое поведение усложняет понимание программы.

2.3.2 Область видимости объектов

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

{
    String s = new String("строка");
} /* Конец области видимости */
```То есть ссылка `s` исчезнет при достижении конца области видимости. Тем не менее, объект `String`, на который указывает `s`, всё ещё будет занимать место в памяти. В данном случае нет возможности получить доступ к этому объекту, поскольку единственная ссылка на него выходит за пределы области видимости. В последующих главах будут рассмотрены способы передачи и копирования ссылок на объекты во время выполнения программы. Результатом этого является то, что объекты, созданные с помощью `new`, будут продолжать существовать до тех пор, пока мы сами их не освободим. Эта проблема особенно актуальна в C и C++. В случае с C++, она становится наиболее сложной: поскольку язык не предоставляет никакой помощи, невозможно гарантировать доступность объектов, когда они нужны. Более того, в C++ после завершения работы обязательно требуется очистка объектов. Это приводит к интересному вопросу. Как Java позволяет объектам существовать без ограничений, как можно предотвратить их накопление в памяти и последующее "залипание" программы? В C++, этот вопрос является наиболее болезненным для программистов. Однако с появлением Java ситуация изменилась. У Java есть специальный "управляемый сборщик мусора", который просматривает все объекты, созданные с помощью `new`, и определяет, какие из них больше не используются.Затем он автоматически освобождает память, занятую этими невостребованными объектами, чтобы она могла использоваться новыми объектами. Это означает, что нам не нужно беспокоиться о процессах очистки памяти. Мы просто создаем объекты, а когда они больше не нужны, они автоматически удаляются. Таким образом, мы можем избежать одной из самых распространённых проблем программирования в C++ — ошибки "переполнение памяти", вызванной забывчивостью программиста при освобождении памяти.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-thinking-in-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-thinking-in-java-zh.git
oschina-mirror
wizardforcel-thinking-in-java-zh
wizardforcel-thinking-in-java-zh
master