class A{
public static void staticMethod(){
System.out.println("Static method of A");
}
}
class B extends A{
public static void staticMethod(){
System.out.println("Static method of B");
}
}
class TestStaticOverride{
public static void main(String args[]){
B b=new B();
A a=b;
a.staticMethod();
}
}
Выход "Статический метод A". Поэтому статические методы не переопределяются, иначе выход будет "Статический метод B". Как во время выполнения JVM решает вызвать статический метод класса A, а не B.
Статические методы разрешаются во время компиляции и почему они привязаны к классу, где они определены, а не к экземпляру. Поэтому они относятся к классу, а не к экземпляру, и почему другое имя является "методом класса". Вы можете вызвать статический метод из экземпляра в соответствии с синтаксисом Java, но он всегда будет считаться вы вызывающим его из класса, например
A a;
a = [no matter what];
a.static_method();
абсолютно то же самое, что:
A.static_method()
независимо от того, какое значение вы назначаете "a".
Изменить: когда вы вызываете статический метод, будь то через экземпляр или на уровне класса, компилятор распознает его как статический и, следовательно, обрабатывает его на уровне класса, а не на уровне объекта. Это означает, что метод не будет знать состояния объекта, из которого был вызван метод. Если вы используете объект для вызова метода, например, в вашем примере, тогда компилятор сможет узнать только, какой метод вызывать, A или B, на основе того, что этот объект был объявлен. Если он был создан как другой подкласс, это не имеет значения, потому что это статический метод и не имеет понятия объектов. Итак, в вашем примере, поэтому он будет называть статический метод, а не B.
Надеюсь, это было более ясное объяснение тому, что у меня было до
a.staticMethod()
будет работать, рекомендуется вместо этого вызывать A.staticMethod()
.
это плохая практика, потому что JVM не поймет инструкции, которые вы пытаетесь дать, более того, представьте, какой беспорядок ваш OO будет?
например:
class A{
public static void met(){
System.out.println("Class A");
}
}
class B extends A{
//Override
public static void met(){
System.out.println("Class B");
}
}
let make a Polymorphism:
A a=new A();
A b=new B();
a.meth();//Class A
b.meth();//Class A !!! <===(Was Expected to be Class B)
Хотя это возможно, не рекомендуется вызывать статический метод из экземпляра.
A a = new B();
a.staticMethod();
Хороший практик вызывает это прямо из того места, где он находится:
A.staticMethod();
Примечание. Я думаю, что вы можете настроить это предупреждение в своей среде IDE.
Как вы можете видеть в теге StackOverflow static:
Static - это термин, используемый в некоторых языках программирования для определения области или области хранения данных (поля), которая не привязана к какому-либо конкретному экземпляру объекта.
Вы не можете переопределить статический метод. Если вы удалите static в staticMethod(), когда вы вызываете a.staticMethod(), тогда будет вызван staticMethod() в классе B.
class A {
public void staticMethod() {
System.out.println("Static method of A");
}
}
class B extends A {
public void staticMethod() {
System.out.println("Static method of B");
}
}
class Main {
public static void main(String args[]) {
B b = new B();
A a = b;
a.staticMethod();
}
}
// Result: Static method of B
Другими словами, если вы попытаетесь переопределить статический метод, тогда будет вызван метод из суперкласса.