Перейти к содержимому

Как изменить все переменные с одинаковым именем visual studio

  • автор:

Рефакторинг для синхронизации типа с именем файла или имени файла с типом

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

Область применения этого рефакторинга:

Что? Вы можете переименовать тип в соответствии с именем файла или изменить имя файла в соответствии с типом, который он содержит.

Когда? Вы переименовали файл или тип и еще не обновили их в соответствии с их именами.

Зачем? Если поместить тип в файл с другим именем (или наоборот), вам трудно будет найти нужный файл или тип. Если переименовать тип или файл, будет проще читать код и удобнее переходить по нему.

Этот рефакторинг пока недоступен для проектов .NET Standard и .NET Core.

Практические советы

  1. Выделите имя типа, который требуется синхронизировать, или поместите в него текстовый курсор.
    • C#: Highlighted code - C#
    • Visual Basic: Highlighted code - Visual Basic
  2. Затем выполните одно из следующих действий.
    • Клавиатура
      • Нажмите клавиши CTRL +. Чтобы активировать меню «Быстрые действия» и «Рефакторинг» и выберите «Переименовать файл в TypeName.cs» во всплывающем окне предварительного просмотра, где TypeName — имя выбранного типа.
      • Нажмите клавиши CTRL+. Чтобы активировать меню «Быстрые действия» и «Рефакторинг» и выберите «Переименовать тип в имяфайла» во всплывающем окне предварительного просмотра, где имя файла — имя текущего файла.
    • Мышь
      • Щелкните код правой кнопкой мыши и выберите меню Быстрые действия и рефакторинг. Затем во всплывающем окне предварительного просмотра выберите пункт Переименовать файл в имя_типа.cs, где имя_типа — это имя выбранного вами типа.
      • Щелкните код правой кнопкой мыши и выберите меню Быстрые действия и рефакторинг. Затем во всплывающем окне предварительного просмотра выберите пункт Переименовать тип в имя_файла, где имя_файла — это имя текущего файла.

Тип или файл переименован.

  • C#: в примере ниже файл MyClass.cs переименован в MyNewClass.cs, чтобы его имя совпадало с именем типа. Inline result C#
  • Visual Basic: в примере ниже файл Employee.cs был переименован в Person.cs, чтобы его имя совпадало с именем типа. Inline result Visual Basic

Использование точек останова в отладчике Visual Studio

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

Точки останова — это один из важнейших инструментов разработчика для выполнения отладки. Точки останова устанавливаются везде, где нужно приостановить выполнение отладчика. Например, вы хотите просмотреть состояние переменных кода или стек вызовов в определенной точке останова. Если вы пытаетесь разрешить предупреждение или проблему при использовании точек останова, см. раздел Устранение неполадок точек останова в отладчике Visual Studio.

Если вам известна задача или проблема, которую вы пытаетесь решить, но вы не знаете, какой тип точки останова следует использовать, см. статью Часто задаваемые вопросы. Поиск нужной функции отладки в Visual Studio.

Установка точек останова в исходном коде

Можно установить точку останова в любой строке исполняемого кода. Например, в следующем коде C# можно задать точку останова в строке кода с присвоением значения переменной ( int testInt = 1 ), в цикле for или любом коде в цикле for . Точка останова не может быть задана в сигнатурах метода, объявлениях пространства имен или класса, а также в объявлениях переменной, не содержащих присваивания и методов задания или получения.

Чтобы задать точку останова в исходном коде, сделайте следующее:

  • Щелкните в крайнем левом поле рядом с строкой кода. Можно также выбрать строку и нажать клавишу F9, выбрать команду Отладка>Переключить точку останова или щелкнуть правой кнопкой мыши и выбрать команду Точка останова>Вставить точку останова. В месте установки точки останова в левом поле появится красная точка.

Для большинства языков, включая C#, точка останова и текущие строки выполнения выделяются автоматически. Для кода C++ можно включить выделение точек останова и текущих строк, выбрав Инструменты (или Отладка) >Параметры>Отладка>Выделить всю исходную строку для точек останова и текущий оператор (только C++).

