«1. Введение
В этом уроке мы узнаем о сокрытии переменных и методов в языке Java.
Во-первых, мы поймем концепцию и цель каждого из этих сценариев. После этого мы углубимся в варианты использования и рассмотрим различные примеры.
2. Сокрытие переменных
Сокрытие переменных происходит, когда мы объявляем свойство в локальной области видимости, имеющее то же имя, что и уже имеющееся во внешней области.
Прежде чем перейти к примерам, давайте кратко повторим возможные области видимости переменных в Java. Мы можем определить их в следующих категориях:
-
локальные переменные — объявлены в фрагменте кода, таком как методы, конструкторы, в любом блоке кода с фигурными скобками переменные экземпляра — определены внутри класса и принадлежат экземпляр класса объекта или статические переменные — объявляются в классе с ключевым словом static. Они имеют область действия на уровне класса.
Теперь опишем скрытие на примерах для каждой отдельной категории переменных.
2.1. Сила Local
Давайте посмотрим на класс HideVariable:
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 вызова извлекают локальные переменные.
Чтобы получить доступ к переменной экземпляра из локальной области видимости, мы можем использовать это ключевое слово, как показано в методе printInstanceVariable().
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, и предоставить для этой цели методы получения/установки.
3. Скрытие методов
Скрытие методов может происходить в любой иерархической структуре в java. Когда дочерний класс определяет статический метод с той же сигнатурой, что и статический метод в родительском классе, то дочерний метод скрывает метод в родительском классе. Чтобы узнать больше о статическом ключевом слове, эта статья — хорошее место для начала.
Такое же поведение, связанное с методами экземпляра, называется переопределением метода. Чтобы узнать больше о переопределении метода, ознакомьтесь с нашим руководством здесь.
Теперь давайте посмотрим на этот практический пример:
public class BaseMethodClass {
public static void printMessage() {
System.out.println("base static method");
}
}
BaseMethodClass имеет единственный статический метод printMessage().
Далее создадим дочерний класс с той же сигнатурой, что и в базовом классе:
public class ChildMethodClass extends BaseMethodClass {
public static void printMessage() {
System.out.println("child static method");
}
}
Вот как это работает:
ChildMethodClass.printMessage();
Вывод после вызова метода printMessage():
child static method
ChildMethodClass.printMessage() скрывает метод в BaseMethodClass.
3.1. Скрытие методов и переопределение
Скрытие не работает так же, как переопределение, потому что статические методы не являются полиморфными. Переопределение происходит только с методами экземпляра. Он поддерживает позднее связывание, поэтому метод, который будет вызываться, определяется во время выполнения.
С другой стороны, скрытие методов работает со статическими. Поэтому он определяется во время компиляции.
4. Заключение
В этой статье мы рассмотрели концепцию сокрытия методов и переменных в Java. Мы показали разные сценарии сокрытия и затенения переменных. Важным моментом статьи также является сравнение переопределения и скрытия методов.
Как обычно, полный код доступен на GitHub.