Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy_GEK.docx
Скачиваний:
14
Добавлен:
01.04.2025
Размер:
6.7 Mб
Скачать

Примитивные типы

В языке Java только 8 примитивных (скалярных, простых) типовbooleanbytecharshortintlongfloatdouble. Существует также вспомогательный девятый примитивный тип — void, однако переменные и поля такого типа не могут быть объявлены в коде, а сам тип используется только для описания соответствующего ему класса, для использовании при рефлексии. Кроме того, с помощью класса Void можно узнать, является ли определённый метод типа void: Hello.class.getMethod("main", Array.newInstance(String.class, 0).getClass()).getReturnType() == Void.TYPE.

Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовалUnicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte, причем в Java, в отличие от других языков, он не является беззнаковым. Типы float и double могут иметь специальные значения   и «не число» (NaN). Для типа double они обозначаются Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN; для типа float — так же, но с приставкой Float вместо Double. Минимальные положительные значения, принимаемые типами float и double, тоже стандартизованы.

Тип

Длина (в байтах)

Диапазон или набор значений

boolean

1 в массивах, 4 в переменных[36]

true, false

byte

1

−128..127

char

2

0..216−1, или 0..65535

short

2

−215..215−1, или −32768..32767

int

4

−231..231−1, или −2147483648..2147483647

long

8

−263..263−1, или примерно −9.2·1018..9.2·1018

float

4

-(2-2−23)·2127..(2-2−23)·2127, или примерно −3.4·1038..3.4·1038, а также  ,  , NaN

double

8

-(2-2−52)·21023..(2-2−52)·21023, или примерно −1.8·10308..1.8·10308, а также  ,  , NaN

Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java. Тем не менее одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые регистры или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово strictfp, запрещающее повышение точности.

В языке Java имеются только динамически создаваемые объекты. Причем переменные объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются ссылками, то есть неявными указателями на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных.

Структура оконного приложения

Первое, что делает приложение - подключает необходимые библиотеки:

import java.awt.*;

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

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

Объявление главного класса программы стало выглядеть вот так:

public class WindowedApp extends Frame{

Ключевое слово extends означает, что наша программа (точнее её класс) является наследником класса Frame, который определён где-то в стандартной библиотеке awt (вот зачем мы её подключали). Этот самый Frame уже содержит в себе всё необходимое для создания и функционирования окна программы - нам остаётся только использовать его методы в своей программе. И как раз для этого мы и объявляем класс своей программы наследником этого стандартного класса - вместе с тем наследуя и методы. Дальше Вы увидите, как мы будем использовать их - хотя нам не придётся их писать. Они уже заботливо написаны и отлажены за нас раньше создателями Java - скажем им за это спасибо и продолжим изучение программы.

Далее идёт уже знакомый нам метод main - но что же он делает? На первый взгляд почти ничего. Всего одна строка, в которой создаётся какая-то переменная... кстати, имеющая тип, имя которого совпадает с именем нашей программы?

Да, всё правильно, никакой ошибки здесь нет.  Ведь в предыдущей строке мы не просто так писали class WindowedApp - это было объявление класса. А теперь, внутри нашего класса, мы пишем, что же и как именно он делает.

В частности, метод main этого нашего класса порождает ровно один объект - принадлежащий этому классу. В строгих научных терминах такой объект называется экземпляром класса.

Это выглядит немного парадоксально: класс порождает сам свой экземпляр - почти как змея кусающая себя за хвост. Но не волнуйтесь, хотя для обыденной житейской логики это и кажется чем-то сверхестественным, компьютер не запутается и всё сделает правильно, программа будет работать без ошибок. А Вам надо просто запомнить эти первые строки и начинать каждую новую программу с них.

А как именно создаётся этот экземпляр? Как появляется на экране окно нашей программы?  Всё это описано в конструкторе класса - и мы обязаны его написать. Вот он:

WindowedApp(){

super("Windowed Application");

pack();

setSize(400, 400);

show();

}

Конструктор обязательно имеет то же самое имя, что и его класс. И первое что он делает - это super. Не в смысле, что он хвастается, нет. Зарезервированное слово super означает вызов конструктора класса-предка. Предком у нашей программы является Frame - а его конструктор умеет создавать окно и устанавливать для этого окна заголовок (в нашем случае заголовком будет строка "Windowed Application").

Далее следуют три обязательных для оконного приложения метода:

