1. введение
В этом уроке мы узнаем о скрытии переменных и методов в языке Java .
Во-первых, мы поймем концепцию и цель каждого из этих сценариев. После этого мы погрузимся в примеры использования и рассмотрим различные примеры.
2. Скрытие переменных
Скрытие переменных происходит, когда мы объявляем свойство в локальной области, которое имеет то же имя, что и то, которое у нас уже есть во внешней области.
Прежде чем перейти к примерам, давайте кратко рассмотрим возможные области переменных в Java. Мы можем определить их с помощью следующих категорий:
- локальные переменные – объявляются в фрагменте кода, таком как методы, конструкторы, в любом блоке кода с фигурными скобками
- переменные экземпляра – определяются внутри класса и принадлежат экземпляру объекта
- класс или статические переменные – объявляются в классе с ключевым словом static . Они имеют область действия на уровне класса.
Теперь давайте опишем скрытие с примерами для каждой отдельной категории переменных.
2.1. Полномочия местных
Давайте взглянем на класс Hide Variable :
public class HideVariable { private String message = "this is instance variable"; HideVariable() { String message = "constructor local variable"; System.out.println(message); } public void printLocalVariable() { String message = "method local variable"; System.out.println(message); } public void printInstanceVariable() { String message = "method local variable"; System.out.println(this.message); } }
Здесь у нас есть переменная message , объявленная в 4 разных местах. Локальные переменные, объявленные внутри конструктора, и два метода затеняют переменную экземпляра.
Давайте проверим инициализацию объекта и вызов методов:
HideVariable variable = new HideVariable(); variable.printLocalVariable(); variable.printInstanceVariable();
Вывод приведенного выше кода является:
constructor local variable method local variable this is instance variable
Здесь первые 2 вызова извлекают локальные переменные.
Чтобы получить доступ к переменной экземпляра из локальной области, мы можем использовать это ключевое слово, как показано в методе print Instance Variable () .
2.2. Скрытие и иерархия
Аналогично, когда и дочерний, и родительский классы имеют переменную с одинаковым именем, переменная дочернего класса скрывает переменную от родителя.
Предположим, у нас есть родительский класс:
public class ParentVariable { String instanceVariable = "parent variable"; public void printInstanceVariable() { System.out.println(instanceVariable); } }
После этого мы определяем дочерний класс:
public class ChildVariable extends ParentVariable { String instanceVariable = "child variable"; public void printInstanceVariable() { System.out.println(instanceVariable); } }
Чтобы проверить это, давайте инициализируем два экземпляра. Один с родительским классом, а другой с дочерним, затем вызовите методы printInstanceVariable() для каждого из них:
ParentVariable parentVariable = new ParentVariable(); ParentVariable childVariable = new ChildVariable(); parentVariable.printInstanceVariable(); childVariable.printInstanceVariable();
Вывод показывает скрытие свойства:
parent variable child variable
В большинстве случаев нам следует избегать создания переменных с одинаковыми именами как в родительских, так и в дочерних классах . Вместо этого мы должны использовать соответствующий модификатор доступа, такой как private , и предоставить методы getter/setter для этой цели.
3. Способ Скрытия
Скрытие метода может происходить в любой иерархической структуре java. Если дочерний класс определяет статический метод с той же сигнатурой, что и статический метод в родительском классе, то дочерний метод скрывает метод в родительском классе. Чтобы узнать больше о ключевом слове static , эта запись-хорошее место для начала.
Такое же поведение, связанное с методами экземпляра, называется переопределением метода. Чтобы узнать больше о переопределении метода, ознакомьтесь с нашим руководством здесь .
Теперь давайте рассмотрим этот практический пример:
public class BaseMethodClass { public static void printMessage() { System.out.println("base static method"); } }
Базовый класс метода имеет один статический метод |/print Message ().
Далее давайте создадим дочерний класс с той же сигнатурой, что и в базовом классе:
public class ChildMethodClass extends BaseMethodClass { public static void printMessage() { System.out.println("child static method"); } }
Вот как это работает:
ChildMethodClass.printMessage();
Вывод после вызова метода printMessage() :
child static method
Дочерний класс метода.print Message() скрывает метод в Базовом классе метода .
3.1. Скрытие метода против переопределения
Скрытие не работает так же, как переопределение, потому что статические методы не являются полиморфными. Переопределение происходит только с методами экземпляра. Он поддерживает позднюю привязку, поэтому метод, который будет вызван, определяется во время выполнения.
С другой стороны, скрытие методов работает со статическими. Поэтому он определяется во время компиляции .
4. Заключение
В этой статье мы рассмотрели концепцию скрытия методов и переменных в Java . Мы показали различные сценарии скрытия и затенения переменных. Важным моментом статьи также является сравнение методов переопределения и скрытия.
Как обычно, полный код доступен на GitHub .