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

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

· 4 мин. чтения

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 .