Что происходит, когда статический метод вызывается с использованием пустой ссылки на объект? - PullRequest
12 голосов
/ 08 февраля 2010
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();
   }
}

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

Ответы [ 5 ]

22 голосов
/ 08 февраля 2010

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

csm.method();

от

CallingStaticMethod.method();

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

3 голосов
/ 08 февраля 2010

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

instance.method ();

совпадает с

Class.method ();

1 голос
/ 23 октября 2017

В спецификации языка Java говорится, что ссылка get оценивается, затем отбрасывается, а затем вызывается статический метод.
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();
    }
}
0 голосов
/ 09 июля 2014

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

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

0 голосов
/ 08 ноября 2012

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

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

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

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

...