Рубрики
Без рубрики

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

Понять концепцию скрытия переменных и методов в Java.

Автор оригинала: baeldung.

1. введение

В этом уроке мы узнаем о скрытии переменных и методов в языке Java .

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

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

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

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

  • локальные переменные – объявляются в фрагменте кода, таком как методы, конструкторы, в любом блоке кода с фигурными скобками
  • переменные экземпляра – определяются внутри класса и принадлежат экземпляру объекта
  • класс или статические переменные – объявляются в классе с ключевым словом static . Они имеют область действия на уровне класса.

Теперь давайте опишем скрытие с примерами для каждой отдельной категории переменных.

2.1. Полномочия местных

Давайте взглянем на класс Hide Variable :

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 вызова извлекают локальные переменные.

Чтобы получить доступ к переменной экземпляра из локальной области, мы можем использовать это ключевое слово, как показано в методе print Instance Variable () .

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 , и предоставить методы getter/setter для этой цели.

3. Способ Скрытия

Скрытие метода может происходить в любой иерархической структуре java. Если дочерний класс определяет статический метод с той же сигнатурой, что и статический метод в родительском классе, то дочерний метод скрывает метод в родительском классе. Чтобы узнать больше о ключевом слове static , эта запись-хорошее место для начала.

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

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

public class BaseMethodClass {

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

Базовый класс метода имеет один статический метод |/print Message ().

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

public class ChildMethodClass extends BaseMethodClass {

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

Вот как это работает:

ChildMethodClass.printMessage();

Вывод после вызова метода printMessage() :

child static method

Дочерний класс метода.print Message() скрывает метод в Базовом классе метода .

3.1. Скрытие метода против переопределения

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

С другой стороны, скрытие методов работает со статическими. Поэтому он определяется во время компиляции .

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

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

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