Set a breakpoint

Set a breakpoint

При отладке выполнение приостанавливается в точке останова до выполнения кода в этой строке. Символ точки останова отображается с желтой стрелкой.

В точке останова в следующем примере значение testInt по-прежнему равно 3. Таким образом, значение не изменялось с момента инициализации переменной (задания значения 3), так как инструкция, выделенная желтым, еще не была выполнена.

Breakpoint execution stopped

В точке останова в следующем примере значение testInt по-прежнему равно 1. Таким образом, значение не изменилось с момента инициализации переменной (значение 1), так как инструкция, выделенная желтым, еще не была выполнена.

Breakpoint execution stopped

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

Ниже приведены некоторые общие инструкции по работе с точками останова.

  • Точка останова представляет собой переключатель. Можно щелкнуть ее, нажать клавишу F9 или выбрать Отладка>Переключить точку останова, чтобы удалить или снова вставить ее.
  • Чтобы отключить точку останова, не удаляя ее, наведите указатель мыши на нее или щелкните ее правой кнопкой мыши и выберите Отключить точку останова. Отключенные точки останова отображаются как пустые точки в левом поле или окне Точки останова. Чтобы повторно включить точку останова, наведите указатель мыши на нее или щелкните ее правой кнопкой мыши и выберите Включить точку останова.
  • Задайте условия и действия, добавьте и измените метки или экспортируйте точку останова, щелкнув ее правой кнопкой мыши и выбрав нужную команду или наведя на нее курсор и нажав на значок Параметры.

Действия и точки трассировки точки останова

Точка трассировки — это точка останова, которая выводит сообщение в окно вывода. Точка трассировки может играть роль временного оператора трассировки в языке программирования и не приостанавливает выполнение кода. Вы создаете точку трассировки, задавая особое действие в окне Параметры точки останова. Подробные инструкции см. в разделе Использование точек трассировки в отладчике Visual Studio.

Условия точки останова

Можно управлять тем, где и когда выполняется точка останова, задавая условия. Условие может быть любым допустимым выражением, которое распознает отладчик. Дополнительные сведения о допустимых выражениях см. в разделе Выражения в отладчике.

Задание условия для точки останова.

    Щелкните правой кнопкой мыши символ точки останова и выберите пункт Условия (или нажмите клавиши ALT + F9, C). Или наведите курсор на символ точки останова, выберите значок Параметры, а затем выберите Условия в окне Параметры точки останова.

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

Можно также задать условия в окне Точки останова, щелкнув правой кнопкой мыши точку останова и выбрав пункт Параметры, а затем Условия.

Breakpoint settings

Breakpoint settings

Точки останова с установленными условиями отображаются с символом + в исходном коде и окне Точки останова.

Создание условного выражения

При выборе условного выражения можно выбрать между двумя условиями: значение true или при изменении. Выберите значение Имеет значение true, чтобы прервать выполнение при истинности выражения, или значение При изменении, если требуется прервать выполнение при изменении значения выражения.

В следующем примере задается применение точки останова, только если значение testInt равно 4:

Breakpoint condition is true

Breakpoint condition is true

В следующем примере задается применение точки останова, только если значение testInt меняется:

Breakpoint When changed

Breakpoint When changed

Если условие точки останова имеет недопустимый синтаксис, появится предупреждающее сообщение. Если указать условие для точки останова с недопустимой семантикой, но допустимым синтаксисом, предупреждающее сообщение появится при достижении точки останова в первый раз. В любом случае отладчик прерывает выполнение при попадании на недопустимую точку останова. Точка останова пропускается, только если условие допустимо и принимает значение false .

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

