«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.