чем является public static string text hello world в следующем коде
Lesson: A Closer Look at the «Hello World!» Application
Now that you’ve seen the «Hello World!» application (and perhaps even compiled and run it), you might be wondering how it works. Here again is its code:
The «Hello World!» application consists of three primary components: source code comments, the HelloWorldApp class definition, and the main method. The following explanation will provide you with a basic understanding of the code, but the deeper implications will only become apparent after you’ve finished reading the rest of the tutorial.
Source Code Comments
Comments are ignored by the compiler but are useful to other programmers. The Java programming language supports three kinds of comments:
The HelloWorldApp Class Definition
As shown above, the most basic form of a class definition is:
The main Method
In the Java programming language, every application must contain a main method whose signature is:
The modifiers public and static can be written in either order ( public static or static public ), but the convention is to use public static as shown above. You can name the argument anything you want, but most programmers choose «args» or «argv».
The main method is similar to the main function in C and C++; it’s the entry point for your application and will subsequently invoke all the other methods required by your program.
This array is the mechanism through which the runtime system passes information to your application. For example:
Each string in the array is called a command-line argument. Command-line arguments let users affect the operation of the application without recompiling it. For example, a sorting program might allow the user to specify that the data be sorted in descending order with this command-line argument:
The «Hello World!» application ignores its command-line arguments, but you should be aware of the fact that such arguments do exist.
uses the System class from the core library to print the «Hello World!» message to standard output. Portions of this library (also known as the «Application Programming Interface», or «API») will be discussed throughout the remainder of the tutorial.
1.5 Первая программа Java
1.5 Первая программа Java
Теперь давайте посмотрим на простую программу, написанную на языке Java.
1.5.1 Программа Hello World!
1.5.2 Описание «Hello World»
Теперь подробно разберёмся в коде и попробуем понять его синтаксис.
import j ava.io.*;
Эта строка объявляет класс по имени HelloWorld. При создании класса используется ключевое слово class вместе с именем класса/именем файла.
Обратите внимание: принято, чтобы имя класса начиналось с заглавной буквы.
Ключевое слово static позволяет методу main() вызываться без потребности создавать образец класса. К объекту класса нельзя обратиться, не создав это. Но в этом случае, есть копия этого метода, доступного в памяти после того, как класс расположен, даже если не был создан образец этого класса. Это важно, потому что JVM вызывает этот метод в первую очередь. Следовательно этот метод должен быть как static и не должен зависеть от экземпляров любого создаваемого класса.
Ключевое слово void говорит компилятору, что метод не возвращает никакого значения.
main ()— метод, который исполняет специфическую задачу. Это место с которого начинается выполнение всех приложений Java. Класс, который не имеет основного метода, может быть успешно откомпилирован, но не может быть выполнен, поскольку он не имеет отправной точки выполнения, которой является main() метод.
Эта запись отображает строку экране. Вывод строки осуществляется с помощью метода println (). println () отображает только строку, которая передаётся со справкой System.out.
Все инструкции в Java заканчиваются точкой с запятой (;).
Чтобы скомпилировать исходный текст, выполните команду javac, определяя название исходного файла в командной строке:
Рисунок 1.4: Компилирование файла a.java
Компилятор Java создает файл HelloWorld.class, который содержит байт-коды, и которые не могут быть непосредственно выполнены. Мы должны использовать интерпретатор Java, чтобы выполнить этот код-
Рисунок 1.5: Выполнение файла a.java
Вывод на экран отображается так:
Welcome to the world of Java
Создание класса в java
Создавать класс мы будем в программе Ecllipse, но также можно работать в любой другой IDE или в блокноте. В качестве примера мы будем создавать класс, который описывает характеристики и поведение кота.
В итоге, у нас создался новый класс (рис 5.2).
Структура класса в java
Класс в java оформляется с помощью следующей конструкции:
Рассмотрим ее составляющие:
public – модификатор доступа к классу, в данном случае он нам говорит, что этот класс будет доступен не только данному классу, но и другим. В java существуют и другие модификаторы, но об этого поговорим позднее.
class – ключевое слово, говорящее о том, что это класс.
Cat – имя класса. Имена классов принято писать с заглавной буквы.
< >– фигурные скобки, между которыми разместится тело нашего класса.
В предыдущем уроке мы упоминали, что классы в java состоят из атрибутов и методов, присвоим некоторые и нашему коту.
Атрибуты класса Сat
Атрибутами кота могут быть: имя, вес, окраска. Атрибуты это переменные, которые объявляются следующим образом:
private – здесь опять же указывает на права доступа. К переменной, в данном случае, можно обращаться только из ее класса, чтобы классы извне не могли ее изменить (вспомним инкапсуляцию из урока 4).
int, String – это типы данных. В данном случае вес будет задан при помощи целого числа – int, a имя и цвет при помощи символьной строки String.
После объявления каждого атрибута должна ставиться точка с запятой ;
При помощи // в коде программы оформляются комментарии, которые являются правилом хорошего тона.
Методы класса Сat
Пусть наш кот умеет есть, спать и разговаривать. Опишем это поведение с помощью методов.
public void eat() – сигнатура метода, его определение. В данном случае она нам говорит о том, что:
eat – имя метода. Имена методов, в отличие от имен классов, принято писать с маленькой буквы. На конце каждого метода после имени всегда идут круглые скобки ( ), пустые или содержащие параметры (об этом позднее).
После сигнатуры метода идут фигурные скобки < >. В них содержится тело метода. Тело нашего метода содержит просто вывод сообщения о том, что кот кушает — "Eating. \n". За вывод текстового сообщения отвечает метод System.out.print("Eating. \n").
\n — символ перевода строки, чтобы при выводе наших сообщений все они не писались в одну строку.
Аналогично предыдущему методу опишем спящего кота:
И немного иначе опишем метод – кот говорит:
В отличие от предыдущих методов этот метод возвращает значение и имеет входные параметры. Давайте подробнее рассмотрим сигнатуру метода public String speak(String words):
public — метод speak() доступен для других классов;
String — тип значения, которое возвращает метод. В предыдущих случаях ключевое слово void указывало на то, что метод ничего не возвращает. В данном случае String указывает на то, что метод возвращает значение типа строка.
Что же это значит? В процессе своей работы метод выполняет определенные действия над данными. Иногда необходимо, чтобы результат этих действий был передан для дальнейшей обработки другим классам, в этом случае метод передает (возвращает) этот результат. Эти возвращаемые данные относятся к какому-либо типу. В нашем примере это тип символьной строки, String.
Возвращающие методы должны содержать в своем теле ключевое слово return, которое указывает на то, что именно возвращает данный метод. В нашем случае это переменная phrase.
speak — имя метода.
(String words) — входные параметры. Входные параметры — это какие-либо данные, которые передаются из других классов и, которые метод должен обработать. Наш метод получает в качестве входных данных строку в виде переменной words, к этой строке дописывает «. mauu. » и возвращает то, что получилось.
В итоге класс Cat выглядит следующим образом:
Обращение к классу в Java
Далее рассмотрим обращение к классу Cat. И то, как его использовать в работе.
public static void main(String[] args) – сигнатура метода main(). Программа состоит из нескольких классов, но только один из классов может содержать метод main(). Mетод main(), это так называемая точка входа в программу. Без этого метода мы не сможем стартовать программу. Теперь, вместо приветствия миру, этот метод будет содержать код для работы с классом Cat.
Пишем в тело метода main() (между его фигурными скобками) следующие строки:
Разберем подробнее, что это значит.
Прежде чем вызывать созданные нами методы в классе Cat и заставить нашего кота есть, спать и говорить, сперва нужно создать экземпляр класса (инстанцию).
Данная строчка нам говорит о том, что в памяти создан экземпляр объекта Cat, а переменная ourcat типа Cat (такого же, как и наш объект) указывает на то место в памяти, где был этот объект создан.
Переменную ourcat теперь можно использовать для вызова методов класса Cat, например:
При вызове этих методов в программе Eclipse удобно пользоваться комбинацией клавиш
Ctrl + пробел, после введения имени переменной и точки (рис 5.4). Программа подскажет, какие можно использовать методы для данной переменной.
Если метод возвращает какое-либо значение, например, как наш метод speak() возвращает значение типа String, то его можно вызывать следующим образом:
Вспомним, что при описании нашего метода он содержал параметры speak(String words). Теперь, при вызове в качестве параметра выступила фраза "Play with me", метод speak() ее обработал и вернул "Play with me. mauu. ". Именно это значение он присвоил переменной say.
Мы это можем проверить, выведя say на печать при помощи команды:
Итак, наш класс HelloWorld теперь выглядит следующим образом:
Теперь сохраним (Ctrl+Shift+S или ) и запустим (
) нашу программу. При запуске Eclipse может предложить выбрать Java Applet или Java Application. Нужно выбрать Java Application (рис 5.5).
В качестве результата внизу в консоли мы получаем следующие строки.
На этом закончим данный урок, итак, в этом уроке мы:
Для закрепления материала предлагаю самостоятельно создать класс Dog, где описать характеристики и поведение собаки, а потом вызвать этот класс из HelloWorld. Свои вопросы можете оставлять в комментариях.
Комментариев к записи: 115
Добрый день, Мария. Объяснения просто супер четко и понятно, но вопросы все — таки возникли. При создании нового класса создаются файлы, как я понял несколько — один формата JAVA, второй формата CLASS. Верно или я что — то путаю? Если, к примеру существует файл формата CLASS, но без файла с форматом JAVA, существует ли возможность прочесть его код? Можете более подробно описать структуру создаваемых файлов, может быть в отдельной главе.
Спасибо за статью и заранее спасибо за ответ.
Здравствуйте, не могу запустить вашу программу на Netbeans. Программа выдает такой результат:
Error: Could not find or load main class project1.Project1
Java Result: 1
public class HelloWorld <
public static void main(String[] args) <
cat ourcat= new cat();
ourcat.eat();
ourcat.sleep();
String say = ourcat.speak(«Play with me»);
System.out.println(say);
// TODO Auto-generated method stub
>
Посмотрите в первой строчке слово сat получается написать только с маленькой буквы, если написать Сat c большой выскакивает ошибка :Multiple markers at this line как её можно исправить?
А вы когда создавали класс Cat вы его с какой буквы назвали?
Вот поэтому с большой и не получается. В Java имена классов, методов, переменных чуствительны к регистру. Сat и cat это разные имена, и если вы создали класс и назвали cat, то класса Cat не существует. А еще есть соглашение по оформлению кода в Java (Java Code Conventions), согласно которому классы нужно называть только с большой буквы, а переменные и методы с маленькой. Поэтому переименовывайте
Добрый день, подскажите пожалуйста, как работает переменная phase в описанном вами примере в методе //кот разговаривает. Не понятно куда phase возвращается и как задействовано. У меня программа выдает ошибку в этом месте.
Переменная в моем примере называется phrase, может вы ее в разных местах по-разному назвали, из-за этого ошибка? Было бы хорошо, если бы вы указали какая имено ошибка, ато они разные бывают, а я не экстрасенс)
Работает так: в методе main вы вызываете метод speak, как это описано в примере.
String say = ourcat.speak(«Play with me»);
Фраза «Play with me» передается методу speak в переменную words. Затем в методе speak объявляется новая строковая пременная phrase. Этой переменной присваивается значение переменной words («Play with me» ) и плюс строка «…mauu…» Итого в переменной phrase имеем строку «Play with me…mauu…». Эту строку мы возвращаем, тоесть передаем туда, где был вызван метод speak в методе main.
Вызван он был так
String say = ourcat.speak(«Play with me»)
Результатом работы ourcat.speak(«Play with me») является строка «Play with me…mauu…», следовательно переменная String say теперь содержит строку «Play with me…mauu…»
Извините, забыл дописать описание ошибки
Reports unnecessary local variables, which add nothing to the comprehensibility of a method. Variables caught include local variables which are immediately returned, local variables that are immediately assigned to another variable and then not used, and local variables which always have the same value as another local variable or parameter.
Так у вас это ошибка или предупреждение? Ошбика это Error, если в коде есть ошибки, то его нельзя скомпилировать. Предупреждение это Warning, подчеркивается желтым и с ним можно жить и компилироваться. В данном случае джава считает, что переменная используется избыточно, и можно обойтись и без нее. Обойтись можно, но данный пример был приведен для наглядности передачи параметров в метод и возвращения значения.
понятно, я разобрался. Спасибо за ваше терпение.
Здравствуйте.
Не могу понять, где ошибка.
[img]http://u.pikucha.ru/idgcn/2014-06-24+21-26-08+%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82+%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0.png?referrer=http%3A%2F%2Fpikucha.ru%2F[/img]
C уважением, Ирина.
Добрый день, Ирина, у вас скобок не хватает после new Cat: ourcat= new Cat();
Спасибо огромное! Это все моя невнимательность. Вы, кажется, где-то поясняли про эти скобки. но я еще не совсем уяснила, где конкретно их требуется ставить.
Java байткод «Hello world»
На хабре уже есть статья про java байткод. Я решил ее немного дополнить и в меру сил развить тему. Мне кажется довольно логичным разобрать простейшее приложение на Java. А что может быть проще «Hello world»?
Для своего эксперимента я создал директорию src, куда в папку hello положил файл App.java:
Скопилируем файл командой:
На выходе в папке classes у меня появился файл App.class Для начала сравним размеры java и class файлов.
App.java 139B
App.class 418B
Это было неожиданно. Мне почему-то казалось, что скомпилированный файл должен быть меньше. Попытаюсь открыть class файл:
Довольно непривычный вид для Java кода. Попробуем с помощью описание формата class файлов понять, что здесь закодировано.
Это 4 байта для magic, который определяет формат файла.
minor version — Минорная версия как следует из названия
major version — 2 байта под мажорную версию.
Сочетание minor и major version говорит о том, что я компилировал этот код с помощью J2SE 8.
Эти два байта представляют constant_pool_count и отвечают за размер constant_pool. В моем случае count равен 29, а размер пула, соответственно 28. Дальше идут элементы вида:
cp_info <
u1 tag; // 1 байт на тег
u1 info[]; // массив с описанием
>
Рассмотрим элементы в constant_pool.
Этот тег соответствует CONSTANT_Methodref, а значит дальше должно быть описание:
CONSTANT_Methodref_info <
u1 tag;
u2 class_index;
u2 name_and_type_index;
>
соответственно:
class_index, указывает на 6 элемент в constant_pool
name_and_type_index, указывает на 15 элемент в constant_pool
Пока не понятно, на какой метод указывает эта ссылка и мы идем дальше:
Это CONSTANT_Fieldref, а значит дальше ищем:
CONSTANT_Fieldref_info <
u1 tag;
u2 class_index;
u2 name_and_type_index;
>
И тут все очень похоже на предыдущий элемент, хотя не понятно что это за поле, в своем классе я вроде ничего такого не объявлял.
class_index в 16 элементе
name_and_type_index в 17 элементе
tag для CONSTANT_String
получаем, что самое интересное лежит в 18 элементе:
Tag соответствующий ссылке на метод:
класс которого описан в 19 элементе
a название и тип в 20 элементе:
5-ый элемент:
Tag для CONSTANT_Class
название, которого в 21 элементе
6-ой элемент:
Cнова CONSTANT_Class
c названием в 22 элементе
Как мы помним 1-ый элемент constant_pool относится к этому классу.
7-ой элемент:
tag, CONSTANT_Utf8, первая строчка
Она должна соответствовать:
CONSTANT_Utf8_info <
u1 tag;
u2 length;
u1 bytes[length];
>
Тогда длина нашей строчки 6 байт:
Это особое название, так помечаются конструкторы.
строчка длины 3 — «()V»:
Это описание нашего конструктора без параметров, который был упомянут в седьмом элементе.
9-ый элемент:
CONSTANT_Utf8
10-ый элемент:
Строка LineNumberTable
15-ый элемент
Tag, соответствует CONSTANT_NameAndType
а значит нам понадобится
CONSTANT_NameAndType_info <
u1 tag;
u2 name_index;
u2 descriptor_index;
>
и тогда:
ссылка на 7 элемент
ccылка на 8 элемент
Учитывая что первый элемент ссылался на это, мы можем заключить что первым был объявлен конструктор класса без параметров. Название класса, мы должны найти в 22 элементе.
16-ый элемент:
Tag, для CONSTANT_Class
c названием в 23 элементе
17-ый элемент:
Tag, CONSTANT_NameAndType, со ссылкой на 24 и 25 элемент constant_pool
18-ый элемент:
Ура «Hello world!»
19-ый элемент:
Tag, для CONSTANT_class c названием в 25-ом элементе
20-ый элемент:
Tag CONSTANT_NameAndType cо ссылкой на 27 и 28 элемент
25-ый элемент:
«Ljava/io/PrintStream;»
26-ой элемент:
«java/io/PrintStream»
methods_count у нас 2 метода в классе, конструктор по умолчанию и метод main:
Method 1 — Constructor
Один из самых интересных аттрибутов с кодом нашего метода code[code_length], разбор инструкций отдельная большая тема:
Аттрибут закончился и продолжается описание метода
Attribute 1 код метода main
Описание методов закончено и идет описание атрибутов класса
Теперь когда мы закончили с по-байтовым разбором class файла, становится понятно как работает:
Он автоматически выводит тоже самое, что я выписал руками:
А вот здесь можно посмотреть пример разбора class файла:
Русские Блоги
Генерация файла Smali
Следующее по-прежнему предыдущее Hello.java Например:
javac Генерировать Hello.class Файл, а затем через собственный SDK dx Создание инструмента Hello.dex Файл, команда выглядит следующим образом:
dx Инструменты находятся в SDK build-tools Под каталогом его можно добавить в переменную окружения для облегчения вызова. dx Он также поддерживает несколько файлов классов для генерации dex.
После завершения выполнения он будет сгенерирован в текущем каталоге. out Папка, папка содержит сгенерированные smali файл.
Смали подробный анализ
Давайте сначала посмотрим на сгенерированный Hello.smali содержание документа:
Заголовок файла
Сначала посмотрите на заголовок файла:
.class За ним следует модификатор доступа и текущий класс, где имя класса LHello Сказал. Тогда это L Что это собой представляет? Фактически, такое представление также появилось в предыдущем файле класса.Инструкции байт-кода JVM и инструкции байт-кода Dalvik во многих местах схожи. Java делится на базовые типы и ссылочные типы, для которых в DalviK используются разные методы описания. Для базового типа и типа Пустота оба представлены заглавной буквой. Для справочных типов используйте буквы L Добавьте полное имя типа объекта, чтобы указать его. Конкретные правила показаны в следующей таблице:
Тип Java | Дескриптор типа |
---|---|
char | C |
byte | B |
short | S |
int | I |
long | J |
float | F |
double | D |
boolean | Z |
void | V |
Объект | L |
Массив | [ |
Представительство на местах
Представление метода
clinit
clinit Метод инициализирует статические переменные и выполнит блок статического кода.Этот метод вызывается при загрузке класса. Построчно проанализируйте логику выполнения метода:
.registers 1 : Количество регистров, необходимых для этого метода. Как упоминалось ранее, DalviK VM основана на регистрах.Количество виртуальных регистров, которые могут использоваться байт-кодом, составляет до 65536. Каждый регистр имеет 32 бита, а 64-битные данные представлены двумя соседними регистрами. Наконец, все виртуальные регистры будут сопоставлены с реальными физическими регистрами. В основном мы используем буквы v Представляет регистры, используемые локальными переменными, используя буквы p Указывает регистр, используемый параметром, регистр, используемый локальной переменной, располагается первым, а регистр, используемый параметром, расположен позади. Здесь это значит clinit В методе используется только один регистр.
.prologue : Указывает на начало логического кода
.line 3 : Представляет количество строк в исходном файле Java
const-string v0, «Hello World!» : Строка Hello World! Перенести ссылку в реестр v0 в.
sput-object v0, LHello;->HELLO_WORLD:Ljava/lang/String; : Префикс s из sput с sget Инструкции используются для чтения и записи статических полей. регистр v0 Сохраненная строковая ссылка назначается HELLO_WORLD Поле, объединенное с предыдущим байт-кодом, это статическая переменная HELLO_WORLD Работа по заданию также проверена clinit Метод инициализирует статические переменные.
return-void : Указывает, что метод не имеет возвращаемого значения
.end method : Указывает конец выполнения метода
сюда, clinit Метод окончен. Следующий анализ init метод.
И остальное clinit Метод тот же, напрямую смотрим логику исполняемого кода:
Invoke-direct используется для вызова нестатических прямых методов (то есть методов экземпляра, которые не могут быть переопределены по своей природе, то есть методов или конструкторов частного экземпляра). Очевидно, здесь вызывается конструктор по умолчанию.
В заключение main Метод, который мы видим из кода smali выше main Метод использует 3 регистра и не имеет возвращаемого значения (это точно). Конкретный исполняемый код представляет собой следующие три строки:
сюда, Hello.smali Файл проанализирован. Конечно, любой файл smali, с которым мы сталкиваемся в процессе декомпиляции, определенно более сложен, чем этот. Официальный сайт Android также суммировал набор инструкций байт-кода Dalvik, адресhttps://source.android.google.cn/devices/tech/dalvik/dalvik-bytecode. Если в процессе чтения вы встретите незнакомые инструкции, вы можете найти их на этой странице.
Один последний java Очередь smali Ярлык для IDEA Или Android Studo Установить плагин java2smali В Build Появится под строкой меню Compile to smali Вариант, вы можете быстро преобразовать код java в код smali. В процессе изучения smali, если мы сталкиваемся с неопределенным содержанием, мы можем сначала написать код java, а затем превратить его в код smali для сравнительного обучения.
Наконец, опубликуйте полный аннотированный Hello.smali файл:
следующий Просто изучите небольшое представление некоторого общего синтаксиса, такого как математические операции, if-else, циклы и так далее.
Bingxin сказал, сосредоточьтесь на обмене оригинальными знаниями Java / Android, решении проблемы LeetCode, одно чтение и обмен каждую неделю, добро пожаловать, чтобы отсканировать код, чтобы следовать!
Отвечайте в «групповом чате» в фоновом режиме, присоединяйтесь к группе читателей Bingxinshuo, интересной группе обмена вопросами и ответами, и, самое главное, иногда появляются красные конверты!