Почему статические методы не переопределяются в Java? [Дубликат]

1
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.

Теги:
oop
static
override
static-methods

5 ответов

2

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

A a;
a = [no matter what];
a.static_method();

абсолютно то же самое, что:

A.static_method()

независимо от того, какое значение вы назначаете "a".

2

Изменить: когда вы вызываете статический метод, будь то через экземпляр или на уровне класса, компилятор распознает его как статический и, следовательно, обрабатывает его на уровне класса, а не на уровне объекта. Это означает, что метод не будет знать состояния объекта, из которого был вызван метод. Если вы используете объект для вызова метода, например, в вашем примере, тогда компилятор сможет узнать только, какой метод вызывать, A или B, на основе того, что этот объект был объявлен. Если он был создан как другой подкласс, это не имеет значения, потому что это статический метод и не имеет понятия объектов. Итак, в вашем примере, поэтому он будет называть статический метод, а не B.

Надеюсь, это было более ясное объяснение тому, что у меня было до

  • 0
    Не так много. Может быть, вы можете объяснить это лучше с кодом?
  • 0
    Статический метод не связан ни с одним экземпляром класса, это свойство самого класса. Хотя a.staticMethod() будет работать, рекомендуется вместо этого вызывать A.staticMethod() .
Показать ещё 3 комментария
1

это плохая практика, потому что 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)
1

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

A a = new B();
a.staticMethod();

Хороший практик вызывает это прямо из того места, где он находится:

A.staticMethod();

Примечание. Я думаю, что вы можете настроить это предупреждение в своей среде IDE.


Как вы можете видеть в теге StackOverflow :

Static - это термин, используемый в некоторых языках программирования для определения области или области хранения данных (поля), которая не привязана к какому-либо конкретному экземпляру объекта.

0

Вы не можете переопределить статический метод. Если вы удалите 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

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

  • 0
    Это правда. Вопрос в том, ПОЧЕМУ это так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню