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

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

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

Ответы [ 18 ]

1 голос
/ 01 июня 2014
class SuperType {

    public static void  classMethod(){
        System.out.println("Super type class method");
    }
    public void instancemethod(){
        System.out.println("Super Type instance method");
    }
}


public class SubType extends SuperType{


    public static void classMethod(){
        System.out.println("Sub type class method");
    }
    public void instancemethod(){
        System.out.println("Sub Type instance method");
    }
    public static void main(String args[]){
        SubType s=new SubType();
        SuperType su=s;
        SuperType.classMethod();// Prints.....Super type class method
        su.classMethod();   //Prints.....Super type class method
        SubType.classMethod(); //Prints.....Sub type class method 
    }
}

Этот пример для переопределения статического метода

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

Статический метод принадлежит только классу.

1 голос
/ 27 марта 2017

С Почему Java не допускает переопределение статических методов?

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

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

0 голосов
/ 19 июля 2013

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

0 голосов
/ 01 февраля 2017

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

0 голосов
/ 28 марта 2013

Сама цель использования статического метода - получить доступ к методу класса, не создавая для него экземпляра. Не будет смысла переопределять этот метод, так как к ним будет обращаться classname.method ()

0 голосов
/ 01 мая 2015

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

Лучший ответ, который я нашел на этот вопрос:

http://www.geeksforgeeks.org/can-we-overload-or-override-static-methods-in-java/

0 голосов
/ 23 января 2014

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

class Class1 {
    public static int Method1(){
          System.out.println("true");
          return 0;
    }
}
class Class2 extends Class1 {
    public static int Method1(){
   System.out.println("false");
          return 1;
    }

}
public class Mai {
    public static void main(String[] args){
           Class2 c=new Class2();
          //Must explicitly chose Method1 from Class1 or Class2
          //Class1.Method1();
          c.Method1();
    }
}
0 голосов
/ 21 июня 2013

Нет, вы не можете переопределить статический метод. Статика разрешается против класса, а не экземпляра.

public class Parent { 
    public static String getCName() { 
        return "I am the parent"; 
    } 
} 

public class Child extends Parent { 
    public static String getCName() { 
        return "I am the child"; 
    } 
} 

У каждого класса есть статический метод getCName (). Когда вы вызываете имя класса, оно ведет себя так, как вы ожидаете, и каждый возвращает ожидаемое значение.

@Test 
public void testGetCNameOnClass() { 
    assertThat(Parent.getCName(), is("I am the parent")); 
    assertThat(Child.getCName(), is("I am the child")); 
} 

Никаких сюрпризов в этом модульном тесте. Но это не переопределение. Это объявление чего-то, имеющего конфликт имен.

Если мы попытаемся достичь статики из экземпляра класса (не очень хорошая практика), то это действительно показывает:

private Parent cp = new Child(); 
`enter code here`
assertThat(cp.getCName(), is("I am the parent")); 

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

...