Основы программирования на языке Java

advertisement
Основы программирования на
языке Java
Алгоритмические средства Java
(С) Всеволод Рылов, все права защищены
Новосибирск, 2004
1
Лексическая структура программы


Текст единицы компиляции состоит из символов
Unicode (используется версия 2.1 www.unicode.org)
Первичная трансляция (обработка) исходного
включает следующие этапы:
1)
2)
3)
расширение escape-последовательностей вида \uXXXX, где
X – шестнадцатеричные символы
трансляция потока полученного на шаге 1 в
последовательность входных символов и терминаторов
строки (LF, CR)
трансляция потока полученного на шаге 2 в
последовательность входных элементов, которая, после
удаления комментариев и пробелов состоит из лексем и
терминальных символов грамматики
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
2
Escape последовательности unicode
UnicodeInputCharacter:
UnicodeEscape
RawInputCharacter
UnicodeEscape:
\ UnicodeMarker HexDigit HexDigit HexDigit HexDigit
UnicodeMarker:
u
UnicodeMarker u
RawInputCharacter:
any Unicode character
HexDigit:
one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
Учитывается “четность” количества символов ‘\’, и номер прохода:
“\\u2297=\u2297” транслируется в “ \ u 2 2 9 7 =
“
“\u005Cu005A” транслируется в “ \ u 0 0 5 A” , но не в “z”
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
3
Специальные символы
LineTerminator:
the ASCII LF character, also known as "newline"
the ASCII CR character, also known as "return"
the ASCII CR character followed by the ASCII LF character
InputCharacter:
UnicodeInputCharacter but not CR or LF
WhiteSpace:
the ASCII SP character, also known as "space"
the ASCII HT character, also known as "horizontal tab"
the ASCII FF character, also known as "form feed"
LineTerminator
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
4
Последовательность входных элементов
Input:
InputElementsopt Subopt
InputElements:
InputElement
InputElements InputElement
InputElement:
WhiteSpace
Comment
Token
Token:
Identifier Keyword Literal Separator Operator
Sub:
the ASCII SUB character, also known as "control-Z"
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
5
Комментарии в тексте программы
/** многострочный документирующий комментарий java */
/* традиционный многострочный комментарий в стиле C */
// традиционный комментарий в стиле C++
 Комментарии не могут быть вложенными.
 символы /* и */ не имеют специального значения в
комментариях, начинающихся с символов //.
 символы // не имеют специального значения в
комментариях, начинающихся с символов /* или /**.
/* Данный комментарий /* // /** оканчивается здесь: */
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
6
Идентификаторы
Identifier:
IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars:
JavaLetter
IdentifierChars JavaLetterOrDigit
JavaLetter:
any Unicode character that is a Java letter
JavaLetterOrDigit:
any Unicode character that is a Java letter-or-digit
Символы Java включают в себя ASCII символы A-Z
(\u0041-\u005A), a-z (\u0061-\u007A), _ (\u005F), $
(\u0024)
Цифры Java включают цифры ASCII 0-9 (\u0030-\u0039)
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
7
Идентификаторы


Два идентификатора совпадают только если совпадают
Unicode коды всех символов из которых они состоят
Символы в идентификаторе могут иметь одинаковое
начертание, но различаться по кодам:



