1. Введение
В этом уроке мы узнаем о сокрытии переменных и методов в языке Java .
Во-первых, мы поймем концепцию и цель каждого из этих сценариев. После этого мы углубимся в варианты использования и рассмотрим различные примеры.
2. Скрытие переменных
Сокрытие переменных происходит, когда мы объявляем свойство в локальной области видимости, имеющее то же имя, что и свойство, которое уже есть во внешней области.
Прежде чем перейти к примерам, давайте кратко повторим возможные области видимости переменных в Java. Мы можем определить их по следующим категориям:
- локальные переменные — объявляются в фрагменте кода, таком как методы, конструкторы, в любом блоке кода с фигурными скобками
- переменные экземпляра — определены внутри класса и принадлежат экземпляру объекта
- классовые или
статические
переменные — объявляются в классе с ключевым словомstatic
. Они имеют область действия на уровне класса.
Теперь опишем скрытие на примерах для каждой отдельной категории переменных.
2.1. Сила местного
Давайте посмотрим на класс 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);
}
}
Здесь у нас есть переменная сообщения
, объявленная в 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 .