Материал: LW №7. Java. Foundations

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

В данном случае адресатом оператора цикла for служит блок кода, а не единственный оператор. Таким образом, на каждом шаге цикла будут выполняться три оператора из блока кода. Об этом свидетельствует и результат выполнения программы.

Блоки кода обладают дополнительными свойствами и областями применения. Но их основное назначение – создание логически неразрывных единиц кода.

ПРОБЕЛЫ

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

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

ИДЕНТИФИКАТОРЫ

Для именования классов, методов и переменных служат идентификаторы. Идентификатором может быть любая последовательность строчных и прописных букв, цифр или символов подчеркивания и денежной единицы. Идентификаторы не должны начинаться с цифры, чтобы компилятор не путал их с числовыми константами. В Java учитывается регистр символов, и поэтому VALUE и Value считаются разными идентификаторами. Несколько допустимых идентификаторов: AvgTemp, count, a4, $test, this_is_ok. Следующие идентификаторы недопустимы: 2count, high-temp, Not/ok. Начиная с версии JDK 8, один знак подчеркивания не

рекомендуется употреблять в качестве идентификатора.

ЛИТЕРАЛЫ

ВJava постоянное значение задается его литеральным представлением.

Вкачестве примера можно привести несколько литералов: 100, 98.6, 'X', "This is a test". Первый литерал в данном примере обозначает целочисленное значение, следующий – числовое значение с плавающей точкой, третий – символьную константу, а последний – строковое значение. Литерал можно использовать везде, где допустимо применение значений данного типа.

РАЗДЕЛИТЕЛИ

ВJava допускается применение нескольких символов в качестве

разделителей. Чаще всего в качестве разделителя употребляется точка с запятой. Но, как следует из приведенных ранее примеров программ, точка с

11

запятой употребляется также для завершения строк операторов. Символы, допустимые в качестве разделителей, перечислены в таблице ниже.

Таблица – Символы, допустимые в качестве разделителей

Символ

Назначение

()

Употребляются для передачи списков параметров в определениях и вызовах

 

методов. Применяются также для обозначения операции приведения типов и

 

предшествования операторов в выражениях, употребляемых в управляющих

 

операторах

{}

Употребляются для указания значений автоматически инициализируемых

 

массивов, а также для определения блоков кода, классов, методов и локальных

 

областей действия

[]

Употребляются для объявления типов массивов, а также при обращении к

 

элементам массивов

;

Завершает операторы

,

Разделяет последовательный ряд идентификаторов в объявлениях

 

переменных. Применяются также для создания цепочек операторов в

 

операторе цикла for

.

Употребляется для отделения имен пакетов от подпакетов и классов, а также

 

для отделения переменной или метода от ссылочной переменной

БИБЛИОТЕКИ КЛАССОВ JAVA

Вприведенных примерах программ использовались два встроенных метода println() и print(). Эти методы доступны по ссылке System.out на класс System, который является стандартным Java и автоматически включается в прикладные программы. В более широком смысле среда Java опирается на несколько встроенных библиотек классов, содержащих многие встроенные методы, обеспечивающие поддержку таких операций, как ввод-вывод, обработка символьных строк, работа в сети и отображение графики. Стандартные классы обеспечивают также поддержку графического пользовательского интерфейса. Таким образом, среда Java в целом состоит из самого языка Java и набора его стандартных классов. Библиотеки классов предоставляют большую часть функциональных возможностей среды Jаvа.

КЛЮЧЕВЫЕ СЛОВА JAVA

Внастоящее время в языке Java определено довольно много ключевых слов (таблица ниже), которые вместе с синтаксисом операторов и разделителей образуют основу языка Java. Их нельзя использовать ни в качестве идентификаторов, ни для обозначения имен переменных, классов или методов.

Таблица – Ключевые слова Java

abstract

continue

for

new

switch

assert

default

goto

package

synchronized

boolean

do

if

private

this

break

double

implements

protected

throw

12

byte

else

import

public

throws

case

enum

instanceof

return

transient

catch

extends

int

short

try

char

final

interface

static

void

class

finally

long

strictfp

volatile

const

float

native

super

while

Кроме ключевых слов, в Java зарезервированы также слова true, false и null. Они представляют значения, определенные в спецификации языка Jаvа. Их нельзя использовать для обозначения имен переменных, классов и т.п. Рассмотрим ключевые слова Java разделённые по группам.

Примитивные типы данных: byte, short, int, long, char, float, double, boolean

Циклы и ветвления: if, else, switch, case, default, while, do, break, continue, for

Исключения: try, catch, finally, throw, throws Области видимости: private, protected, public

Объявление \ Импорт: import, package, class, interface, extends, implements, static, final, void, abstract, native

Создание \ Возврат \ Вызов: new, return, this, super Многопоточность: synchronized, volatile

Ключевые слова, которые не вошли ни в одну из групп: const, goto, instanceof, enum, assert, transient, strictfp.

Java является объектно-ориентированным языком программирования. ООП — методология программирования, основанная на представлении программного продукта в виде совокупности объектов, каждый из которых является экземпляром конкретного класса. ООП использует в качестве базовых элементов взаимодействие объектов.

Объект — именованная модель реальной сущности, обладающая конкретными значениями свойств и проявляющая свое поведение. Объектноориентированное программирование основано на принципах:

инкапсуляции;

наследования;

полиморфизма, в частности, «позднего связывания».

ВJava все объекты программы расположены в динамической памяти

куче данных (heap) и доступны по объектным ссылкам, которые, в свою очередь, хранятся в стеке (stack). Это решение исключило непосредственный доступ к памяти, но усложнило работу с элементами массивов и сделало ее менее эффективной по сравнению с программами на C++. В свою очередь, в Java предложен усовершенствованный механизм работы с коллекциями, реализующими основные динамические структуры данных. Необходимо отметить, что объектная ссылка языка Java содержат информацию о классе объекта, на который она ссылается, так что объектная ссылка — это не

13

указатель, а дескриптор (описание) объекта. Наличие дескрипторов позволяет JVM выполнять проверку совместимости типов на фазе интерпретации кода, генерируя исключение в случае ошибки. В Java изменена концепция организации динамического распределения памяти:

отсутствуют способы программного освобождения динамически выделенной памяти. Вместо этого реализована система автоматического освобождения памяти (сборщик мусора), выделенной с помощью оператора new. Программист может только рекомендовать системе освободить выделенную динамическую память.

В отличие от C++, Java не поддерживает множественное наследование классов, перегрузку операторов, беззнаковые целые, прямое индексирование памяти и, как следствие, указатели. В Java

существуют конструкторы, но отсутствуют деструкторы (применяется автоматическая сборка мусора), не используется оператор goto и слово const, хотя они являются зарезервированными словами языка.

ОСНОВЫ КЛАССОВ И ОБЪЕКТОВ JAVA

Классы в языке Java объединяют поля класса, методы, конструкторы, логические блоки и внутренние классы. Основные отличия от классов C++: все функции определяются внутри классов и называются методами; невозможно создать метод, не являющийся методом класса, или объявить метод вне класса; спецификаторы доступа public, private, protected воздействуют только на те объявления полей, методов и классов, перед которыми они стоят, а не на участок от одного до другого спецификатора, как в С++; элементы по умолчанию не устанавливаются в private, а доступны для классов из данного пакета. Объявление класса имеет вид:

[спецификаторы] class ИмяКласса [extends СуперКласс] [implements список_интерфейсов] {

/* определение класса */

}

Спецификатор доступа к классу может быть public (класс доступен в данном пакете и вне пакета), final (класс не может иметь подклассов), abstract (класс может содержать абстрактные методы, объект такого класса создать нельзя). По умолчанию, если спецификатор класса не задан, то он устанавливается в дружественный (friendly, default). Такой класс доступен только в текущем пакете. Спецификатор friendly при объявлении вообще не используется и не является ключевым словом языка. Это слово используется в сленге программистов, чтобы как-то коротко обозначить значение по умолчанию.

Класс наследует все свойства и методы суперкласса, указанного после ключевого слова extends, и может включать множество интерфейсов, перечисленных через запятую после ключевого слова implements.

14

Интерфейсы очень похожи на абстрактные классы, содержащие только константы и сигнатуры методов без их реализации.

Все классы любого приложения условно разделяются на две группы: классы — носители информации и классы, работающие с информацией. Классы, обладающие информацией, содержат данные о предметной области приложения. Например, если приложение предназначено для управления воздушным движением, то предметной областью будут самолеты, пассажиры и пр. При проектировании классов информационных экспертов важна инкапсуляция, обеспечивающая значениям полей классов корректность информации. У класса House, например, может быть поле numberWindows, значение которого не может быть отрицательным. С помощью инкапсуляции ключевым словом private закрывается прямой доступ к значению поля через объект, а метод, отвечающий за инициализацию значения поля, будет выполнять проверку входящего значения на корректность. В качестве примера с нарушением инкапсуляции можно рассмотреть класс Coin в приложении по обработке монет.

//Пример №6. Использование класса package by.bsuir.java.first; class Coin {

public double diameter; // нарушение инкапсуляции private double weight; // правильная инкапсуляция public double getDiameter() {

return diameter;

}

public void setDiameter(double value) { if (value > 0) {

diameter = value; } else {

diameter = 0.01; // значение по умолчанию

}

}

//некорректно: неправильное имя метода (это метод getWeight) public double takeWeight() {

return weight;

}

public void setWeight(double weight) { this.weight = weight;

}

}

Класс Coin содержит два поля diameter и weight, помеченные как public и private соответственно. Значение поля weight можно изменять только при помощи методов, например, setWeight().

Поле diameter доступно непосредственно через объект класса Coin. Поле, объявленное таким способом, считается объявленным с нарушением

15