Подтвердить что ты не робот

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

public class CallingStaticMethod {
public static void method() {
    System.out.println("I am in method");
}
public static void main(String[] args) {
    CallingStaticMethod csm = null;
    csm.method();
   }
}

Может кто-нибудь объяснить, как статический метод вызывается в приведенном выше коде?

4b9b3361

Ответ 1

Он был оптимизирован компилятором просто потому, что наличие экземпляра класса не требуется. Компилятор в основном заменяет

csm.method();

по

CallingStaticMethod.method();

В целом это тоже хорошая практика сделать это самостоятельно. Даже средняя IDE предупредит вас о доступе к статическим методам через экземпляр, по крайней мере, Eclipse здесь.

Ответ 2

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

instance.method();

совпадает с

Class.method();

Ответ 3

Спецификация языка Java говорит, что ссылка получает оценку, затем отбрасывается, а затем запускается статический метод.
15.12.4.1. Вычислить целевую ссылку (если необходимо)

Это то же самое поведение, когда вы используете ссылку this для вызова статического метода. this получает оценку, затем отбрасывается, тогда вызывается метод.

В спецификации, похожей на ваш пример, есть пример.

Когда целевая ссылка вычисляется и затем отбрасывается, потому что режим вызова является статическим, эта ссылка не проверяется, чтобы определить, является ли она нулевой:

class Test1 {
    static void mountain() {
        System.out.println("Monadnock");
    }
    static Test1 favorite(){
        System.out.print("Mount ");
        return null;
    }
    public static void main(String[] args) {
        favorite().mountain();
    }
}

Ответ 4

Хорошо, это нормально. Статический метод не получает доступ к экземпляру объекта класса A. Либо вы вызываете его по имени класса, либо по ссылке, компилятор вызовет его через экземпляр класса java.lang.Class.

FYI, каждый класс (CallingStaticMethod в приведенной выше иллюстрации) в java является экземпляром класса 'java.lang.Class'. И всякий раз, когда вы определяете класс, экземпляр создается как java.lang.Class CallingStaticMethod = new java.lang.Class();

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

Надеюсь, что это поможет.

Ответ 5

Да, мы можем. Он будет вызывать NullPointerException только в том случае, если мы вызываем нестатический метод с null. Если метод статический, он будет запущен, и если метод не статичен, он будет через NPE...

Чтобы узнать больше нажмите здесь...