Использование идентификаторов объектов в условных выражениях (только C# и F#)

Иногда возникает необходимость наблюдать за поведением определенного объекта. Например, может потребоваться выяснить, почему объект был вставлен в коллекцию несколько раз. В C# и F# можно создавать идентификаторы объектов для определенных экземпляров ссылочных типов и использовать их в условиях точек останова. Идентификатор объекта создается службами отладки среды CLR и связан с объектом.

Создание идентификатора объекта

  1. Установите точку останова в коде после создания объекта.
  2. Запустите отладку и, когда выполнение приостановится на точке останова, выберите Отладка>Windows>Локальные (или нажмите клавиши CTRL + ALT + V, L), чтобы открыть окно Локальные. Найдите конкретный экземпляр объекта в окне Локальные, щелкните его правой кнопкой мыши и выберите Сделать идентификатор объекта. В окне $ вы должны увидеть символ Локальные . Это и есть идентификатор объекта.
  3. Добавьте новую точку останова в точке, которую нужно исследовать, например в точке добавления объекта в коллекцию. Щелкните правой кнопкой мыши точку останова и выберите пункт Условие.
  4. Используйте идентификатор объекта в поле Условное выражение. Например, если переменная item является объектом, который должен быть добавлен в коллекцию, выберите Is true и введите item == $ , где — идентификатор объекта. Выполнение прервется в точке добавления объекта в коллекцию. Чтобы удалить идентификатор объекта, щелкните правой кнопкой мыши переменную в окне Локальные и выберите пункт Удалить идентификатор объекта.

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

Установка условия количества обращений

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

В разделе Условия в окне Параметры точки останова выберите Количество обращений, а затем укажите число итераций. В следующем примере задается выполнение точки останова при каждой второй итерации:

Breakpoint hit count

Breakpoint hit count

Задание условия фильтра

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

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

  • MachineName = «имя»
  • ProcessId = значение
  • ProcessName = «имя»
  • ThreadId = значение
  • ThreadName = «имя»

Значения строк следует заключить в двойные кавычки. Для комбинации условий можно использовать знаки & (И), || (ИЛИ), ! (НЕ) и скобки.

Установка точек останова функции

Выполнение можно прерывать при вызове функции. Это полезно, например, если известно имя функции, но не ее расположение. Это также полезно, если у вас есть функции с одинаковым именем и вы хотите приостановить их все (например, перегруженные функции или функции в разных проектах).

Установка точки останова функции:

  1. Выберите Отладка>Создать точку останова>Точка останова функции или нажмите клавиши CTRL + K, B. Можно также выбрать Создать>Точка останова функции в окне Точки останова.
  2. В диалоговом окне Новая точка останова функции заполните поле Имя функции. Чтобы уточнить функцию, сделайте следующее.
    • Используйте полное имя функции. Пример: Namespace1.ClassX.MethodA()
    • Добавьте типы параметров перегруженной функции. Пример: MethodA(int, string)
    • Используйте символ «!», чтобы указать модуль. Пример: App1.dll!MethodA
    • Используйте оператор контекста в машинном коде C++. [+] Пример: +2
  3. В раскрывающемся списке Язык выберите язык функции.
  4. Нажмите ОК.

Задание точки останова функции по адресу памяти (только в машинном коде C++)

Вы можете использовать адрес объекта, чтобы установить точку останова функции в методе, вызываемом для конкретного экземпляра класса. Например, если имеется адресуемый объект типа my_class , вы можете задать точку останова функции в методе my_method , вызываемом экземпляром.

  1. Установите точку останова после создания экземпляра класса.
  2. Найдите адрес экземпляра (например, 0xcccccccc ).
  3. Выберите Отладка>Создать точку останова>Точка останова функции или нажмите клавиши CTRL + K, B.
  4. В поле Имя функции добавьте следующий текст и выберите язык C++.

((my_class *) 0xcccccccc)->my_method 

Задание точек останова в данных (.NET Core 3.x или .NET 5 или более поздних версий)

Точки останова в данных прерывают выполнение при изменении свойства конкретного объекта.

Задание точки останова в данных

Managed Data Breakpoint

  1. В проекте .NET Core начните отладку и подождите, пока не будет достигнута точка останова.
  2. В окне Видимые, Контрольные значения или Локальные щелкните правой кнопкой мыши свойство и выберите Прервать выполнение при изменении значения в контекстном меню.

Точки останова в данных в .NET Core не будут работать для следующих элементов:

  • Свойства, которые не могут быть расширены в подсказках, окнах «Локальные», «Видимые» или «Контрольные значения»
  • Статические переменные
  • Классы с атрибутом DebuggerTypeProxy
  • Поля внутри структур

Задание точек останова в данных (только машинный код C++)

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

Задание точки останова в данных

  1. В проекте C++ начните отладку и подождите, пока не будет достигнута точка останова. В меню Отладка выберите команду Создать точку останова>Точка останова в данных. Можно также выбрать Создать>Точка останова в данных в окне Точки останова или щелкнуть правой кнопкой мыши элемент Видимые, Контрольные значения или Локальные и выбрать Прервать выполнение при изменении значения в контекстном меню.
  2. В поле Адрес введите адрес памяти или выражение, результатом вычисления которого будет адрес памяти. Например, для прерывания при изменении содержимого переменной &avar введите avar .
  3. В раскрывающемся списке Счетчик байтов введите количество байтов, за которыми должен наблюдать отладчик. Например, если выбрать 4, отладчик будет наблюдать за четырьмя байтами начиная с &avar и выполнит прерывание, если какой-либо из этих байтов изменит значение.

Точки останова в данных не работают при следующих условиях.

  • Процесс, для которого не выполняется отладка, производит запись в область памяти.
  • Область памяти совместно используется двумя или более процессами.
  • Область памяти обновляется в ядре. Например, если память передается в функцию ReadFile 32-разрядной версии Windows, то память будет обновляться из режима ядра и отладчик не будет прерывать выполнение при обновлении.
  • Контрольное значение превышает 4 байта на 32-разрядном оборудовании и 8 байт на 64-разрядном оборудовании. Это ограничение архитектуры x86.
  • Точки останова в данных зависят от конкретных адресов памяти. Адрес переменной меняется между сеансами отладки, поэтому точки останова в данных автоматически отключаются в конце каждого сеанса отладки.
  • Если установить точку останова по данным на локальную переменную, точка останова остается включенной при завершении выполнения функции, но адрес памяти больше не применяется, поэтому поведение точки останова будет непредсказуемым. Если установить точку останова в данных на локальную переменную, рекомендуется удалить или отключить точку останова до окончания функции.

Добавление зависимой точки останова

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

Чтобы задать зависимую точку останова, сделайте следующее:

  1. Наведите указатель мыши на символ точки останова, щелкните значок Параметры, а затем выберите Включить только при срабатывании следующей точки останова в окне «Параметры точек останова».
  2. В раскрывающемся списке выберите необходимую точку останова, от которой будет зависеть текущая точка останова.

Dependent Breakpoint

Выберите Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно «Параметры точки останова». Или в окне «Точки останова» выберите ОК, чтобы закрыть диалоговое окно.

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

Dependentbreakpoint context

  1. Щелкните правой кнопкой мыши в крайнем левом поле рядом со строкой кода и выберите в контекстном меню пункт Вставить зависимую точку останова.
  • Зависимые точки останова не работают, если в приложении присутствует только одна точка останова.
  • Зависимые точки останова преобразуются в обычные точки останова, если предварительная условная точка останова была удалена.

Добавление временной точки останова

Такая точка останова позволяет прервать выполнение кода только единожды. Отладчик Visual Studio приостанавливает выполняющееся приложение только один раз для этой точки, а после срабатывания немедленно удаляет ее.

Чтобы задать временную точку останова, сделайте следующее:

Temporary breakpoint

  1. Наведите указатель мыши на символ точки останова, щелкните значок Параметры, а затем выберите Удалить точку останова после срабатывания в окне «Параметры точек останова».
  2. Выберите Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно «Параметры точки останова». Или в окне «Точки останова» выберите ОК, чтобы закрыть диалоговое окно.

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

Temporary breakpoint context

  1. Щелкните правой кнопкой мыши в крайнем левом поле рядом со строкой кода и выберите в контекстном меню пункт Вставить временную точку останова.

Или просто используйте сочетание клавиш F9 + SHIFT+ ALT, T и задайте временную точку останова в строке.

Управление точками останова в окне точек останова

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

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

Чтобы открыть окно Точки останова, выберите Отладка>Windows>Точки останова или нажмите клавиши CTRL+ALT+B.

Breakpoints window

Breakpoints window

Чтобы выбрать столбцы для отображения в окне Точки останова, выберите Показать столбцы. Выберите заголовок столбца, чтобы отсортировать список точек останова по этому столбцу.

Метки точки останова

Используйте метки для сортировки и фильтрации списка точек останова в окне Точки останова.

  1. Чтобы добавить метку к точке останова, щелкните правой кнопкой мыши точку останова в исходном коде или в окне Точки останова, а затем выберите Изменить метки. Добавьте новую метку или выберите существующую, а затем выберите ОК.
  2. Отсортируйте список точек останова в окне Точки останова, выбрав Метки, Условия или другие заголовки столбцов. Можно выбрать отображаемые столбцы, нажав Показать столбцы на панели инструментов.

Экспорт и импорт точек останова

Чтобы сохранить или предоставить состояние и расположение точек останова, их можно экспортировать или импортировать.

  • Чтобы экспортировать одну точку останова в XML-файл, щелкните правой кнопкой мыши точку останова в исходном коде или окне Точки останова и выберите Экспорт или Экспорт выбранных. Выберите расположение экспорта и щелкните Сохранить. Расположением по умолчанию является папка решения.
  • Чтобы экспортировать несколько точек останова, в окне Точки останова установите флажки рядом с точками останова или введите условия поиска в поле поиска. Нажмите на значок Экспортировать все точки останова, соответствующие текущим критериям поиска и сохраните файл.
  • Чтобы экспортировать все точки останова, снимите все флажки и оставьте поле поиска пустым. Нажмите на значок Экспортировать все точки останова, соответствующие текущим критериям поиска и сохраните файл.
  • Чтобы импортировать точки останова, в окне Точки останова выберите значок Импортировать точки останова из файла, перейдите к расположению XML-файла и нажмите Открыть.

Установка точек останова из окон отладчика

Можно также задать точки останова из окон отладчика Стек вызовов и Дизассемблирование.

Задание точки останова в окне стека вызовов

Чтобы прервать выполнение на инструкции или строке, к которой возвращается вызывающая функция, установите соответствующую точку останова в окне Стек вызовов.

Задание точки останова в окне стека вызовов

  1. Чтобы открыть окно Стек вызовов, необходимо приостановить процесс отладки. Выберите Отладка>Windows>Стек вызовов или нажмите клавиши CTRL+ALT+C.
  2. В окне Стек вызовов щелкните правой кнопкой мыши вызывающую функцию и выберите Точка останова>Вставить точку останова или нажмите F9. В левом поле стека вызовов рядом с именем вызова функции появится символ точки останова.

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

Отладчик приостанавливает выполнение на этой инструкции.

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

Задание точки останова в окне дизассемблирования

  1. Чтобы открыть окно Дизассемблирование, необходимо приостановить процесс отладки. Выберите Отладка>Windows>Дизассемблирование или нажмите клавиши CTRL+ALT+D.
  2. В окне Дизассемблирование щелкните в левом поле инструкции, на которой нужно прервать выполнение. Можно также выбрать строку и нажать клавишу F9 или щелкнуть правой кнопкой мыши и выбрать Точка останова>Вставить точку останова.

См. также

  • Что такое отладка?
  • Улучшение кода C# с помощью Visual Studio
  • Первое знакомство с отладкой
  • Устранение неполадок с точками останова в отладчике Visual Studio

Как изменить все переменные с одинаковым именем visual studio

Скачать FL Studio 20 бесплатно на Русском языке

Изменить все переменные с одинаковым именем в Visual Studio можно следуя этим шагам:

1. Откройте проект в Visual Studio.
2. Перейдите к файлу, в котором находятся переменные с одинаковым именем.
3. Используйте функцию поиска и замены для глобального изменения переменных. Нажмите `Ctrl + F`, чтобы открыть окно поиска.
4. В поле поиска введите имя переменной, которую вы хотите изменить.
5. Нажмите на кнопку Заменить или Заменить все на панели инструментов поиска (или нажмите `Ctrl + H`, чтобы открыть окно Найти и заменить).
6. В поле Заменить на введите новое имя переменной.
7. Нажмите на кнопку Заменить или Заменить все для выполнения замены.
8. Повторите шаги 4-7 для всех файлов в проекте, в которых есть переменные с одинаковым именем.

Полезные советы:

— При изменении переменных обратите внимание на контекст использования переменной и убедитесь, что изменение имени не повлияет на работу программы.
— Перед выполнением замены сделайте резервную копию проекта или файлов, чтобы в случае ошибки можно было вернуться к предыдущему состоянию.
— Если проект содержит множество файлов и вы не хотите искать и заменять в каждом файле вручную, воспользуйтесь функциональностью Замена в файлах (Find in Files) в Visual Studio.

Сокрытие и затенение переменных в Java

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

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

Введение

Рассмотрим нижеприведенный пример, где определяется две переменные с именем id. Можно предположить, что следующая программа выбросит ошибку, так как мы объявили две переменные с одним и тем же именем id. Но, к счастью, никаких ошибок не возникнет, а мы получим вывод 5678. Хотя обе переменные и имеют одно и то же имя id, они объявляются в разных областях видимости: одна в глобальной, а другая в локальной.

Переменная id в глобальной области видимости доступна из любой точки внутри класса, тогда как переменная id в локальной области видимости доступна только из метода main(). Вывод равен 5678, поскольку здесь происходит затенение переменной: переменная id внутри метода main() «заслоняет» глобальную переменную id и использует собственное значение.

class Main < // глобальная область видимости String ; public static void main(String[] args) < // локальная область видимости String ; System.out.println(id); >> 

Вывод

5678

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

  • Локальные переменные
  • Переменные экземпляра
  • Глобальные переменные

Локальные переменные

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

public int findSum(int[] arr) < // локальная переменная int sum = 0; for (final int j : arr) < sum += j; >return sum; > 

В этом примере sum – это локальная переменная, так как она объявлена внутри метода findSum(), и извне этого метода к ней обратиться нельзя.

Переменные экземпляра

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

class Student < // переменная экземпляра private final String name; public Student(String name) < this.name = name; >public String getName() < return this.name; >> 

В данном примере name – это переменная экземпляра, поскольку она объявляется внутри класса, но вне метода. Новая переменная name создается для всех вновь создаваемых объектов Student.

Переменные класса

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

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

class Variable < // переменная класса static int classVariable; int instanceVariable; public Compare() < int localVariable; >> 

В данном примере classVariable – это переменная класса, так как она объявляется внутри класса, но вне метода, и при этом объявляется как статическая. Переменная classVariable совместно используется всеми созданными объектами Variable.

Что такое затенение переменных?

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

Пример затемнения переменных

В примере, приведенном ниже, у нас две переменные с именем name. Одна из них находится внутри метода print() (внутренняя область видимости), а другая внутри класса Student (внешняя область видимости). Метод print выводит имя Steve Rogers, а не Tony Stark, поскольку имя локальной переменной внутри метода print() (это внутренняя область видимости) затемняет переменную экземпляра name, находящуюся внутри класса Student (внешняя область видимости). Поэтому на экран выводится значение затеняющей переменной – той, что находится в методе print().

class Student < // переменная экземпляра String name = "Tony Stark"; public void print() < // локальная переменная String name = "Steve Rogers"; System.out.println(name); >> public class Main < public static void main(String[] args) < Student student = new Student(); student.print(); >>

Вывод

Steve Rogers

Затенение локальными переменными

Затенение локальными переменными происходит, когда локальная переменная (во внутренней области видимости) затемняет переменную экземпляра (во внешней области видимости).

class A < // переменная экземпляра int x = 1; public void display() < // локальная переменная int x = 2; System.out.println(x); System.out.println(this.x); >> public class Main < public static void main(String[] args) < A a = new A(); a.display(); >> 

Вывод

В данном примере у нас две переменных (одна внутри метода display(), а другая внутри класса A), которые объявлены с одним и тем же именем x. При выводе значения той x, что находится в методе display(). На экран выводится 2, так как локальная переменная x внутри метода display() затемняет переменную экземпляра x внутри класса A.

Затенение аргументом метода

Затенение аргументом метода происходит, когда параметр метода (внутренняя область видимости) затемняет переменную экземпляра (внешняя область видимости).

class A < // instance variable int x = 1; // method parameter public void display(int x) < System.out.println(x); System.out.println(this.x); >> public class Main < public static void main(String[] args) < A a = new A(); a.display(2); >> 

Вывод

В данном примере параметр метода display() и переменная экземпляра класса A имеют одинаковое имя x. Выводя значение того x, что находится внутри метода display(), видим на экране 2, так как параметр x метода display() затемняет переменную экземпляра x, находящуюся в классе A.

Что такое сокрытие переменной?

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

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

Пример сокрытия переменных

class Parent < String name = "ParentClass"; public void display() < System.out.println(name); >> class Child extends Parent < String name = "ChildClass"; @Override public void display() < System.out.println(name); >public void displayParent() < System.out.println(super.name); >> public class Main < public static void main(String[] args) < Child child = new Child(); child.display(); child.displayParent(); >> 

Вывод

ChildClass ParentClass

В данном примере показано, что переменная name в классе Child скрывает переменную name в классе Parent. Когда вызывается метод отображения в классе Child, он выводит на экран ChildClass. Ключевое слово super должно использоваться для доступу к переменной name в классе Parent.

Сокрытие в случае со статическими переменными

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

class Parent < static String ; static String name = "ParentClass"; public void displayName() < System.out.println(name); >public void displayId() < System.out.println(id); >> class Child extends Parent < static int static String name = "ChildClass"; @Override public void displayName() < System.out.println(name); >@Override public void displayId() < System.out.println(id); >> public class Main < public static void main(String[] args) < Parent parent = new Parent(); Child child = new Child(); parent.displayId(); parent.displayName(); child.displayId(); child.displayName(); >> 

Вывод

1 ParentClass 2 ChildClass

В данном примере и в классе Parent, и в классе Child есть две переменные класса с именами id и name. Хотя, переменные дочернего класса являются одноименными переменным родительского класса, методы displayId и displayName из дочернего класса выводят данные, относящиеся именно к этому классу. Здесь переменные класса Child скрывают переменные класса Parent. Сокрытие затрагивает даже переменную id, которая в родительском и дочернем классе является одноименной, но при этом в первом и втором случае соответствует разным типам.

Сокрытие нестатических переменных

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

class Parent < String name = "ParentClass"; public void displayName() < System.out.println(name); >> class Child extends Parent < String name = "ChildClass"; @Override public void displayName() < System.out.println(name); >> public class Main < public static void main(String[] args) < Parent parent = new Parent(); Child child = new Child(); parent.displayName(); child.displayName(); >> 

Вывод

ParentClass ChildClass

В данном примере как у класса Parent, так и у класса Child есть нестатическая переменная name. Переменная name в классе Child скрывает переменную name в родительском классе. Когда мы выводим на экран ту переменную name, что относится к методу displayName() класса Child, мы получаем ChildClass, а не ParentClass. Дело в том, что переменная name в классе Child скрывает значение той name, что находится в классе Parent, и использует собственное значение.

Сокрытие переменной – это не то же самое, что переопределение метода

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

class Parent < public void print() < System.out.println("I am Parent"); >> class Child extends Parent < @Override public void print() < System.out.println("I am Child"); >> public class Main < public static void main(String[] args) < Parent parent = new Parent(); Child child = new Child(); Parent childAsParent = new Child(); parent.displayName(); child.displayName(); childAsParent.displayName(); >>

Вывод

I am Parent I am Child I am Child

В данном примере класс Child переопределяет реализацию метода print из класса Parent (выводит I am Parent) собственной реализацией (выводит I am Child).

При сокрытии переменные дочернего класса скрывают только переменные родительского класса. С другой стороны, при переопределении методы дочернего класса заменяют методы родительского класса. Рассмотрим приведенный ниже пример, где объект childAsParent типа Parent указывает на объект типа Child.

class Parent < public String name = "ParentClass"; public void displayName() < System.out.println(name); >> class Child extends Parent < public String name = "ChildClass"; @Override public void displayName() < System.out.println(name); >> public class Main < public static void main(String[] args) < Parent childAsParent = new Child(); System.out.println(childAsParent.name); childAsParent.displayName(); >>

Вывод

ParentClass ChildClass

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

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

Как получить доступ к скрытой или затемненной переменной?

Доступ к затемненной переменной

Локальная переменная затемняет переменную экземпляра, если они одноименные. Ключевое слово this следует использовать для доступа к затемненной переменной экземпляра. В нижеприведенном примере инструкция System.out.println(this.name) выводит значение (Tony Stark), то есть, значение затемненной переменной экземпляра.

class Student < // переменная экземпляра String name = "Tony Stark"; public void print() < // локальная переменная String name = "Steve Rogers"; System.out.println(name); // выводит локальную переменную System.out.println(this.name); // выводит переменную экземпляра >> public class Main < public static void main(String[] args) < Student student = new Student(); student.print(); >>

Вывод

Steve Rogers Tony Stark

Доступ к скрытой переменной

Переменная дочернего класса скрывает переменную родительского класса, если они одноименные. Ключевое слово super следует использовать для доступа к скрытой переменной родительского класса. В нижеприведенном примере инструкция System.out.println(super.name) выводит значение (ParentClass) скрытой переменной экземпляра, относящейся к родительскому классу.

class Parent < String name = "ParentClass"; public void display() < System.out.println(name); >> class Child extends Parent < String name = "ChildClass"; @Override public void display() < System.out.println(name); System.out.println(super.name); >> public class Main1 < public static void main(String[] args) < Child child = new Child(); child.display(); >>

Вывод

ChildClass ParentClass

Разница между затенением и сокрытием переменных

Затенение переменной

Сокрытие переменной

Затенение переменной происходит, когда одноименными являются локальная переменная и переменная экземпляра в одном и том же классе

Сокрытие переменной происходит, когда переменная из дочернего класса одноименная переменной родительского класса

Затенение переменной происходит внутри класса

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

Заключение

  • Затенение переменной происходит, когда переменная во внутренней области видимости объявляется с тем же именем, что и переменная из внешней области видимости. Переменная из внешней области видимости затемняет переменную из внутренней области видимости.
  • Затенение локальной переменной происходит, когда локальная переменная во внутренней области видимости затемняет переменную экземпляра во внешней области видимости.
  • Затенение аргументом метода происходит, когда параметр метода затемняет переменную экземпляра.
  • Для доступа к затемненной переменной экземпляра используется ключевое слово this.
  • Сокрытие переменной происходит, когда переменная, объявленная в дочернем классе, имеет то же имя, что и переменная, объявленная в родительском классе.
  • К скрытой переменной из родительского класса можно обратиться при помощи ключевого слова super.
  • Сокрытие переменных – не то же самое, что переопределение метода, поскольку при сокрытии переменные дочернего класса просто прячут переменные родительского класса. В свою очередь, при переопределении метода дочерний класс заменяет реализации методов из родительского класса собственными реализациями.
  • Блог компании Издательский дом «Питер»
  • Программирование
  • Java
  • Проектирование и рефакторинг
  • ООП

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *