Могу ли я переопределить и перегрузить статические методы в Java? - PullRequest
55 голосов
/ 19 марта 2010

Я хотел бы знать:

  1. Почему статические методы не могут быть переопределены в Java?
  2. Могут ли статические методы быть перегружены в Java?

Ответы [ 18 ]

74 голосов
/ 25 марта 2011

Статические методы нельзя переопределить в точном смысле этого слова, но они могут скрыть родительские статические методы

На практике это означает, что компилятор tue будет решать, какой метод выполнять во время компиляции, а не во время выполнения, как это происходит с переопределенными методами экземпляра.

Для наглядного примера посмотрите здесь .

И это - документация Java, объясняющая разницу между переопределяющими методами экземпляра и сокрытием класса (статических) методов.

Переопределение: Переопределение в Java просто означает, что конкретный метод будет вызываться на основе типа времени выполнения объекта и не в типе времени компиляции (как в случае с переопределением статические методы)

Скрытие: Статические методы родительского класса не являются частью дочернего класса (хотя они доступны), поэтому не возникает вопросов переопределяя это. Даже если вы добавите еще один статический метод в подкласс, идентичен тому, что в родительском классе, этот статический метод подкласса уникален и отличается от статического метода в родительском классе.

25 голосов
/ 19 марта 2010

Статические методы не могут быть переопределены, потому что нечего переопределять, так как это будут два разных метода. Например

static class Class1 {
    public static int Method1(){
          return 0;
    }
}
static class Class2 extends Class1 {
    public static int Method1(){
          return 1;
    }

}
public static class Main {
    public static void main(String[] args){
          //Must explicitly chose Method1 from Class1 or Class2
          Class1.Method1();
          Class2.Method1();
    }
}

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

9 голосов
/ 19 марта 2010

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

Вот почему вы получаете предупреждение компилятора при написании

 MyClass myObject = new MyClass();
 myObject.myStaticMethod();
 // should be written as
 MyClass.myStaticMethod()
 // because it is not dispatched on myObject
 myObject = new MySubClass();
 myObject.myStaticMethod(); 
 // still calls the static method in MyClass, NOT in MySubClass

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

 Integer.parseInt("10");
 Integer.parseInt("AA", 16);
6 голосов
/ 14 марта 2012

Методы родительского класса, которые являются статическими, не являются частью дочернего класса (хотя они доступны), поэтому нет вопроса о его переопределении. Даже если вы добавите другой статический метод в подкласс, идентичный методу в его родительском классе, этот статический метод подкласса является уникальным и отличается от статического метода в его родительском классе.

4 голосов
/ 20 августа 2011

Статические методы не могут быть переопределены, потому что они не являются частью состояния объекта. Скорее, они принадлежат классу (т.е. они являются методами класса). Можно перегрузить статические (и окончательные) методы.

3 голосов
/ 07 декабря 2016

Статические методы - это метод, единственная копия которого используется всеми объектами класса. Статический метод принадлежит классу, а не объектам. Так как статические методы не зависят от объектов, компилятору Java не нужно ждать создания объектов. Поэтому для вызова статического метода мы используем синтаксис, такой как ClassName.method ();

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

   Class Sample
    {
         static int calculate(int a,int b,int c)
           {
                int res = a+b+c;
                return res;
           }
           static int calculate(int a,int b)
           {
                int res = a*b;
                return res;
           }
}
class Test
{
   public static void main(String []args)
   {
     int res = Sample.calculate(10,20,30);
   }
}

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

3 голосов
/ 25 февраля 2012

Если я вызываю метод с использованием имени подкласса MysubClass, тогда метод подкласса показывает, что значит статический метод, может быть переопределен или нет

class MyClass {
    static void myStaticMethod() {
        System.out.println("Im in sta1");
    }
}

class MySubClass extends MyClass {

    static void  myStaticMethod() {
        System.out.println("Im in sta123");
    }
}

public class My {
    public static void main(String arg[]) {

        MyClass myObject = new MyClass();
        myObject.myStaticMethod();
        // should be written as
        MyClass.myStaticMethod();
        // calling from subclass name
        MySubClass.myStaticMethod();
        myObject = new MySubClass();
        myObject.myStaticMethod(); 
        // still calls the static method in MyClass, NOT in MySubClass
    }
}
2 голосов
/ 23 июля 2013

static методы - class методы уровня.

Концепция сокрытия используется для static методов.

См .: http://www.coderanch.com/how-to/java/OverridingVsHiding

2 голосов
/ 13 июня 2013

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

1 голос
/ 22 июля 2018

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

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

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

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

...