Прежде чем вот так сразу писать программу давайте все же кратко сформулируем правила игры. Информация, которую я ниже изложу, для многих читателей вероятно известна, для других она более или менее понятна интуитивно, поэтому я не буду подробно все объяснять. Для тех же, кому было непонятно, советую обратиться к стандартным книгам по Java. Там как раз это очень любят подробно объяснять. Можно даже просто поискать незнакомые слова в строке поиска Яндекса. Сейчас появилось модное словечко погуглить
имея в виду использовать поисковую машину Гугла. Но Яндекс в русско-язычных файлах лучше ищет. Итак, система аксиом.
( 1 )
Структурными единицами языка программирования Java являются классы. Класс -- это кусок программного кода, описывающий свойства объектов данного класса. Грубо говоря, это мини-программа с входными данными и выдачей результатов, оформленная специальным образом. Приставка мини написана условно, так как классы могут быть и очень большими программами. Важно, что это не вся программа, а только ее часть. Каждый класс может быть наследником одного другого класса и поддерживать несколько интерфейсов. При этом все методы класса родителя применимы и к классу наследнику, а в самом классе можно определить все методы, декларированные в интерфейсах.
( 2 )
Как всякая программа класс имеет свой собственный набор переменных и набор процедур или точнее функций, которые снова имеют входные параметры, но на выходе выдают только один объект или переменную или ничего. Объекты можно условно понимать как те же переменные, но более сложной структуры, которая как раз определяется классом. Почему то переменные (и объекты), используемые в классе, принято называть полями (fields), а функции -- методами (methods). Общие переменные класса действуют в пределах всего класса, но каждый метод может иметь свои внутренние переменные, недоступные другим методам. Это называется динамическая память. Переменных определяется огромное количество, многие на один раз, причем с тем же самым названием, и потом они не используются. Таким способом легко забить память компьютера мусором. Но вам не стоит беспокоиться об этом. В языке Java предусмотрен автоматический сборщик мусора, который сам очищает память от отработавших переменных, когда ему вздумается. Но все же иногда проблемы могут возникать. Тогда можно заставить сборщик мусора поработать почаще в принудительном порядке. Такой стиль программирования очень удобен для программиста, но не для программы. Многие говорят, что Java сильно тормозит, имея в виду именно такие вот ситуации. Но посмотрите как быстро растет скорость процессоров. Есть даже закон Мура, согласно которому скорость процессора удваивается каждые восемнадцать месяцев. И чем лучше компьютер, тем меньше проблем при программировании на Java.
( 3 )
Поля и методы класса разделяются на общие (public) и внутренние (private, protected, final или по умолчанию). Очевидно, что если бы не было общих полей и методов, то объекты класса оказались бы черными дырами и не могли взаимодействовать с окружающим миром. Но интересно, что и сами классы тоже могут иметь приставку public. Она необходима в том случае, если класс записан в отдельный файл, при этом файл должен иметь то же самое название, как и класс. Внутри этого файла могут быть другие классы, но уже без приставки public. Сами классы могут быть разными. Может быть не только несколько классов в одном файле, но и классы внутри классов. Иногда это удобно, но для новичков это сложно, и мы пока про это думать не будем.
( 4 )
В обычных условиях под каждый объект класса выделяется отдельный участок памяти компьютера так, что разные объекты одного и того же класса располагаются в памяти не перекрываясь. Причем программисту не дано знать реальных адресов памяти компьютера. Это зависит от конкретной ситуации на компьютере в каждый момент времени и специально сделано в целях безопасности. То есть при этом у программы нет доступа к реальным ячейкам памяти компьютера и она неспособна что-либо испортить за пределами ее компетентности. Но есть специальные статические поля и методы, которые снабжаются приставкой static. Эти поля и методы не принадлежат объектам класса, а принадлежат самому классу. Это как раз та отдушина для программистов старой школы, за которую можно ухватиться и написать на Java программу в старом стиле, то есть вообще без объектов. Увы, без статических полей и методов программу написать сложно. Можно конечно, но сложно. Вот простой пример. Есть стандартные функции sin, cos, exp и так далее. Они, как говорят, и в Африке точно такие же. Это совершенно общие методы и где же их определять, если кроме классов ничего нет. Вот и придумали специальный класс Math, в котором все эти функции определены как статические. И вы можете смело в любом месте программы писать Math.sin(x) и так далее, так как метод sin(x) определен как public static метод класса Math.
( 5 )
Правила грамматики. Объект класса вводится в игру через вызов специального метода, называемого конструктором, и понятного слова new
(новый). Например, String txt = new String("любой текст")
. Это мы определили объект класса String с названием "txt" и передали ему на хранение текстовую строку, как аргумент конструктора это класса. У нас появился новый объект txt. Теперь мы может применить к нему все методы класса String, например, txt.equals("любой")
. Методы, то есть функции класса, приписываются своим названием к объекту через точку. Метод equals() выдает значение логической переменной: правда (true) или ложь (false) в зависимости от того, совпадает ли объект txt
со строкой любой
. В данном случае будет false. Еще раз, все нормальные методы и поля класса относятся к объектам. А статические методы и поля относятся к имени класса, так как они имеют фиксированное место в памяти компьютера и не размножаются. По этой причине, если у вас есть свои функции общего назначения, типа sin(), и вы хотите завести переменные (объекты), общие для всей программы, то необходимо в специальном файле открыть специальный класс с названием, например, MyPro
и собрать там все ваши общие переменные и функции. Только не забудьте приставить к ним магические слова public static.
( 6 )
В Java есть 8 типов переменных: byte, short, int, long, float, double, boolean, char. Первые четыре типа -- это целые числа длиной 1,2,4 и 8 байтов на число. Все числа знаковые, то есть, например, byte имеет диапазон от -128 до 127. Таким образом, чтобы получить ASCII код из байта к отрицательному
числу надо прибавить 256. Именно так, число -1 перейдет в 255. Такова запись чисел в компьютере (обратный код, отрицательные числа не вычитаются
а складываются). Далее, пятый и шестой -- реальные числа длиной 4 и 8 байтов. Затем логические переменные, которые имеют два значения true
и false
. И, наконец, символы алфавита. В языке Java они двухбайтовые и описывают юникоды. Первые 127 совпадают с ASCII кодами, а вот русские символы в Windows кодировке переходят в юникоды русских знаков, если к отрицательному значению байта прибавить число 1104. Символы char обозначаются как 'a', а строки как "a". Это существенная разница и лучше не делать ошибок. Символы одним апострофом, текст -- двумя. Есть еще специальные символы, введенные впервые в языке С и потом перенесенные во все языки, а именно, \n
(10), \r
(13), \f
(12), \t
(9), \b
(8), \'
, \"
, \\
. В скобках указаны значения ASCII кода. Апострофы и сама наклонная обратная черта тоже пишется с чертой, чтобы не спутать с символами операторов. Также существует стандартный набор арифметических, логических и прочих операторов. Так как это достаточно самоочевидные вещи, то их можно специально и не обсуждать, пока еще не написано ни одной программы.
( 7 )
Несколько слов о массивах. Массивы в Java используют индексы в квадратных скобках. Элементами массивов могут быть не только переменные, но и любые объекты, в том числе и сами массивы. По этой причине все массивы одномерные, а многомерные массивы -- это массивы из массивов. Индексы массивов
начинаются от нуля. К этому тоже надо привыкнуть, так как это не очевидно. Массивы необходимо объявлять аналогично объектам, но конструктор содержит только размер массива. Например, int[] ia = new int[25]
, int[] ib = new int[4]
, int[][] all = {ia[], ib[]}
. Здесь последний массив задан перечислением, это тоже возможно. Обратите внимание, что массив all
-- не квадратный. Он имеет элементы all[0][0] ... all[0][24],all[1][0] ... all[1][3]
.
( 8 )
Самая последняя информация касается уже не столько языка, сколько организации кода. Как я уже сказал, можно писать каждый класс в отдельный файл с расширением java, можно писать много классов в один файл. Но еще можно много файлов распределить по папкам. Пусть, например, файл помещен в папку com\my\
относительно папки, в которой находится файл головного класса программы. В этом случае в этом файле первой строкой должно идти сообщение
а в головном файле при ссылке на класс данного файла необходимо указать
Но для простых программ так делать необязательно. Важно другое. Все готовые классы Java тоже распределены по папкам. Иногда при указании на класс необходимо указывать весь путь к файлу во избежание конфликтов. Но часто можно указать папки в которых, находятся файлы заранее и потом писать классы просто по имени. Таким образом, строки типа
нам определенно понадобятся. Узнать какой класс в какой папке находится можно разными способами. Либо посмотреть в API, либо если у вас их нет, что маловероятно, можно просто посмотреть в zip файл "src.zip" в папке "c:\jdk1701\" где записан ваш компилятор. В этом файле находятся все папки и в них все файлы с кодом классов, которые существуют в виртуальной машине в готовом виде.