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

Статический метод в Java можно получить с помощью экземпляра объекта

В Java статические методы создаются для доступа к нему без какого-либо экземпляра объекта. Это имеет смысл для меня. Но недавно я столкнулся с одной странной вещью, что статический метод в Java также можно получить через экземпляр объекта. Это выглядит довольно странно для меня. Кто-нибудь из вас знает, почему эта функция предоставляется Java? Каково значение разрешения доступа к статическим методам с помощью, а также без экземпляра?

4b9b3361

Ответ 1

Преимущество этого заключается в том, что он позволяет вам принять метод экземпляра и превратить его в статический метод без необходимости изменять любой существующий код (кроме класса) и, таким образом, обеспечивать обратную совместимость. Я нашел это полезным столько раз, когда сталкивался с полезными методами, которые можно сделать статичными - я могу просто добавить модификатор static и продолжить свой путь.

Ответ 2

Семантически тождественно. Компилятор достаточно умен, чтобы понять, что вы имеете в виду (это доступ к статическому методу через класс). IDE дадут вам предупреждение, сообщающее вам о плохих манерах:)

Посмотрите этот вопрос для более подробной информации. Как они говорят, это может ввести в заблуждение, и поэтому IDEs дадут вам предупреждение.

Ответ 3

Это разрешено спецификацией, но это не рекомендуется. Кроме того, больше IDE, например Eclipse, обращается к статическому методу экземпляра объекта с предупреждением.

Ответ 4

пока это плохо, нет никаких веских оснований запрещать это.

o.f();

поэтому нам нужно найти метод с именем f в области o. Можно утверждать, что статический f, конечно, также находится в области o, хотя f фактически определен для большей области (o class)

Ответ 5

Еще одна приятная (хотя и несколько хакерская) функция, которую он дает вам, - это способность существенно передавать ссылки на классы в виде объектов. Так скажите, например, что у вас есть следующее:

public abstract class Animal {
    public String name() { return "animal"; }
}

public class Dog extends Animal {
    public String name() { return "dog"; }
}

Если вы выполните следующее:

Animal a = new Dog();
System.out.println(a.name());

... вы получите:

dog

На практике это означает, что вызов статических методов с помощью созданных объектов предоставляет Java форму первоклассных функций. Вы определяете функцию "type" с использованием абстрактного базового класса, а затем создаете экземпляр любой функции соответствующего типа, переопределяя статический метод в дочернем классе. Затем вы используете объекты, как если бы они были просто контейнерами для рассматриваемого статического метода.

Чтобы сделать это более конкретным, представьте, что мы хотели иметь функцию, которая выполняет определенную строчную кодировку в массиве строк, и мы хотим, чтобы она принимала в качестве аргумента функцию, которая выполняет кодирование в одной строке. Мы хотим, чтобы аргумент менялся в зависимости от того, какая кодировка желательна. Без первоклассных функций это невозможно сделать напрямую. Однако вызов статических методов для объектов дает нам обходное решение:

public abstract class EncodingType {
    public String encode(String s) { return s; }
}

public class Base64Encoding extends EncodingType {
    public String encode(String s) { base64Encode(s); } // Assume "base64Encode" is defined
}

public class Rot13Encoding extends EncodingType {
    public String encode(String s) { rot13Encode(s); } // Assume "rot13Encode" is defined
}

public class Encoder {
    public String[] encodeArray(String[] s, EncodingType enc) {
        for (int i = 0; i < s.length; i++) {
            s[i] = enc.encode(s[i]);
        }
        return s;
    }
}

Вы бы назвали это следующим образом:

Encoder e = new Encoder();
String[] strs = { ... };
strs = e.encodeArray(strs, new Rot13Encoding());