Рубрики

Можем ли мы перегрузить или переопределить статические методы в Java?

Давайте сначала определим перегрузку и переопределение.

Переопределение : Переопределение — это особенность языков ООП, таких как Java, которая связана с полиморфизмом во время выполнения. Подкласс (или производный класс) обеспечивает конкретную реализацию метода в суперклассе (или базовом классе).
Реализация, которая должна быть выполнена, определяется во время выполнения, и решение принимается в соответствии с объектом, используемым для вызова. Обратите внимание, что подписи обоих методов должны быть одинаковыми. Обратитесь Переопределение в Java для деталей.

Перегрузка : Перегрузка также является функцией языков ООП, таких как Java, которая связана с полиморфизмом времени компиляции (или статическим). Эта функция позволяет различным методам иметь одинаковые имена, но разные подписи, особенно количество входных параметров и тип входных параметров. Обратите внимание, что как в C ++, так и в Java методы не могут быть перегружены в соответствии с типом возвращаемого значения.

Можем ли мы перегрузить статические методы?
Ответ «Да». У нас может быть два или более статических метода с одинаковыми именами, но с различиями во входных параметрах. Например, рассмотрим следующую программу Java.

// имя файла Test.java

public class Test {

    public static void foo() {

        System.out.println("Test.foo() called ");

    }

    public static void foo(int a) { 

        System.out.println("Test.foo(int) called ");

    }

    public static void main(String args[])

    

        Test.foo();

        Test.foo(10);

    }

}

Выход:

Test.foo() called 
Test.foo(int) called 

Можем ли мы перегрузить методы, которые отличаются только статическим ключевым словом?
Мы не можем перегрузить два метода в Java, если они отличаются только статическим ключевым словом (количество параметров и типы параметров одинаковы). См. Следующую программу Java для примера. Такое же поведение в C ++ (см. Пункт 2 этого ).

// имя файла Test.java

public class Test {

    public static void foo() {

        System.out.println("Test.foo() called ");

    }

    public void foo() { // Ошибка компилятора: невозможно переопределить foo ()

        System.out.println("Test.foo(int) called ");

    }

    public static void main(String args[]) { 

        Test.foo();

    }

}

Вывод: ошибка компилятора, невозможно переопределить foo ()

Можем ли мы переопределить статические методы в Java?
Мы можем объявить статические методы с той же сигнатурой в подклассе, но это не считается переопределением, так как не будет никакого полиморфизма во время выполнения. Следовательно, ответ «Нет».
Если производный класс определяет статический метод с той же сигнатурой, что и статический метод в базовом классе, метод в производном классе скрывает метод в базовом классе.

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

   производный класс, то он не переопределяет. * /

  
// Суперкласс

class Base {

      

    // Статический метод в базовом классе, который будет скрыт в подклассе

    public static void display() {

        System.out.println("Static or class method from Base");

    }

      

     // Нестатический метод, который будет переопределен в производном классе

     public void print()  {

         System.out.println("Non-static or Instance method from Base");

    }

}

  
// Подкласс

class Derived extends Base {

      

    // Этот метод скрывает display () в Base

    public static void display() {

         System.out.println("Static or class method from Derived");

    }

      

    // Этот метод переопределяет print () в Base

    public void print() {

         System.out.println("Non-static or Instance method from Derived");

   }

}

  
// Класс водителя

public class Test {

    public static void main(String args[ ])  {

       Base obj1 = new Derived();

         

       // Согласно переопределяющим правилам это должно вызывать статический класс Derive

       // переопределенный метод. Поскольку статический метод не может быть переопределен, он

       // вызывает отображение базы ()

       obj1.display();  

         

       // Здесь работает переопределение и вызывается функция print () Derive

       obj1.print();     

    }

}

Выход:

Static or class method from Base
Non-static or Instance method from Derived

Ниже приведены некоторые важные моменты для переопределения методов и статических методов в Java.
1) Для методов класса (или статических) вызывается метод в соответствии с типом ссылки, а не в соответствии с объектом, на который делается ссылка, что означает, что вызов метода определяется во время компиляции.

2) Например, (или нестатические) методы, метод вызывается в соответствии с типом объекта, на который делается ссылка, а не в соответствии с типом ссылки, что означает, что вызовы метода определяются во время выполнения.

3) Метод экземпляра не может переопределить статический метод, а статический метод не может скрыть метод экземпляра. Например, следующая программа имеет две ошибки компилятора.

/ * Java-программа, показывающая, что если статические методы переопределяются

   производный класс, тогда он не перекрывает, а скрывает. * /

  
// Суперкласс

class Base {

      

    // Статический метод в базовом классе, который будет скрыт в подклассе

    public static void display() {

        System.out.println("Static or class method from Base");

    }

      

     // Нестатический метод, который будет переопределен в производном классе

     public void print()  {

         System.out.println("Non-static or Instance method from Base");

    }

}

  
// Подкласс

class Derived extends Base {

      

    // Здесь убирается статика (вызывает ошибку компилятора)

    public void display() {

        System.out.println("Non-static method from Derived");

    }

      

    // Здесь добавлена статика (вызывает ошибку компилятора)

    public static void print() {

        System.out.println("Static method from Derived");

   }

}

4) В подклассе (или производном классе) мы можем перегрузить методы, унаследованные от суперкласса. Такие перегруженные методы не скрывают и не переопределяют методы суперкласса — они являются новыми методами, уникальными для подкласса.

Ссылки:
http://docs.oracle.com/javase/tutorial/java/IandI/override.html

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

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

Можем ли мы перегрузить или переопределить статические методы в Java?

0.00 (0%) 0 votes