Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Введение в ООП. Классы



В основе языка Java лежит класс. Класс – это логическая конструкция, на которой построен весь язык Java, потому что такая конструкция определяет форму и природу объекта. Класс формирует также основу для объектно-ориентированного программирования в Java. Любая концепция, в Java-программе, должна быть инкапсулирована в класс.

Наиболее важным в понятии класса является то, чтоб он определяет новый тип данных. После определения новый тип можно использовать для создания объектов этого типа. Таким образом, класс – это шаблон для объекта, а объект – это экземпляр класса.

Определение класса объявляет его точную форму и природу. Объединяет данные, которые он содержит, и код, который оперирует с этими данными. В то время как очень простые классы могут содержать только код или только данные, наиболее реальные классы содержат и то и другое. Код класса определяет интерфейс к его данным.

Класс объявляется при помощи ключевого слова class. Ниже показана общая форма определения класса:

class classname {

type instance-variablel;

type instance-variable2;

//...

type instance-variableN;

type methodnamel (parameter-list) {

// тело метода

}

type methodnnme2(parameter-list) {

// тело метода

}

//...

type mathodnameN (parameter-list) { // тело метода

}

}

Данные или переменные, определенные в классе, называются переменными экземпляра или экземплярными переменными (instance variables). Код содержится внутри методов (methods). Все вместе, методы и переменные, определенные внутри класса, называются членами класса (class members). В большинстве классов на переменные экземпляра воздействуют методы, определенные в этих классах. Таким образом, именно методы определяют, как могут использоваться данные класса.

Переменные, определенные в классе, называются переменными экземпляра потому, что каждый экземпляр класса (т. е. каждый объект класса) содержит свою собственную копию этих переменных. Таким образом, данные одного объекта отделены от данных другого.

Все методы имеют ту же общую форму, как например main(). Однако большинство методов не будут определяться как static или public. Обратите внимание, что общая форма класса не определяет метод main().

Замечание. Программисты С++ обратят внимание, что объявление класса и реализация методов хранятся в одном месте и не определяются отдельно. Это иногда приводит к очень большим исходным (.java) файлам, т.к. любой класс должен быть полностью определен в одном исходном файле. Данное проектное свойство было встроено в Java потому, что, в конечном счете, хранение спецификации, объявления и реализации в одном месте упрощает поддержку кода.

Простой класс

Пример. Имеется класс с именем Box, который, определяет три переменных экземпляра: width, height и depth.

 

class Box {

double width;

double height;

double depth;

}

 

Класс определяет новый тип данных, который называется Box. Объявление класса создает только шаблон, а не фактический объект. Таким образом, предшествующий код не приводит к появлению каких-либо объектов типа Box. Чтобы фактически создать Box-объект, запишем:

 

Box mybox = new Вох(); // создать Box-объект с именем mybox

 

После этой строки переменная mybox станет экземпляром класса Box, т.е. в памяти создастся экземпляр класса.

Всякий раз, когда вы создаете экземпляр класса, образуется объект, который содержит свою собственную копию каждой экземплярной переменной, определенной в классе. Таким образом, каждый Box-объект будет содержать свою собственную копию переменных width, height и depth. Для доступа к этим переменным необходимо использовать операцию «точка» (.) Она связывает имя объекта с именем переменной экземпляра. Например, чтобы назначить переменной width объекта mybox значение 100, нужно использовать следующий оператор:

 

mybox.width = 100;

 

Этот оператор просит компилятор назначать копии переменной width, которая содержится в объекте mybox, значение 100. В общем случае, чтобы обращаться как к переменным экземпляра, так и к методам объекта, следует указывать операцию «точка». Далее предлагается законченная программа, которая использует Box-класс.

 

/*

Программа, которая использует Вох-класс.

Назовите этот файл BoxDemo.java

*/

class Box {

double width;

double height;

double depth;

}

 

// Этот класс объявляет объект типа Box.

class BoxDemo {

public static void main(String args[]){

Box mybox = new Box();

double vol;

 

// присвоить значения экземплярным переменным объекта mybox

mybox.width = 10;

mybox.height = 20;

mybox.depth = 15;

 

// вычислить объем блока

vol = mybox.width * mybox.height * mybox.depth;

System.out.println("Объем равен " + vol);

}

}

 

Вы должны назвать файл, который содержит эту программу, BoxDemo.java, потому что метод main() находится в классе с именем BoxDemo, а не в классе с именем Box. После компиляции программы вы обнаружите, что были созданы два файла с расширением .class – один для вох-класса и один для класса BoxDemo. Java-компилятор автоматически помещает каждый класс в его собственный class-файл. Нет необходимости в том, чтобы классы Box и BoxDemo находились в одном исходном файле. Можно было поместить каждый класс в свой собственный файл с именами Box.java и BoxDemo.java, соответственно.

После выполнения BoxDemo.class вы увидите (компилирование, и выполнение, программ рассмотрены в Приложении А):

 

Объем равен 3000.0

 

