Рубрики

Можем ли мы переопределить частные методы в Java?

Давайте сначала рассмотрим следующую Java-программу как простой пример переопределения или полиморфизма времени выполнения.

class Base {

  public void fun() {

     System.out.println("Base fun");     

  }

}

    

class Derived extends Base {

  public void fun() {  // переопределяет fun базы ()

     System.out.println("Derived fun");  

  }

  public static void main(String[] args) {

      Base obj = new Derived();

      obj.fun();

  }  

}

Программа печатает «Производное веселье».
Ссылка на базовый класс 'obj' относится к объекту производного класса (см. Выражение «Base obj = new Derived ()»). Когда fun () вызывается для obj, вызов выполняется в соответствии с типом ссылаемого объекта, а не в соответствии с ссылкой.

Возможен ли Overiding с помощью частных методов?
Прогнозировать вывод следующей программы.

class Base {

  private void fun() {

     System.out.println("Base fun");     

  }

}

    

class Derived extends Base {

  private void fun() {

     System.out.println("Derived fun");  

  }

  public static void main(String[] args) {

      Base obj = new Derived();

      obj.fun();

  }  

}

Мы получаем ошибку компилятора «у fun () есть частный доступ в Base» (см. Это ). Таким образом, компилятор пытается вызвать функцию базового класса, а не производный класс, что означает, что fun () не переопределяется.

Внутренний класс может получить доступ к закрытым членам своего внешнего класса. Что если мы расширим внутренний класс и создадим fun () во внутреннем классе?
Классы Inner могут обращаться к закрытым членам своего внешнего класса, например, в следующей программе fun () из Inner обращается к частному элементу данных msg, что хорошо для компилятора.

/ * Java-программа, чтобы продемонстрировать, можем ли мы переопределить закрытый метод

   внешнего класса внутри его внутреннего класса * /

class Outer {

     private String msg = "GeeksforGeeks";

     private void fun() {

          System.out.println("Outer fun()");

     }

  

     class Inner extends Outer {

         private void fun()  {

               System.out.println("Accessing Private Member of Outer: " + msg);

         }

     }

  

     public static void main(String args[])  {

  

          // Для создания экземпляра класса Inner нам нужен Outer

          // экземпляр класса. Итак, сначала создайте экземпляр класса Outer, а затем

          // внутренний экземпляр класса.

          Outer o = new Outer();

          Inner  i   = o.new Inner();

            

          // Это вызовет удовольствие Иннера, цель этого вызова -

          // показать, что приватные члены Outer могут быть доступны во Inner.

          i.fun();  

  

          // o.fun () вызывает удовольствие Аутера (без полиморфизма во время выполнения).

          o = i; 

          o.fun();

     }

}

Выход:

Accessing Private Member of Outer: GeeksforGeeks
Outer fun()

В приведенной выше программе мы создали внешний класс и внутренний класс. Мы расширили Inner из Outer и создали метод fun () для Outer и Inner. Если мы наблюдаем наш вывод, то ясно, что метод fun () не был переопределен. Это происходит потому, что частные методы связаны во время компиляции, и именно тип ссылочной переменной, а не тип объекта, на который она ссылается, определяет, какой метод вызывать. , В качестве примечания, частные методы могут быть лучше с точки зрения производительности (по сравнению с не частными и не конечными методами) из-за статического связывания.

Сравнение с C ++
1) В Java внутреннему классу разрешен доступ к закрытым данным членов внешнего класса. Это поведение аналогично C ++ (см. Это ).
2) В Java методы, объявленные как private, никогда не могут быть переопределены, они фактически ограничены во время компиляции. Это поведение отличается от C ++. В C ++ у нас могут быть виртуальные частные методы (см. Это ).

Эта статья предоставлена Чандрой Пракаш . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Можем ли мы переопределить частные методы в Java?

0.00 (0%) 0 votes