LATIN CAPITAL LETTER A (A, \u0041) и GREEK CAPITAL LETTER
ALPHA (A, \u0391)
LATIN SMALL LETTER A (a, \u0061), and CYRILLIC SMALL
LETTER A (a, \u0430)
Примеры допустимых идентификаторов:
String
Новосибирск, 2004
i3
MAX_VALUE isLetterOrDigit
(С) Всеволод Рылов, все права защищены
8
Ключевые слова
Keyword: one of
abstractdefault
do
double
else
extends
catch
if
implements
import
instanceof
int
private
protected
public
return
short
this boolean
throw break
throws byte
transient case
try
class
final
finally
float
interface
long
native
static
strictfp
super
void char
volatile
while
const
goto
for
package
new
synchronized
switch
assert
continue
enum
Слова goto и const зарезервированы.
Ключевое слово assert введено в JDK 1.4, enum – в JDK 1.5
true, false и null технически являются литерными константами
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
9
Литерные константы (literals)
Literal:
IntegerLiteral
FloatingPointLiteral
BooleanLiteral
CharacterLiteral
StringLiteral
NullLiteral
литерные константы типа int (диапазон от –231 до 231): 0 2
0372 0xDadaCafe 1996 0x00FF00FF
литерные константы типа long (диапазон от –263 до 263): 0l
0777L 0x100000000L 2147483648L 0xC0B0L
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
10
Литерные константы
литерные константы типа float:
1e1f 2.f .3f 0f 3.14f 6.022137e+23f
литерные константы типа double:
1e1 2. .3 0.0 3.14 1e-9d 1e137
символьные литерные константы:
'a' '%' '\t' '\\' '\'' '\u03a9' '\uFFFF' '\177' ' '
для LF и CR необходимо использовать ‘\n’ и ‘\r’
строковые литерные константы:
""
// пустая строка
"\""
// строка содержащая символ "
"This is a string"
// строка из 16 символов
"This is a " +
// константное выражение, сформированное
"two-line string"
// из двух строковых литералов
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
11
Строковые литералы и объекты String
package test;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern()); }
}
class Other { static final String hello = "Hello"; }
package other;
public class Other {
hello = "Hello"; }
Новосибирск, 2004
public final static String
(С) Всеволод Рылов, все права защищены
12
Разделители и операторы
Separator: one of
( ) { } [ ] ; , .
Operator: one of
=
>
<
!
~
?
:
>= !=
&&
||
++
-+
/
&
|
^
%
<<
>>
-= *=
/=
&=
|=
^=
%=
>>>=
n>>>s - right-shift s bit positions with zero-extension:
if (n >= 0) n>>>s == n>>s
if (n < 0) n>>>s == (n>>s)+(s<<~s),
причем ~s = 31-s для int и 63-s для long
==
>>>
<<=
<=
*
+=
>>=
также, отметим что: “bob” + true == “bob true”
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
13
Типы и значения выражений
Type:
PrimitiveType
ReferenceType
PrimitiveType:
NumericType
boolean
ReferenceType:
ClassOrInterfaceType
ArrayType
ClassOrInterfaceType:
ClassType
InterfaceType
NumericType:
IntegralType
FloatingPointType
ClassType:
TypeName
IntegralType: one of
byte short int long char
FloatingPointType: one of
float double
Новосибирск, 2004
InterfaceType:
TypeName
ArrayType:
Type [ ]
(С) Всеволод Рылов, все права защищены
14
Диапазоны значений
Значения интегрального типа являются целыми числами
следующих диапазонов:
 Для byte, от -128 до 127, включительно
 Для short, от -32768 до 32767, включительно
 Для int, от -2147483648 до 2147483647, включительно
 Для long, от -9223372036854775808 до
9223372036854775807, включительно
 Для char, от '\u0000' до '\uffff' включтельно, т.е., от 0 до
65535
Для типов с плавающей точкой диапазоны значений
регулируются стандартом ANSI/IEEE Standard 754-1985.
Существуют специальные значения Float.NaN и Double.NaN
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
15
Типы значений в выражениях
При вычислении выражений аргументы оператора
приводятся к одному типу, при этом более простой тип
приводится к более сложному путем продвижения (byte> short -> int ->long; float -> double; int->float или double):
short c = 456;
double d = 3.f / 2 + (c + 100000);
 Будьте осторожны при вычислениях с плавающей
точкой:
double d = 31/5 + 6 * ( 1 / 5); // d == 6.0 !!!!!!
double d = ((double)31)/5 + 6 * (1. / 5); // d == 7.4 - Ok
 Будьте осторожны при вычислениях близких к границам
значений с плавающей точкой (positive and negative
zero, positive and negative infinity)
 Будьте осторожны при вычислениях в которых часть
выражения может достичь значения NaN.

Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
16
Потеря информации при преобразованиях

Сужающие преобразования происходят при
необходимости присвоения переменной более узкого
типа значения выражения более широкого типа:
 byte в char
 short в byte или char
 char в byte или short
 int в byte, short, или char
 long в byte, short, char, или int
 float в byte, short, char, int, или long
 double в byte, short, char, int, long, или float
short s = 1000 * 100; // > 32767 result:-31072
int i = ((int) (1000000000L * 5)) / 100;
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
17
Вызов методов
пусть задан класс:
public class MyClass {
public static void staticMethodName() {…}
public void methodName() {…}
}
 Вызов метода класса (статического):
ClassName.staticMethodName();
 Вызов метода экземпляра (объекта):
ClassName obj = new ClassName(); // создание объекта
obj.methodName(); // вызов метода используя ссылку
 У объекта можно вызвать статический метод:
obj.staticMethodName(); //вызов статического метода
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
18
Блоки кода

Блоки кода служат для группировки нескольких
операторов (statement) и используются для задания тел
классов, методов, блоков статической и динамической
инициализации, областей перехвата исключений, блоков
синхронизации, а также для задания частей сложных
операторов (ветвления, выбора, цикла)
Начало и конец блока задается разделителями { }

