Переопределение статического метода - PullRequest
2 голосов
/ 16 мая 2011
class XYZ{
    public static void show(){
        System.out.println("inside XYZ");
    }
}

public class StaticTest extends XYZ {
    public static void  show() {
        System.out.println("inside statictest");

    }

    public static void main(String args[]){
        StaticTest st =new StaticTest();
        StaticTest.show();

    }

}

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

Ответы [ 8 ]

3 голосов
/ 16 мая 2011

Статические методы принадлежат классу.Они не могут быть переопределены .Однако если в дочернем классе определен метод такой же сигнатуры, что и статический метод родительского класса, он скрывает метод родительского класса.StaticTest.show() скрывает метод XYZ.show(), поэтому StaticTest.show() - это метод, который выполняется в методе main в коде.

2 голосов
/ 16 мая 2011

Это не overriding это два разных метода в двух разных классах с одинаковой сигнатурой. но метод из XYZ недоступен в дочернем классе через наследование.

Это вызовет метод из StaticTest

1 голос
/ 03 февраля 2014

Чтобы увидеть разницу, вы должны использовать более мощный пример:

class Super {
    public static void hidden(Super superObject) {
        System.out.println("Super-hidden");
        superObject.overriden();
    }

    public void overriden() {
        System.out.println("Super-overriden");
    }
}

class Sub extends Super {
    public static void hidden(Super superObject) {
        System.out.println("Sub-hidden");
        superObject.overriden();
    }

    public void overriden() {
        System.out.println("Sub-overriden");
    }
}

public class Test {
    public static void main(String[] args) {
        Super superObject = new Sub();
        superObject.hidden(superObject);
    }
}

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

1 голос
/ 16 мая 2011

Это не переопределяется правильно: статические методы «привязаны» к классу, поэтому

StaticTest.show();

и

XYZ.show();

- это две совершенно разные вещи.Обратите внимание, что вы не можете вызвать super.show ()

0 голосов
/ 17 мая 2011

// Java позволяет вызывать статический метод из ссылки на экземпляр / объект // что не так в других чистых языках ООП, таких как C # Dot net. // что вызывает эту путаницу. // Технически статический метод всегда привязан к классу, а не к экземпляру. // Другими словами, привязка во время компиляции для статических функций. - Раннее связывание // // например.

class BaseClass 
{
 public static void f1()
 {
  System.out.println("BaseClass::f1()...");
 } // End of f1().
}

public class SubClass extends BaseClass 
{
  public static void f1() 
  {
    System.out.println("SubClass::f1()...");
    // super.f1(); // non-static variable super cannot be referenced from a static context

  } // End of f1().

  public static void main(String[] args)
  {
f1();
SubClass obj1 = new SubClass();
obj1.f1();
BaseClass b1 = obj1;
b1.f1();

  } // End of main().

} // End of class.

// Output:
// SubClass::f1()...
// SubClass::f1()...
// BaseClass::f1()...

// // // Так что даже в этом случае вызывается с экземпляром b1, который на самом деле ссылается на // объект типа SuperClass, он вызывает метод BaseClass: f1. //

0 голосов
/ 16 мая 2011

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

Следовательно, вызовы всегда ClassName.staticMethod ();

Когда такой случай того же статического метода в подклассепоявляется, это называется уточнением (переопределением) статического метода, а не переопределением.

0 голосов
/ 16 мая 2011

Итак, насколько я знаю, любой статический член (метод или состояние) является атрибутом класса и не будет связан ни с одним экземпляром класса.Итак, в вашем примере XYZ - это класс, как и StaticTest (как вы знаете).Таким образом, при вызове конструктора сначала происходят две вещи.Объект типа Class создан.У этого есть член на этом показанном вызове ().Класс XYZ.class расширяется от Object, поэтому в нем есть все эти методы Object плюс show ().Как и в случае StaticClass, объект класса также имеет функцию show ().Они оба расширяют java.lang.Object, хотя.Экземпляр StaticClass также будет экземпляром XYZ.Однако теперь более интересным вопросом будет то, что происходит, когда вы вызываете show () для st?Я предполагаю, что это StaticClass.show () в первый раз и XYZ.show () во второй.

0 голосов
/ 16 мая 2011

Это не переопределение, а отдельный метод, который скрывает метод в XYZ.

...