Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Описание классов, создание объектов и основы ООП




Класс – шаблон, по которому создаются объекты (экземпляры). Класс описывает данные (личные и глобальные переменные или поля) и методы, модифицирующие данные. Все методы реализуются в виде функций, однако, стоит отметить, что существуют специализированные функции, которые ничего не возвращают (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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...