  • pack - производит компоновку элементов (в нашем простом случае его вызов чистая формальность - но эту формальность надо соблюсти)

  • setSize - устанавливает размеры окна

  • show - собственно делает окно видимым на экране

Эти три метода должны вызываться только в указанном порядке. Если, например, сперва установить размер окна, а потом вызвать pack - то выведенное на экран окно вряд ли будет иметь желаемые размеры.

Но, если мы запустим нашу программу, то увидим не только окно с заголовком, но и в этом самом окне надпись "Welcome Windowed Application!". За рисование этой надписи или иных графических фигур отвечает метод paint. На самом деле он уже определён в Frame - классе-предке нашей программы. Но там он не делает ничего полезного для нас - поэтому мы его переопределяем.

Это то же важный приём объектного программирования: мы можем не только наследовать методы, чтобы использовать их, как будто они написаны нами (в нашем примере так мы поступили с packsetSize и show) - но если нас что-то не устаивает, мы можем переписать этот метод по-своему - именно так мы и поступим с paint.

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

public void paint(Graphics g){

g.drawString("Welcome Windowed Application!", 100, 100);

}

При вызове система передаёт этому методу параметр класса Graphics - а уже через методы этого класса и осуществляется всё рисование в отведённой окну области. В нашем случае всего лишь выведена одна строка, начиная с координат 100,100.

Наконец, последний метод нашей программы - он всего лишь ожидает системного сообщения о закрытии окна. Такое сообщение генерируется системой, например, при клике на кнопочку закрытия окна.  Delphi (Де́лфи, произносится /ˈdɛlˌfi:/[1]) — императивныйструктурированныйобъектно-ориентированный язык программирования, диалект Object Pascal[2]. Начиная со среды разработки Delphi 7.0[3], в официальных документах Borland стала использовать название Delphi для обозначения языка Object Pascal. Начиная с 2007 года уже язык Delphi (производный от Object Pascal) начал жить своей самостоятельной жизнью и претерпевал различные изменения, связанные с современными тенденциями (например, с развитием платформы .NET) развития языков программирования: появились class helpers, перегрузки операторов и другое.

Изначально среда разработки была предназначена исключительно для разработки приложений Microsoft Windows, затем был реализован также для платформ Linux (как Kylix), однако после выпуска в 2002 году Kylix 3 его разработка была прекращена, и, вскоре после этого, было объявлено о поддержке Microsoft .NET.

Реализация среды разработки проектом Lazarus (Free Pascal, компиляция в режиме совместимости с Delphi) позволяет использовать его для создания приложений на Delphi для таких платформ, как Linux, Mac OS X и Windows CE.

Также предпринимались попытки использования языка в проектах GNU (например, Notepad GNU) и написания компилятора[источник не указан 1282 дня] для GCC.

Операторы

Список операторов через пробел: := + — * / div mod not and or with xor shl shr ^ = <> >= <= < > @ in is as

Выражения

Выражения в Object Pascal (Delphi) бывают арифметическими, логическими и строковыми.

Основные логические выражения: Логические выражения в основном употребляются в условных операторах. К логическим выражениям относятся такие операции как:

  • not — «НЕ», отрицание логического выражения (NOT <логическое_выражение>)

  • and — «И», умножение (пересечение) логических выражений (<логическое_выражение1> AND <логическое_выражение2>)

  • or — «ИЛИ», объединение логических выражений (<логическое_выражение1> OR <логическое_выражение2>)

  • xor — «Исключающее ИЛИ», отрицание ИЛИ, все что не попадает под ИЛИ (<логическое_выражение1> XOR <логическое_выражение2>)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]