Блоки могут содержать:






объявления и инициализаторы локальных переменных
объявления локальных типов (классов и интерфейсов)
выражения и операторы языка
вложенные блоки
Область видимости локальных переменных ограничена
пределами блока
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
19
Блоки (грамматика)
Block:
{ BlockStatementsopt }
BlockStatements:
BlockStatement
BlockStatements BlockStatement
BlockStatement:
LocalVariableDeclarationStatement
ClassDeclaration
Statement
LocalVariableDeclarationStatement:
LocalVariableDeclaration ;
Новосибирск, 2004
LocalVariableDeclaration:
finalopt Type VariableDeclarators
VariableDeclarators:
VariableDeclarator
VariableDeclarators ,
VariableDeclarator
VariableDeclarator:
VariableDeclaratorId
VariableDeclaratorId
=VariableInitializer
VariableDeclaratorId:
Identifier
VariableDeclaratorId [ ]
VariableInitializer:
Expression
ArrayInitializer
(С) Всеволод Рылов, все права защищены
20
Оператор выбора if

Служит для задания альтернативных веток исполнения
кода:
public static int abs (int value) {
if (value >= 0)
return value; //может стоять блок { }
else
return –value; //может стоять блок { }
}


Условное выражение в скобках всегда должно иметь тип
boolean
Вложенный оператор if:
if (i == 10) {
if (j < 20) a = b;
if (k >100) c = d; //этот оператор if
else a = c; //связан с этим оператором else
}
else a = d; //а этот else относится к if (i == 10)
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
21
Цепочка if-else-if
if ( условие )
оператор;
else if (условие)
оператор;
else if (условие)
оператор;
.
.
else
оператор;
Новосибирск, 2004
int month = 4;
String season;
if (month==12 || month ==1 || month
== 2)
season = “зимний”;
else if (month >=3 && month <=5 )
season = “весенний”;
else if (month > 5 && month < 9)
season = “летний”;
else if (month > 8 && month < 12)
season = “осенний”;
else season = “неправильно заданный”;
System.out.println(“Апрель - ”+season
+ “месяц.”);
(С) Всеволод Рылов, все права защищены
22
Оператор выбора switch

switch лучшая альтернатива if-else-if если нужна
проверка на конкретные значения
switch ( выражение ) {
case значение1:
// последовательность операторов
break;
case значение2:
//последовательность операторов
break;
…
case значениеN:
//последовательность операторов
break;
default:
//последовательность операторов по умолчанию
}
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
23
Итерационный оператор while
Используется для повторения действий пока выполняется условие
 Может быть прерван оператором break;
 Может быть продолжен оператором continue;
while (условие) {
//тело цикла
}

//пример:
int n = 10;
while ( n > 0)
{
n--;
System.out.println(“шаг ” + n);
if (n == 5) continue;
if (n == 3) break;
}
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
24
Итерационный оператор do - while
Если нужно выполнить тело цикла хотя бы раз вне
зависимости от результата проверки условия, то можно
воспользоваться конструкцией do – while:
do {
//последовательность операторов
} while (условие);

Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
25
Итерационный оператор for
Используется для объединения условия, инициализации
и операции над переменными цикла
for (ининциализация; условие; итерация) {
//тело цикла
}

//пример:
for (int i = 0; i < 10; i++)
{
System.out.println(“шаг ”+i);
}

Как и любой другой цикл, цикл for можно прервать с
помощью оператора break и продолжить с помощью
continue
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
26
Использование меток


Метка имеет видимость только внутри
непосредственно объемлющего ее блока
Метки могут используются для выхода из глубоко
вложенных циклов
void doSomething ()
{
first: for(int i = 0; i < 10;
second:
for (int j = 0; j
if( j == 5 )
if( i == 6 )
}
}
}
Новосибирск, 2004
i++) {
< 10; j++) {
break second;
break first;
(С) Всеволод Рылов, все права защищены
27
Последовательность исполнения



Программа выполняется последовательно оператор за
оператором (statement)
Операторы могут содержать в себе другие операторы, а
также выражения
Операторы могут завершаться нормально, а могут быть
прерваны:
 break; break labelopt; - прерывание цикла или switch
 continue; continue labelopt; - продолжение цикла
 return; return valueopt;
- возврат из метода
 throw …
- явный выброс исключения
 а также выброс исключения в процессе вычисления
выражения или выполнения оператора
Новосибирск, 2004
(С) Всеволод Рылов, все права защищены
28
Download