Объектно-ориентированное Java.
Программирование Java
В Java, как и в С++, есть группа упрощенных арифметических операторов с присваиванием. Если op один из операторов сложения, умножения, деления и вычисления остатка, то упрощенная форма этого оператора с присваиванием имеет вид op=. Это тоже бинарный оператор, как и оператор op, а команда вида xop=y является эквивалентом команды x=x op y. Еще два исключительно полезных унарных операторы инкремента… Читать ещё >
Объектно-ориентированное Java. Программирование Java (реферат, курсовая, диплом, контрольная)
Как отмечалось во вступлении, язык программирования Java является полностью объектно-ориентированным. Это означает, что для составления даже самой простой программы необходимо описать класс. Однако в языке программирования Java, кроме классов и объектов, есть, на что обратить внимание. Рассмотрение методов программирования в Java начнем с наиболее простых случаев. Некоторые базовые синтаксические конструкции как основу создания программы в Java, дадим более подробные объяснения по этому поводу, причем в контексте методов объектно-ориентированного программирования. Думается, такой подход, с одной стороны, позволит читателю, не знакомому с концепцией ООП, легче и быстрее усваивать новый материал, а затем плавно перейти к созданию реальных объектно-ориентированных программ в Java. С другой стороны, практически не пострадают те, кто знаком с методами ООП (например, программирующие на C++), поскольку представленный далее материал в любом случае важен для понимания принципов программирования в Java. Обычно программы пишут для того, чтобы обрабатывать данные. Методы и возможности по обработке данных в значительной степени зависят от типа данных. Язык Java относится к строго типизованным языкам. Это означает, что любая переменная в программе относится к определенному типу данных одному и только одному. В Java все данные можно разделить на: простые и ссылочные. Ссылочные данные реализуются через иерархию классов. Простые данные это скорее дань традиции. Забегая наперед, отметим, что для простых типов данных существуют ссылочные аналоги. Разница между простыми и ссылочными типами на практике проявляется при передаче аргументов методам. Простые типы данных передаются по значению, ссылочные через ссылку. И что простые типы данных являются, по сути, базовыми. В Java существует четыре группы базовых типов: для работы с целыми числами, для работы с числами в формате с плавающей точкой (действительные числа), символы и логический тип, таким образом, всего получается восемь базовых типов. Базовые типы Java перечислены в табл.1.1 В этой же таблице приведены названия классов-оболочек для базовых типов. Классы-оболочки используются в тех случаях, когда переменную соответствующего типа необходимо рассматривать как объект. В первую очередь стоит обратить внимание на целочисленные типы данных. В Java существует четыре типа целочисленных данных: byte, short, int и long. Отличаются типы количеством битов, выделяемых для записи значения соответствующего типа. Размер в битах увеличивается от 8 для типа byte до 32 для типа long (с шагом дискретности 8 бит). На практике выбор подходящего типа осуществляется в соответствии с предполагаемым диапазоном изменения значения переменных. Разумеется, для надежности разумно использовать наиболее «широкий» тип данных, однако при этом не следует забывать и о том, что системные ресурсы даже самого производительного компьютера не безграничны. Для работы с действительными числами используются типы float и double. С помощью этих типов реализуется формат числа с плавающей точкой. В этом формате действительное число задается посредством двух чисел: мантиссы. И показателя степени. Заданное таким образом число равно произведению мантиссы на десять в соответствующей второму числу степени. Поскольку размер в битах, выделяемый для типа double, в два раза больше размера для данных типа float, тип double называют типом действительных чисел двойной точности. На практике обычно используется тип double. Поскольку в Java для символьных данных (тип char) выделяется 16 бит, такая широта размаха позволяет охватить практически все имеющиеся и использующиеся на сегодня символы, включая китайские иероглифы. Этот демократизм, свойственный далеко не каждому языку программирования, является следствием курса разработчиков Java на создание универсального языка программирования, ориентированного на работу в Интернете. Все операторы Java можно разделить на четыре группы: арифметические, логические, побитовые и сравнения. Рассмотрим последовательно каждую группу операторов. Начнем с арифметических. Эти операторы перечислены в табл.1.2 Эти операторы имеют некоторые особенности. В первую очередь обращаем внимание на оператор деления /. Если операндами являются целые числа, в качестве значения возвращается результат целочисленного деления. Рассмотрим последовательность команд:
int a=5,b=2;double x=a/b;
В данном примере переменная x получает значение 2.0, а не 2.5, как можно было бы ожидать. Дело в том, что сначала вычисляется выражение a/b. Поскольку операнды целочисленные, выполняется целочисленное деление. И только после этого полученное значение преобразуется к формату double и присваивается переменной x.
Для того чтобы при целочисленных операндах выполнялось обычное деление, перед выражением с оператором деления указывается в круглых скобках идентификатор типа double (или float). Например, так:
Int a=5,b=2;
double x= (double) a/b;
Теперь значение переменной xравно 2.5.
В Java, как и в С++, есть группа упрощенных арифметических операторов с присваиванием. Если op один из операторов сложения, умножения, деления и вычисления остатка, то упрощенная форма этого оператора с присваиванием имеет вид op=. Это тоже бинарный оператор, как и оператор op, а команда вида xop=y является эквивалентом команды x=x op y. Еще два исключительно полезных унарных операторы инкремента (++) и декремента (—). Действие оператора декремента сводится к увеличению на единицу значения операнда, а оператор декремента на единицу уменьшает операнд. Другими словами, команда x++ эквивалентна команде x=x+1, а команда x — эквивалентна команде x=x-1. У операторов инкремента и декремента есть не только представленная здесь постфиксная форма (оператор следует после операнда: x++ или x—), но и префиксная (оператор располагается перед операндом: ++x или — -x). С точки зрения действия на операнд нет разницы в том, префиксная или постфиксная формы оператора использованы. Однако если выражение с оператором инкремента или декремента является частью более сложного выражения. Если использована префиксная форма оператора, сначала изменяется значение операнда, а уже после этого вычисляется выражение. Если использована постфиксная форма оператора, сначала вычисляется выражение, а затем изменяется значение операнда. Рассмотрим небольшой пример:
int n, m;
n=10;
m=n++;
В этом случае после выполнения команд переменная n будет иметь значение 11, а переменная m — значение 10. На момент выполнения команды m=n++ значение переменной n равно 10. Поскольку в команде m=n++ использована, постфиксная форма оператора инкремента, то сначала выполняется присваивание значения переменной m, а после этого значение переменной n увеличивается на единицу. Иной результат выполнения следующих команд:
int n, m;
n=10;
m=++n.
Обе переменные (n и m) в этом случае имеют значение 11. Поскольку в команде m=++n использована префиксная форма инкремента, сначала на единицу увеличивается значение переменной n, а после этого значение переменной n присваивается переменной m. Следующую группу образуют логические операторы. Операндами логических операторов являются переменные и литералы типа boolean. Логические операторы Java перечислены в табл.1.3.
Интерфейс и пакеты. Пакет (package) — это некий контейнер, который используется для того, чтобы изолировать имена классов. Например, вы можете создать класс List, заключить его в пакет и не думать после этого о возможных конфликтах, которые могли бы возникнуть, если бы кто-нибудь еще создал класс с именем List.
Интерфейс — это явно указанная спецификация набора методов, которые должны быть представлены в классе, который реализует эту спецификацию. Реализация же этих методов в интерфейсе отсутствует. Подобно абстрактным классам интерфейсы обладают замечательным дополнительным свойством — их можно многократно наследовать. Конкретный класс может быть наследником лишь одного суперкласса, но зато в нем может быть реализовано неограниченное число интерфейсов.
Пакеты. Все идентификаторы, которые мы до сих пор использовали в наших примерах, располагались в одном и том же пространстве имен (name space). Это означает, что нам во избежание конфликтных ситуаций приходилось заботиться о том, чтобы у каждого класса было свое уникальное имя. Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. У каждого файла java есть четыре одинаковых внутренних части, из которых мы до сих пор в наших примерах использовали только одну. Ниже приведена общая форма исходного файла Java.
одиночный оператор package (необязателен) любое количество операторов import (необязательны) одиночное объявление открытого (public) класса любое количество закрытых (private) классов пакета (необязательны) Первое, что может появиться в исходном файле Java — это оператор package, который сообщает транслятору, в каком пакете должны определяться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Если оператор package не указан, классы попадают в безымянное пространство имен, используемое по умолчанию. Если вы объявляете класс, как принадлежащий определенному пакету, например, package java. awt. image;
то и исходный код этого класса должен храниться в каталоге java/awt/image.
Ограничение доступа. Java предоставляет несколько уровней защиты, обеспечивающих возможность тонкой настройки области видимости данных и методов. Из-за наличия пакетов Java должна уметь работать еще с четырьмя категориями видимости между элементами классов: Подклассы в том же пакете.
Не подклассы в том же пакете. Подклассы в различных пакетах. Классы, которые не являются подклассами и не входят в тот же пакет.
Интерфейсы. Интерфейсы Java созданы для поддержки динамического выбора (resolution) методов во время выполнения программы. Интерфейсы похожи на классы, но в отличие от последних у интерфейсов нет переменных представителей, а в объявлениях методов отсутствует реализация. Класс может иметь любое количество интерфейсов. Все, что нужно сделать — это реализовать в классе полный набор методов всех интерфейсов. Сигнатуры таких методов класса должны точно совпадать с сигнатурами методов реализуемого в этом классе интерфейса. Интерфейсы обладают своей собственной иерархией, не пересекающейся с классовой иерархией наследования. Это дает возможность реализовать один и тот же интерфейс в различных классах, никак не связанных по линии классового наследования. Именно в этом и проявляется главная сила интерфейсов. Интерфейсы являются аналогом механизма множественного наследования в C++, но использовать их намного легче.
Работа со строками. В этой главе обсуждаются средства языка Java для работы со строками. В языках С и C++ отсутствует встроенная поддержка такого объекта, как строка. В них при необходимости передается адрес последовательности байтов, содержимое которых трактуется как символы до тех пор, пока не будет встречен нулевой байт, отмечающий конец строки. В пакет java. lang встроен класс, инкапсулирующий структуру данных, соответствующую строке. Этот класс, называемый String, не что иное, как объектное представление неизменяемого символьного массива. В этом классе есть методы, которые позволяют сравнивать строки, осуществлять в них поиск и извлекать определенные символы и подстроки. Класс StringBuffer используется тогда, когда строку после создания требуется изменять.
И String, и StringBuffer объявлены final, что означает, что ни от одного из этих классов нельзя производить подклассы. Это было сделано для того, чтобы можно было применить некоторые виды оптимизации позволяющие увеличить производительность при выполнении операций обработки строк.