Переменная и метод скрытия в Java

Переменная и метод, скрывающийся в Java

1. Вступление

В этом руководствеwe’re going to learn about variable and method hiding in the Java language.

Во-первых, мы поймем концепцию и цель каждого из этих сценариев. После этого мы рассмотрим варианты использования и рассмотрим различные примеры.

2. Скрытие переменных

Скрытие переменной происходит, когда мы объявляем свойство в локальной области видимости, имя которого совпадает с именем, которое у нас уже есть во внешней области.

Прежде чем перейти к примерам, давайте кратко рассмотрим возможные области видимости переменных в Java. Мы можем определить их со следующими категориями:

  • локальные переменные - объявлены в куске кода, такого как методы, конструкторы, в любом блоке кода с фигурными скобками

  • переменные экземпляра - определены внутри класса и принадлежат экземпляру объекта

  • class или переменныеstatic - объявляются в классе с ключевым словом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);
    }
}

Здесь у нас есть переменнаяmessage , объявленная в 4 разных местах. Локальные переменные, объявленные внутри конструктора и двух методов, скрывают переменную экземпляра.

Давайте проверим инициализацию объекта и вызов методов:

HideVariable variable = new HideVariable();
variable.printLocalVariable();

variable.printInstanceVariable();

Вывод кода выше:

constructor local variable
method local variable
this is instance variable

Здесь первые 2 вызова извлекают локальные переменные.

Чтобы получить доступ к переменной экземпляра из локальной области, мы можем использовать ключевое словоthis, как показано в методе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

In most cases, we should avoid creating variables with the same name both in parent and child classes. Вместо этого мы должны использовать соответствующий модификатор доступа, напримерprivate and, предоставляющий для этой цели методы получения / установки.

3. Метод скрытия

Скрытие метода может происходить в любой иерархической структуре в Java. Когда дочерний класс определяет статический метод с той же сигнатурой, что и статический метод в родительском классе, тогда дочерний методhidesявляется методом в родительском классе. Чтобы узнать больше о ключевом словеstatic,this write-up is a good place to start.

Такое же поведение, включающее методы экземпляра, называется переопределением метода. Чтобы узнать больше о переопределении метода, просмотрите нашguide here.

Теперь давайте посмотрим на этот практический пример:

public class BaseMethodClass {

    public static void printMessage() {
        System.out.println("base static method");
    }
}

BaseMethodClass имеет единственный методprintMessage() static.

Затем давайте создадим дочерний класс с той же сигнатурой, что и в базовом классе:

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. Скрытие метода против переопределения

Скрытие не работает как переопределение, потому что статические методы не полиморфны. Переопределение происходит только с методами экземпляра. Он поддерживает позднюю привязку, поэтому какой метод будет вызываться, определяется во время выполнения.

On the other hand, method hiding works with static ones. Therefore it’s determined at compile time.

4. Заключение

In this article, we went over the concept of method and variable hiding in Java. Мы показали разные сценарии переменных скрытия и теневого копирования. Важной изюминкой статьи также является сравнение метода переопределения и сокрытия.

Как обычно, доступен полный кодover on GitHub.