Почему платформа Java независима в теории и зависит от платформы на практике?

Я знаю, что одна из больших вещей о Java заключается в том, что она независима от платформы в том смысле, что вы можете сделать приложение Java и запустить его в Windows, Linux, Mac и т. д., Пока вы не используете библиотеки, специфичные для одной ОС, и пока у вас есть JVM, установленный для соответствующей ОС, чтобы правильно интерпретировать вещи...

однако, почему обычная компьютерная Java-программа (как в простом Hello World в Java, например, для Windows или Linux) не может запускать только то же самое в мобильном телефоне, когда мобильные телефоны также имеют свою конкретную JVM для правильной интерпретации?

Почему в некоторых случаях необходимо изменить архитектуру программы, например, Android development, или использовать Java ME для создания приложений, специфичных для некоторых общих мобильных телефонов?

Я знаю, что есть некоторые функции, связанные с определенными функциональными возможностями ОС, которые могут не применяться, например, на мобильных платформах, таких как некоторые вещи, связанные с консолью, методами ввода и т. д., Но действительно ли это единственная причина, которая делает вещи несовместимыми? Если да, то почему простое приложение, которое просто объявляет и инициализирует целочисленную переменную, не сможет работать на всех немобильных и мобильных платформах, имеющих JVM?

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

5 ответов


единица переносимости для просмотра-это класс, а не приложение. Класс, который объявляет и инициализирует целочисленную переменную будет запуск на всех платформах, которые вы описываете, и многие другие тоже. Они понимают один и тот же байт-код, даже если они выполняют его с использованием разных механизмов, начиная от интерпретаторов байт-кода, до компиляции JIT, до Dalvik Android (который переводит байт-код JVM в свою собственную инструкцию набор.)

даже если мы посмотрим за пределы одной целочисленной переменной, Java, которая использует функциональность "core"будет работать на большинстве этих устройств. Существует много общего между J2ME, Android и J2SE (и, в частности, последние два - J2ME был предназначен в качестве сокращенной версии стандартных API Java для устройств с ограниченными ресурсами, поэтому доступно меньше стандартного API).

в системе Windows/Mac/Linux приложение обычно является чем-то, что вы явно запускаете, используете и - когда закончите-говорите ему выйти. Сравните это, скажем, с телефоном Android: приложение может быть запущено в ответ на событие (возможно, входящее SMS или определенный тип файла, загруженного из интернета), и в этом случае ему нужно знать как и почему он был запущен - простой public static main(String[] args) просто не резать. После запуска приложение должно знать о таких событиях, как" низкий заряд батареи " или "вход в режим ожидания", чтобы освободите ресурсы или отключите функции, интенсивные для процессора (например, GPS), которые в противном случае могут разрядить батарею.

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


при компиляции кода Java генерируется байтовый код(файл класса), который не зависит от системы. Этот байтовый код подается в JVM (виртуальную машину Java), которая находится в системе. Поскольку каждая система имеет свой собственный JVM, не имеет значения, где вы компилируете исходный код. Байт код, сгенерированный компилятором, может быть интерпретирован любой JVM любой машины. Поэтому он называется независимым от платформы языком.

спасибо


почему платформа Java независима в теории и зависит от платформы на практике?

помните и ясно одно, что только язык Java является независимым от платформы и попытаться понять значение предложения. Java не зависит от платформы означает, что код, разработанный с помощью Java, может быть запущен на любой машине.

при компиляции Он генерирует .class файл и он содержит байт-код, и этот байт-код является платформой независимый вы можете запустить его на любой машине это то, что о независимости платформы языка Java.

Теперь вы сказали, что это не на практике, поэтому причина только в том, что язык Java независим от платформы, но его среда выполнения, или JVM, зависит от платформы, она написана отдельно для каждой ОС. Таким образом, мы можем сказать, что язык Java не зависит от платформы, но его среда выполнения зависит от платформы.


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


Sun micro systems выпустила различные версии jdk. один для windows, а другой для linux / unix на основе. Когда мы установили jdk с этим, мы получаем jvm, jre и javac. Предположим, если мы напишем java-программу в windows с процессором intel, который установлен с windows jdk, то Java-компилятор этого jdk преобразует .файл java .файл класса, который содержит инструкции байтового кода, похожие на код ассемблера эти инструкции байтового кода могут быть понятны только jvm. Если мы берем .файл класса, который создается в Windows o.s и если мы запускаем в linux, то jvm этой машины linux внутренне переписывает вашу программу java, используя приблизительные наборы инструкций 200+, которые разработаны людьми javasoft и размещены как часть jvm. и.class file выполняется. Поэтому здесь нужно сосредоточиться на том, что jdk зависит от платформы, но .класс не зависит от платформы, он независим от платформы, потому что jvm отвечает только за запуск любого .файл класса. Каждый JVM jdk внутренне имеет предопределенные наборы инструкций, т. е. прибл. 200+.