Основным строительным блоком программа на языке Java являются инструкции (statement). Каждая инструкция выполняет некоторое действие, например, вызовы методов, объявление переменных и присвоение им значений. После завершения инструкции в Java ставится точка с запятой (;). Данный знак указывает компилятору на конец инструкции. Например:
Данная строка представляет вызов метода System.out.println , который выводит на консоль строку «Hello Java!». В данном случае вызов метода является инструкцией и поэтому завершается точкой с запятой.
Кроме отдельных инструкций распространенной конструкцией является блок кода. Блок кода содержит набор инструкций, он заключается в фигурные скобки, а инструкции помещаются между открывающей и закрывающей фигурными скобками:
В этом блоке кода две инструкции, которые выводят на консоль определенную строку.
Выполнение программы. Метод main
Java является объектно-ориентированным языком, поэтому всю программу можно представить как набор взаимодествующих между собой классов и объектов. В первой главе при создании первого приложения программа была определена следующим образом:
То есть основу нашей программы составляет класс Program. При определении класса вначале идет модификатор доступа public , который указывает, что данный класс будет доступен всем, то есть мы сможем его запустить из командной строки. Далее идет ключевое слово class , а затем название класса. После названия класса идет блок кода, в котором расположено содержимое класса.
Входной точкой в программу на языке Java является функция main , которая определена в классе Program. Именно с нее начинается выполнение программы. Он обязательно должен присутствовать в программе. При этом его заголовок может быть только таким:
При запуске приложения виртуальная машина Java ищет в главном классе программы метод main с подобным заголовком, и после его обнаружения запускает его.
Вначале заголовка метода идет модификатор public , который указывает, что метод будет доступен извне. Слово static указывает, что метод main — статический, а слово void — что он не возвращает никакого значения. Далее в скобках у нас идут параметры метода — String args[] — это массив args, который хранит значения типа String, то есть строки. При запуске программы через этот массив мы можем передать в программу различные данные.
После заголовка метода идет его блок, который содержит набор выполняемых инструкций.
Комментарии
Код программы может содержать комментарии. Комментарии позволяют понять смыл программы, что делают те или иные ее части. При компиляции комментарии игнорируются и не оказывают никакого влияние на работу приложения и на его размер.
В Java есть два типа комментариев: однострочный и многострочный. Однострочный комментарий размещается на одной строке после двойного слеша //. А многострочный комментарий заключается между символами /* текст комментария */ . Он может размещаться на нескольких строках. Например:
Структура файла
Язык Java /
Основы языка Java
28 янв 2011 02:33
Сколько читаю, все никак не могу докопатся до самого простого
Структура файла чтоли, незнаю как правильно выразится
Начиная работу, мы так и так пишем код в файл. Сначала он имеет расширение .java, после компиляции превращает в байт-код, файл с расширением .class
Что он может содержать, файл с расширением .java? Его структура всегда имеет форму
То есть один файл-один класс? (пусть у него там внутри всякого напихано, но он, как бы объемлющий класс всегда один?)
То есть например в одном файле не может быть конструкции
Имеется ввиду только описанный код и ничего более
Еще вопрос по конструкторам, точнее попытка подитожить
Вот вопрос-что мы можем писать ДО конструктора? Как соотносится сам класс и его конструктор?
По идее класс имеет поля и методы. При создании экземпляра запускается именно конструктор. То что написано ранее как влияет на созданный экземпляр?
И что происходит если конструктора нет, т.е. есть только конструктор по умолчанию-он только резервирует место в памяти под переменные? Под методы вроде память не выделяется?
Извините если вопрос тупой, но просто если я самое простое не пойму то дальше вообще будет завал
Если неправильно про конструкторы то тоже сорри, это мне сишник объяснял, там наверняка что-то подругому
28 янв 2011 05:36
28 янв 2011 07:00
Вопросы не тупые, а скорее показывают дельное желание разобраться и это хорошо 🙂
Классов может быть несколько в одном .java Кроме package и class, часто будите использовать блоки комментариев (Javadoc) и import’ы.
А так, bomba_flanker , правильно сказал. выберите себе подходящую книгу и по-тихоньку изучайте и думаю прочтя пару глав вы найдете ответы)
28 янв 2011 15:39
М-м-м. В вопросе есть некоторый сумбур в понимании ООП и вообще структурного/модульного программирования. Вероятно чуть позже это придёт. Просто ответить на эти вопросы непосредственно довольно сложно (ведь чтобы задать правильный вопрос и понять ответ, нужно этот ответ на 50% или больше знать уже). 😉
Также можно порекомендовать поизучать несколько «более-других» языков (в чисто «обозревательном» ключе, т.е. в рамках одного дня или недели) почитать книжку, написать несколько маленьких программ. Выбрать любой язык где можно писать и с использованием ООП и без него.
Судя по вашим вопросам у вас именно основные элементы ООП и вообще структурных языков не вполне умещаются пока в сознании. Кто-то рекомендует на Паскале пробовать учиться, но учитывая современные реалии, наверное, с тем же успехом можно немножко про Питон или, может, ПХП почитать.
(хотя, конечно, это не очень принципиально, можно и с джава продолжать. главное — продолжать!)
28 янв 2011 16:04
29 янв 2011 18:43
Спасибо всем за ответы. Да, Вы правы, основные пробелы у меня именно в знании ООП.
Я мож тормоз, а где там про построение класса и что он может содержать?
Чудесно, но меня как раз волнует существуют ли те которые не similar
Вот такая штука может находится в одном файле?
Как мне объясняли название класса должно совпадать с названием файла. Как же такая конструкция существует?
А можно маленький пример файла с несколькими классами?
Про import и javadoc я знаю, но для чистоты эксперимента пока убрала
Именно так. Я сейчас пишу на php но обычном не объектном. Очень тяжело переходить(
Это все чудесно, но мне не рано? Я боюсь лезть сейчас устраиватся, я совсем новичок. Простые совсем скриптики я пишу, ну так ерунда-площадь посчитать, конвертер валют итп
И дело не в том что они простенькие, просто я сути не понимаю. Наковыряла библиотек собрала-работает. Что то топорщится-раз потыкалась заработало
Почему топорщилось, почему именно после этого исправления заработало-фиг знает
Поэтому я себя неуютно чувствую, и хочу основы поучить
Мне наверное надо сейчас какую-нить хорошую книжку по ООП, по Java я много перечитала но там все как то поверхностно-вот объекты они обмениваются сообщениями, вот классы сейчас мы их прикрутим и все заработает
А мне надо саму суть разобрать
Если надо учится на практике-то когда можно начинать пытатся попасть уже на работу? А то я боюсь меня сейчас возьмут и тут же выгонят[/code]
Структура java-файла (классы без внутренних классов и блоков-инициализаторов) [ package packageName; ] [ import packageOr >Презентация была опубликована 6 лет назад пользователемДанила Ерастов
Похожие презентации
Презентация на тему: » Структура java-файла (классы без внутренних классов и блоков-инициализаторов) [ package packageName; ] [ import packageOrClassNameToImport; … ] [ accessSpecifier.» — Транскрипт:
1 Структура java-файла (классы без внутренних классов и блоков-инициализаторов) [ package packageName; ] [ import packageOr >
2 Отличия Java от С/С++ Лексика языка Java Тексты программ рассматриваются компилятором как последовательность UNICODE-символов в формате UTF-8 (форматы ASCII и Latin-1 являются допустимыми подмножествами UTF-8). Где угодно можно записать Unicode-символ в таком представлении: uxxxx, где x – шестнадцатеричная цифра (например, u0020 – символ пробела). Идентификатор в языке Java — это последовательность букв (не обязательно латинских), цифр (цифра не может быть первым символом), подчеркиваний ( _ ) и любых валютных символов Unicode (например $,, £, ¥ …). Идентификаторы «чувствительны» к регистру символов, т.е. long и Long – это разные слова. Способы записи литералов (123, «строка», 0xfffe, , 1e-13, ‘t’, …) в основном унаследованы из С/С++. Знаки операций, операторы и комментарии в основном унаследованы от С/С++.
4 Начнем с operatorsList: Отличия Java от С++. Типы данных (1) Java – язык со строгой типизацией. Типы данных: примитивные и ссылочные. Примитивных типов данных в языке Java 8 (нет unsigned): ТипСодержитРазмерДиапазон booleantrue/false1 бит– charсимвол Unicode16 битот u0000 до uFFFF byteцелое со знаком8 битот –128 до 127 shortцелое со знаком16 битот –32768 до intцелое со знаком32 битот – до longцелое со знаком64 битот – до floatвещественное32 битот +–1.4Е – 45 до +– Е38 doubleвещественное64 битот +–4.9Е – 324 до +– Е308
5 Отличия Java от С++. Типы данных (2) Преобразования примитивных типов N- невозможно; E- требуется явное (explicit) указание типа; A- автоматически (automatic); A*- автоматически но с возможной потерей младших разрядов из: в:booleanbyteshortcharintlongfloatdouble boolean-NNNNNNN byteN-AEAAAA shortNE-EAAAA charNEE-AAAA intNEEE-AA*A longNEEEE-A* floatNEEEEE-A doubleNEEEEEE-
6 Отличия Java от С++. Типы данных (3) Ссылочные типы данных: объекты (экземпляры классов); массивы (примитивных или ссылочных типов). Указателей, с которыми можно явно манипулировать, в языке Java нет. Тем не менее, любой экземпляр класса представлен указателем (ссылкой). Операция. в языке Java по существу эквивалентна операции -> в C/C++: System.out.println( «Hello, World!» ); Здесь имена System и out надо понимать как указатели на объекты, автоматически создаваемые виртуальной машиной при запуске программы на выполнение. в C/C++: System.out.println( «Hello, World!» ); Здесь имена System и out надо понимать как указатели на объекты, автоматически создаваемые виртуальной машиной при запуске программы на выполнение.»>
7 Отличия Java от С++. Типы данных (4) В языке Java отсутствуют структуры (struct) и объединения (union). Нет спецификатора typedef, позволяющего давать символические имена производным типам данных и использовать эти имена впоследствии. Не существует возможности создавать глобальные переменные или глобальные функции: Все переменные могут быть либо полями классов, либо локальными переменными методов. Любая функция может быть объявлена только как метод какого-либо класса.
8 Отличия Java от С++. Операции (1) В основном унаследованы от С/С++ PAОперацияТип(ы) операнда(ов)Действие 15L. объект. член классадоступ к полю или методу объекта [ ] … массив [ целое ] …доступ к элементу массива ( ) метод ( список аргументов )вызов метода ++ – – переменнаяпостфиксный инкремент декремент 14R ++ – – переменнаяпрефиксный инкремент декремент + – число / переменнаяунарный плюс минус
9 Отличия Java от С++. Операции (2) PAОперацияТип(ы) операнда(ов)Действие 13Rnewкласс( список аргументов) создание объекта (type)любой типприведение к указанному типу 12L* / %число умножение деление остаток 11L+ – число сложение вычитание +строка любой типконкатенация строк 10Lцелое сдвиг вправо с размножением знака >>>целое сдвиг вправо с дополнением нулем >>целое сдвиг вправо с дополнением нулем»>
=число больше / больше или равно instanceofссылка типсравнение типов 8L= примитив сравнение на идентичность ! =примитив сравнение на неидентичность = ссылка сравнение на ид» title=»Отличия Java от С++. Операции (3) PAОперацияТип(ы) операнда(ов)Действие 9L =число больше / больше или равно instanceofссылка типсравнение типов 8L= примитив сравнение на идентичность ! =примитив сравнение на неидентичность = ссылка сравнение на ид» > 10 Отличия Java от С++. Операции (3) PAОперацияТип(ы) операнда(ов)Действие 9L =число больше / больше или равно instanceofссылка типсравнение типов 8L= примитив сравнение на идентичность ! =примитив сравнение на неидентичность = ссылка сравнение на идентичность ! =ссылка сравнение на неидентичность =число больше / больше или равно instanceofссылка типсравнение типов 8L= примитив сравнение на идентичность ! =примитив сравнение на неидентичность = ссылка сравнение на ид»> =число больше / больше или равно instanceofссылка типсравнение типов 8L= примитив сравнение на идентичность ! =примитив сравнение на неидентичность = ссылка сравнение на идентичность ! =ссылка сравнение на неидентичность»> =число больше / больше или равно instanceofссылка типсравнение типов 8L= примитив сравнение на идентичность ! =примитив сравнение на неидентичность = ссылка сравнение на ид» title=»Отличия Java от С++. Операции (3) PAОперацияТип(ы) операнда(ов)Действие 9L =число больше / больше или равно instanceofссылка типсравнение типов 8L= примитив сравнение на идентичность ! =примитив сравнение на неидентичность = ссылка сравнение на ид»>
11 Отличия Java от С++. Операции (4) PAОперацияТип(ы) операнда(ов)Действие 7L&целое поразрядное умножение &булево логическое умножение 6L^целое поразрядное исключающее ИЛИ ^булево логическое исключающее ИЛИ 5L|целое поразрядное сложение |булево логическое сложение
13 Отличия Java от С++. Операции (6) Любая операция возвращает значение (прямой эффект), которое может быть использовано в другой операции, если, конечно, оно подходит для нее по типу или приводится к подходящему типу (иначе – ошибка периода компиляции или исполнения). Некоторые операции имеют побочный эффект (инкременты, присваивания, new, возможно – операция вызова метода) В том случае, если операндами операции являются числовые типы: возвращается значение типа double если хотя бы один из операндов имеет тип double иначе возвращается значение типа float если хотя бы один из операндов имеет тип float иначе возвращается значение типа long если хотя бы один из операндов имеет тип long иначе возвращается значение типа int, даже если оба операнда имеют тип byte, char или short.
14 Отличия Java от С++. Операции (7) Поэтому в следующем фрагменте компилятор выдаст ошибку: … short itemIndex = 0; … short finalIndex = itemIndex + 1; Правильной версией последнего оператора может быть такая: short finalIndex = (short)(itemIndex + 1); При вычислении выражений соблюдаются приоритеты знаков операций, их ассоциативность и учитываются круглые скобки. Выполнение каждого оператора начинается с вычисления значений всех указанных в нем операндов (за исключением операндов операций &&, || и ?:). Значения операндов вычисляются в порядке их записи в операторе слева направо. Это следует учитывать в тех случаях, когда используются операции с побочными эффектами. Например, какое значение (5 или 7 ?) получит переменная rezValue в результате выполнения следующего фрагмента: int mixValue = 0; int rezValue = ++mixValue + ++mixValue * ++mixValue;
15 Отличия Java от С++. Операции (8) Все операции с целыми числами выполняются по модулю (int) или (long). К возникновению исключительных ситуаций приводит только деление на 0 и вычисление остатка по модулю 0 (выбрасывается исключение ArithmeticException). Все переполнения игнорируются. Операции с вещественными числами (float и double) вообще никогда не приводят к исключениям. Вместо этого в тех случаях, когда получается слишком маленький или слишком большой результат, формируются специальные значения: положительный и отрицательный ноль (+ – 0.0); положительная и отрицательная бесконечность (+ – Infinity). Положительный и отрицательный ноль практически одинаковы. Любые операции с бесконечностями вырабатывают либо бесконечность, либо еще одно специальное значение: не-число (NaN – Not a number). Если в какой-либо операции участвует не-число, то результатом будет опять не-число. Не-число может быть получено в результате преобразования строки в число, при выполнении некоторых тригонометрических функций, и в других специальных случаях.
Внутренности JVM, Часть 2 — Структура class-файлов
Всем привет! Перевод статьи подготовлен специально для студентов курса «Разработчик Java».
Продолжаем разговор о том, как Java Virtual Machine работает внутри. В предыдущей статье (оригинал на анг.) мы рассмотрели подсистему загрузки классов. В этой статье мы поговорим о структуре class-файлов.
Как мы уже знаем, весь исходный код, написанный на языке программирования Java, сначала компилируется в байт-код с помощью компилятора javac , входящего в состав Java Development Kit. Байт-код сохраняется в бинарный файл в специальный class-файл. Затем эти class-файлы динамически (при необходимости) загружаются в память загрузчиком классов (ClassLoader).
Рисунок — компиляция исходного кода Java
Каждый файл с расширением .java компилируется как минимум в один файл .class . Для каждого класса, интерфейса и модуля, определенных в исходном коде, создается по одному .class файлу. Это также относится к интерфейсам и вложенным классам.
Примечание — для простоты файлы с расширением .class будем называть “class-файлами”.
Давайте напишем простую программу.
Запуск javac для этого файла приведет к появлению следующих файлов.
Как видите, для каждого класса и интерфейса создается отдельный class-файл.
Что внутри class-файла?
Class-файл имеет бинарный формат. Информация в нем обычно записывается без отступов между последовательными частями информации, все выравнивается по границам байтов. Все 16-битные и 32-битные значения записываются с помощью двух или четырех последовательных 8-битных байтов.
Class-файл содержит следующую информацию.
Магическое число, сигнатура. Первые четыре байта каждого class-файла всегда 0xCAFEBABE . Эти четыре байта идентифицируют class-файл Java.
Версия файла. Следующие четыре байта содержат мажорную и минорную версию файла. Вместе эти номера определяют версию формата class-файла. Если class-файл имеет основной мажорную версию M и минорную m, то мы обозначаем эту версию как M.m.
У каждой JVM есть ограничения по поддерживаемым версиям class-файлов. Например, Java 11 поддерживает major версию с 45 до 55, Java 12 — с 45 по 56.
Пул констант. Таблица структур, представляющих строковые константы, имена классов, интерфейсов, полей, методов и другие константы, которые есть в структуре ClassFile и ее подструктурах. Каждый элемент пула констант начинается с однобайтового тега, определяющего тип константы. В зависимости от типа константы следующие байты могут быть непосредственным значением константы или ссылкой на другой элемент в пуле.
Флаги доступа. Список флагов, которые указывают класс это или интерфейс, public или private, финальный класс или нет. Различные флаги, такие как ACC_PUBLIC , ACC_FINAL , ACC_INTERFACE , ACC_ENUM и т. д. описаны спецификации Java Virtual Machine Specification.
This class. Ссылка на запись в пуле констант.
Super class. Ссылка на запись в пуле констант.
Интерфейсы. Количество интерфейсов, реализованных классом.
Количество полей. Количество полей в классе или интерфейсе.
Поля. После количества полей следует таблица структур переменной длины. По одной для каждого поля с описанием типа поля и названия (со ссылкой на пул констант).
Количество методов. Количество методов в классе или интерфейсе. Это число включает только методы, которые явно определены в классе, без методов, унаследованных от суперклассов.
Методы. Далее находятся сами методы. Для каждого метода содержится следующая информация: дескриптор метода (тип возвращаемого значения и список аргументов), количество слов, необходимых для локальных переменных метода, максимальное количество слов стека, необходимых для стека операндов метода, таблицу исключений, перехватываемых методом, байт-коды метода и таблица номеров строк.
Количество атрибутов. Количество атрибутов в этом классе, интерфейсе или модуле.
Атрибуты. После количества атрибутов следуют таблицы или структуры переменной длины, описывающие каждый атрибут. Например, всегда есть атрибут “SourceFile”. Он содержит имя исходного файла, из которого был скомпилирован class-файл.
Хотя class-файл напрямую не человекочитаемый, в JDK есть инструмент под названием javap, который выводит его содержимое в удобном формате.
Давайте напишем простую программу на Java, указанную ниже.
Давайте скомпилируем эту программу с помощью javac , которая создаст файл HelloWorld.class , и используем javap для просмотра файла HelloWorld.class . Запустив javap с параметром -v (verbose) для HelloWorld.class получим следующий результат:
Здесь вы можете увидеть, что класс публичный ( public ) и у него в пуле констант 37 записей. Есть один атрибут (SourceFile внизу), класс реализует два интерфейса (Serializable, Cloneable), у него нет полей и есть два метода.
Возможно, вы заметили, что в исходном коде есть только один статический метод main, но class-файл говорит, что есть два метода. Вспомните конструктор по умолчанию — это конструктор без аргументов, добавленный компилятором javac , байт-код которого также виден в выводе. Конструкторы рассматриваются как методы.
Больше почитать про javap вы можете здесь.
Совет: вы также можете использовать javap для того, чтобы увидеть, чем лямбды отличаются от анонимных внутренних классов.