Описание классов, создание объектов и основы ООП
Класс – шаблон, по которому создаются объекты (экземпляры). Класс описывает данные (личные и глобальные переменные или поля) и методы, модифицирующие данные. Все методы реализуются в виде функций, однако, стоит отметить, что существуют специализированные функции, которые ничего не возвращают (void), которые аналогичны процедурам в других языках. Внутри объекта данные и методы могут обладать различной степенью видимости (доступности) через использование модификаторов доступа (public, private, protected). Это позволяет организовать защиту, как данных, так и методов от внешнего вмешательства или неправильного использования. Объявление класса описывается следующей схемой: [модификаторы класса] class <имя класса> [ extends <имя класса предка> и/или implements <одно или несколько имен интерфейсов>] { //описание полей и методов } Каждое поле класса описывается оператором вида: [модификатор] тип <имя поля>[[]] [=<выражение> или {перечень через запятую значений элементов массива}]; Каждый метод имеет описание вида: [модификатор] <тип возврата> <имя метода> ([перечень типов и имен формальных параметров, возможно, с квадратными скобками ]) { //тело метода } модификатором является одно из следующих слов: public видимость метода/переменной – полная protected видимость метода/переменной – класс и его подклассы private видимость метода/переменной – класс static является методом/переменной класса, а не экземпляра Метод подкласса переопределяет метод суперкласса только в том случае, если и подкласс и суперкласс имеют метод с одинаковым именем, типом и списком параметров. Наследование – это процесс, посредством которого, один объект может приобретать свойства и поведение другого, а также добавлять к ним черты, характерные только для него через ввод в логическую структуру объекта (в класс) новых переменных или новых методов, а также через переопределение методов базового (родительского) класса. Наследование позволяет организовать иерархию классов.
В языке Java все классы произошли от одного суперкласса Object и реализовано только одиночное наследование классов: class <имя класса2> extended <имя класса1> { // тело класса } Предположим, что Вы собираетесь определить класс, который выступал бы в качестве родительского для других классов, но хотите, чтобы пользователь не мог создавать экземпляр этого класса. Для решения этой задачи в Java предусмотрен механизм интерфейсов. Интерфейс описывает полный набор методов класса, но без их реализации. Каждый класс сам определяет детали реализации этих методов. Реализовать интерфейс может любое число классов, и один класс может реализовать любое число интерфейсов. interface <имя интерфейса> { // список методов и констант } Реализация интерфейса выполняется через создание класса. [модификатор] class <имя класса> implements <имя интерфейса1>, <имя интерфейса2>, … { /* Реализация методов, описанных в интерфейсе. Методы, которые реализуют интерфейс, должны быть объявлены как public */ } Конструктор – специальный метод, используемый для создания объекта. Назначение конструктора – инициализация экземпляра в момент его создания (определение его начального внутреннего состояния). Имя конструктора всегда совпадает с именем класса, в котором он расположен (аналогично C++). У конструкторов нет типа возвращаемого результата. Например: class Point { int х, у; Point(int х, int у){ //этот метод является конструктором this.x = х; this.у = у; } } Создание объекта заданного класса осуществляется с помощью операции new, которая создает объект и возвращает ссылку на него:
<Имя класса> <Имя переменной> = new <Имя класса> (<Список параметров>); Например: class PointCreate { public static void main(String args[]) { Point p = new Point(10,20); System.out.println("x = " + p.x + " у = " + p.у); } } В классе могут существовать несколько конструкторов, которые различным образом осуществляют инициализацию переменных класса. Конструкторы отличаются друг от друга сигнатурой, то есть числом параметров, их типом и последовательностью их указания в параметрах конструктора, например: class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } Point() { х = -1; у = -1; } } Если в классе отсутствует конструктор, то при создании объекта используется «конструктор по умолчанию», который обнуляет поля класса.
Полиморфизм в ООП означает возможность применения одноименных методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных отношением наследования. Понятие полиморфизма, в свою очередь, опирается на два других понятия: совместное использование (overloading) и переопределение (overriding). Под совместным использованием понимают использование одноименных методов с различным набором параметров. При вызове метода в зависимости от набора параметров выбирается требуемый метод. Это статический полиморфизм методов. При переопределении (overriding) методов речь идет только о паре классов — предке и потомке. В классе-потомке определяется метод полностью идентичный как по имени, так и по набору параметров тому, что есть в классе-предке. В Java в отличие от Object Pascal по умолчанию могут быть переопределены все методы (если это не запрещено для конкретного метода или класса). Для этого необходимо чтобы метод потомка совпадал по имени и параметрам с методом предка. Для совместного использования необходимы различия в сигнатурах методов (параметрах, их типах и порядке следования).
Пакеты java
Пакет (package) – некоторый контейнер, используемый для изоляции имен классов. Например, Вы можете создать класс List, заключить его в пакет и не заботится после этого о возможных конфликтах, которые могли бы возникнуть, если бы кто-нибудь еще создал класс с именем List. До этого во всех примерах все идентификаторы располагались в одном и том же пространстве имен. Это означает, что во избежание конфликтных ситуаций программисту бы приходилось заботиться об уникальности имен классов.
Пакеты – это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. У каждого файла.java есть четыре одинаковые внутренние части. Ниже приведена общая форма исходного файла Java: одиночный оператор package (необязателен) несколько операторов import (необязательны) одиночное объявление открытого (public) класса несколько закрытых (private) классов (необязательны)
Оператор package. Первое, что может появиться в исходном файле java – это оператор package, который сообщает компилятору, в каком пакете должны определяться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Если оператор package не указан, классы попадают в безымянное пространство имен, используемое по умолчанию. Если объявлен класс, принадлежащий определенному пакету (например, package java.awt.image), то исходный код этого класса должен храниться в каталоге java/awt/image. При размещении классов в пакеты требуется точное совпадение иерархии каталогов с иерархией пакетов. Вы не можете переименовать пакет, не переименовав каталог, в котором хранятся его классы. Эта трудность видна сразу, но есть и менее очевидная проблема. Представьте себе, что Вы написали класс с именем PackTest в пакете test. Вы создаете каталог test, помещаете в этот каталог файл PackTest.Java и компилируете его. При попытке запустить его возникает сообщение «can't find class PackTest» («класс PackTest не найден»). Ваш новый класс хранится в пакете с именем test, а для запуска требуется указывать всю иерархию пакетов, разделяя их имена точками - test.PackTest. Кроме того, Вам надо подняться на уровень выше в иерархии каталогов и запустить test.PackTest (в командной строке набрать «java test.PackTest»).
Оператор import. После оператора package, но до любого определения классов в исходном java-файле, может присутствовать список операторов import. Пакеты являются хорошим механизмом для отделения классов друг от друга, поэтому все встроенные в Java классы хранятся в пакетах. Общая форма оператора использования import такова:
import пакет1[.пакет2].(имякласса|*); Здесь пакет1 – имя пакета верхнего уровня, пакет2 – это необязательное имя пакета, вложенного в первый пакет и отделенное точкой. После указания пути в иерархии пакетов, указывается либо имя класса, либо символ звездочка (*), которая разрешает компилятору при необходимости искать классы во всем пакете. В приведенном ниже фрагменте кода показаны обе формы использования оператора import: import java.util.Date import java.io.*; Все встроенные в Java классы, которые входят в комплект поставки, хранятся в пакете с именем java. Базовые функции языка хранятся во вложенном пакете java.lang. Весь этот пакет автоматически импортируется компилятором во все программы. Это эквивалентно размещению в начале каждой программы оператора import java.lang.*; Если в нескольких пакетах, подключаемых с помощью формы оператора import со звездочкой, имеются классы с одинаковыми именами, то возможно возникновение ошибки. Ошибка проявляется при попытке использовать такой «неточно определенный» класс. Для исправления этой ошибки используются операторы import с явным указанием класса, который необходимо использовать. Например: class MyDate extends java.util.Date { }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|