Каждый объект имеет свои собственные копии переменных экземпляра. Это означает, что, если вы имеете два Box-объекта, каждый из них обладает своей собственной копией depth, width и height. Важно понять, что изменения экземплярных переменных одного объекта не имеют никакого влияния на экземплярные переменные другого. Например, следующая программа объявляет два Box-объекта:

 

// Эта программа объявляет два Вох-объекта.

class Box {

double width;

double height;

double depth;

}

 

class BoxDemo2 {

public static void main(String args[]) {

Box myboxl = new Box();

Box mybox2 = new Box ();

double vol;

// присвоить значения экземплярньм переменным объекта myboxl

myboxl.width = 10;

myboxl.height = 20;

myboxl.depth = 15;

/* присвоить другие значения экземплярным переменным объекта mybox2 */

mybox2.width = 3;

mybox2.height = 6;

mybox2.depth = 9;

// вычислить объем первого блока

vol = myboxl.width * myboxl.height * myboxl.depth;

System.out.println("Объем равен " + vol);

// вычислить объем второго блока

vol = mybox2.width * mybox2.height * mybox2.depth;

System.out.println("Объем равен " + vol);

}

}

 

Вывод, выполненный этой программой:

 

Объем равен 3000.0

Объем равен 162.0

 

Можно видеть, что данные myboxl объекта полностью отделены от данных, содержащихся в mybox2.

Объявление объектов

Когда вы создаете класс, вы создаете новый тип данных. Этот тип можно использовать для объявления соответствующих объектов. Однако получение объектов класса это двухшаговый процесс. Во-первых, нужно объявить переменную типа «класс». Она не определяет объект. Это просто переменная, которая может ссылаться на объект. Во-вторых, вы должны получить актуальную, физическую копию объекта и назначать ее этой переменной. Вы можете сделать это с помощью операции new. Операция new распределяет динамически (т.е. во время выполнения) память для объекта и возвращает ссылку на нее. Данная ссылка является адресом ячейки памяти, выделенной объекту вышеуказанной операцией. Затем эта ссылка сохраняется в переменной. Таким образом, в Java все объекты класса должны быть распределены динамически. Рассмотрим подробности данной процедуры.

Для объявления объекта типа Box использовалась строка вида:

 

Box mybox = new Box();

 

Этот оператор комбинирует два шага, как было только что описано. Чтобы продемонстрировать каждый шаг, его можно переписать так:

 

Box mybox; // объявить ссылку на объект

mybox = new Box(); // распределить память для Вох-объекта

 

Первая строка объявляет mybox как ссылку на объект типа Box. После того как эта строка выполняется, mybox содержит значение null, которое означает, что переменная еще не указывает на фактический объект. Любая попытка использовать mybox в этой точке приведет к ошибке во время компиляции. Следующая строка распределяет фактический объект и назначает ссылку на него переменной mybox. После того, как вторая строка выполняется, вы можете использовать mybox, как если бы это был объект Box. Но в действительности mybox просто содержит адрес ячейки памяти фактического объекта Box. Действие этих двух строк программы изображено на рис. 1.

Рисунок 1. Объявление объекта типа Box.

 

Замечание.

В C/C++ объектные ссылки кажутся похожими на указатели. Это подозрение, по существу, верно. Объектная ссылка подобна указателю памяти. Главное различие (и ключ к безопасности Java) заключается в том, что в Java запрещено манипулировать ссылками как с указателями. Нельзя, например, заставить объектную ссылку указать на произвольное место в памяти или манипулировать ею как целым числом.

Операция new

Операция new динамически распределяет память для объекта. Она имеет следующую общую форму:

 

class-var = new classname();

 

Здесь class-var – переменная типа «класс», которая создается; classname – имя класса, экземпляр которого создается. За именем класса следуют круглые скобки, устанавливающие конструктор класса. Конструктор (constructor) определяет, что происходит, когда объект класса создается. Большинство классов явно определяют свои собственные конструкторы (внутри своих определений). Однако если явный конструктор не определен, то Java автоматически обеспечит так называемый «конструктор по умолчанию» (default constructor) или умалчиваемый конструктор. Именно так обстоит дело с классом Box.

Заметим, что не нужно использовать операцию new для таких типов данных, как целые числа или символы. Ответ заключается в том, что простые типы Java не реализованы как объекты. Они реализованы как «нормальные» переменные. Это сделано в интересах эффективности. Объекты имеют много свойств и атрибутов, которые требуют, чтобы Java обращалась с ними иначе, чем с простыми типами. Не применяя к простым типам тот же подход, который используется с объектами, Java может реализовывать простые типы более эффективно.

Оператор new распределяет память для объекта во время выполнения, поэтому программа может создавать столько объектов, сколько требуется в течение ее выполнения. Если операция new не будет способна распределить память для объекта, т.к. отсутствует необходимое количество свободной памяти, то возникнет исключительная ситуация при работе программы.

Класс создает новый тип данных, который может использоваться для создания объектов. То есть класс создает логическую структуру, которая определяет отношения между его членами. Когда вы объявляете объект класса, вы создаете экземпляр (образец) этого класса. Таким образом, класс – это логическая конструкция, а объект – физическая реальность (т.е. область памяти с конкретными данными). Важно постоянно помнить об этом различии.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.