Вы можете установить модернизатор и использовать простое сенсорное событие. Это очень эффективно и работает на каждом устройстве, на котором я его тестировал, включая поверхность Windows!
Я создал jsFiddle
function isTouchDevice(){
if(Modernizr.hasEvent('touchstart') || navigator.userAgent.search(/Touch/i) != -1){
alert("is touch");
return true;
}else{
alert("is not touch");
return false;
}
}
Да, но если статический метод был удален во время выполнения, будет вызываться соответствующий метод в базовом классе (имя и подпись должны точно соответствовать исходному методу во время компиляции, и метод должен быть доступным по правилам спецификации JVM).
Чтобы уточнить, рассмотрите вызывающий код:
Derived.fn();
И следующий вызываемый код:
class Base {
public static void fn() {
System.err.println("Base");
}
}
class Derived extends Base {
public static void fn() {
System.err.println("Derived");
}
}
Печатает Производный
.
Теперь я компилирую все. Затем перекомпиляция только что производного изменена на:
class Derived extends Base {
}
Печатает База
.
Возможно, тогда я перекомпилирую только что производный измененный на:
class Derived {
}
Выдает ошибку.
короткий ответ: да
Мне не удалось найти точный раздел спецификации языка Java . Пожалуйста помоги. :)
Да, это подробно рассмотрено и объяснено в этой теме на форумах Sun: Новое в Java - нет позднего связывания для статических методов
Несколько цитат:
Когда компилятор компилирует этот класс, он решает во время компиляции, какой именно метод вызывается для каждого вызова статического метода (это большая разница с вызовами нестатических методов: в этих случаях точный метод, который должен быть вызван, определяется только во время выполнения).
Вызов. статические методы всегда зависят только от типа времени компиляции, из которого они вызываются.