Студопедия

Главная страница Случайная страница

Разделы сайта

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






Создание классов и объектов






 

Рассмотрим синтаксис описания классов в Java. Описание класса начинается с ключевого слова class. После этого следует имя класса и в фигурных скобках тело класса. Тело класса состоит из описания членов класса: полей и методов. По большему счету поля — это рассмотренные в предыдущих главах перемен­ные (на данном этапе ограничимся таким определением). Таким образом, син­таксис объявления класса имеет следующий вид:

class имя_класса{

// тело класса

}

В теле класса перечисляются с указанием типа переменные — поля класса (это в том числе могут быть массивы и объекты). Что касается методов, то это — обычные функции, только описанные в рамках класса. Для тех, кто не знаком с азами программирования, заметим, что функция — это именованный фрагмент кода, к которому можно обращаться чрез имя из других частей про­граммы.

Описание метода состоит из сигнатуры и тела метода. Сигнатура метода, в свою очередь, состоит из ключевого слова, которое обозначает тип возвращаемого методом результата, имени метода и списка аргументов в круглых скобках после имени метода. Аргументы разделяются запятыми, для каждого аргумента перед формальным именем аргумента указывается его тип.

Тело метода заключается в фигурные скобки и содержит код, определяющий функциональность метода. В качестве значения методы в Java могут возвращать значения простых (базовых) или ссылочных типов (объекты). Если метод не возвращает результат, в качестве идентификатора типа указывается ключевое слово void. Синтаксис объявления метода имеет вид:

тип_результат имя_метода(аргументы){

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

}

Значение, возвращаемое методом, указывается после инструкции return. Дру­гими словами, выполнение инструкции return приводит к завершению выпол­нения метода, и если после этой инструкции указано некоторое выражение, то значение этого выражения возвращается в качестве результата метода. Само собой разумеется, что тип указанного после инструкции return выражения должен совпадать с типом результата, задекларированным в сигнатуре ме­тода.

Отметим, что сигнатура метода может содержать и другие ключевые слова (на­пример, идентификатор уровня доступа), но о них речь будет идти позже.

Программы, которые рассматривались до этого, содержали один класс. Точнее, все эти программы состояли из одного класса. В этом классе описывался все­го один метод — главный метод программы main(). Для удобства будем назы­вать класс, содержащий основной метод main(), основным классом программы. В основном классе ранее никаких полей и дополнительных методов не объяв­лялось (хотя это допустимо и нередко так и поступают). Мы продолжим при­держиваться этой традиции (пока, во всяком случае).

Сказанное, в свою очередь, означает, что кроме базового класса придется со­здать еще один класс и, соответственно, объект этого класса в методе main(). Та­ким образом, мы плавно подходим к способам создания объектов. Рассмотрим наиболее простой вариант без особого углубления в подробности. В некотором смысле создание объекта напоминает создание массива.

Объект создается в два этапа, которые обычно объединяют. На первом этапе объявляется объектная переменная или переменная объекта — формально, это имя объекта. С технической точки зрения объектная переменная содержит в ка­честве значения адрес объекта. Второй этап состоит в выделении в памяти места под объект (непосредственно создание объекта) и присваивание в качестве зна­чения объявленной на предыдущем этапе объектной переменной ссылки на со­зданный объект. Синтаксис объявления объектной переменной мало отличается от объявления переменной базового типа с той лишь разницей, что в качестве типа переменной указывается имя класса, для которого создается объект. Созда­ние объекта (выделение памяти под объект) выполняется с помощью оператора new, после которого указывается имя класса с пустыми круглыми скобками. На самом деле в этом месте указывается конструктор с аргументами, но поскольку конструкторы рассматриваются в следующей главе, пока что примем на веру, что объекты создаются именно так. Таким образом, синтаксис создания объекта имеет вид:

имя_класса имя_объекта; // объектная переменная

имя_объекта=new имя_класса(); // выделение памяти

Обычно эти две команды объединяют:

имя_класса имя_объекта=new имя_класса();

Пример объявления класса, содержащего два поля и метод:

class MyClass{

double x;

int m;

void set(double z, int n){

x=z;

m=n; }

}

Класс имеет название MyClass и содержит два поля (поле x типа double и поле m типа int), а также метод с названием set(). Метод не возвращает результат, поэтому в сигнатуре метода в качестве типа возвращаемого результата указано ключевое слово void. У метода два аргумента: один типа double и второй типа int. Первый аргумент присваивается в качестве значения полю x, второй опреде­ляет значение поля m.

Обращаем внимание, что описание класса к созданию объектов не приводит. Другими словами, описывающий класс код — это всего лишь шаблон, по кото­рому впоследствии можно создавать объекты, а можно и не создавать. В данном случае команды по созданию объекта класса MyClass могут выглядеть так:

MyClass obj; // Объектная переменная

obj=new MyClass(); // Создание объекта

Или так:

MyClass obj=new MyClass();

В последнем случае объединены две команды: команда объявления объектной переменной и команда создания объекта.

Как уже упоминалось, Java-программа может состоять из нескольких классов. Классы можно описывать в разных файлах, но каждый класс должен быть опи­сан только в одном файле.

Еще одно замечание предназначено для тех, кто программирует в С++. В отли­чие от этого языка программирования, в Java описание метода и его реализация должны размещаться вместе в теле класса.

Поскольку все объекты класса создаются по единому шаблону, очевидно, что они имеют одинаковый набор полей и методов. Если в программе использует­ся несколько объектов одного класса, необходимо как-то различать, поле или метод какого объекта вызывается — ведь только по названию метода или поля этого не определишь. В Java, как и в прочих объектно-ориентированных языках, применяют так называемый точечный синтаксис. Основная его идея состоит в том, что при обращении к полю или методу объекта сначала указывается имя этого объекта, затем ставится оператор «точка» и после этого имя поля или ме­тода. Забегая наперед, заметим, что кроме обычных существуют так называемые статические члены класса (обычно это поля). Статический член класса один для всех объектов класса. Для использования статического члена класса объект создавать не обязательно. К статическому члену обычно обращаются тоже через точечный синтаксис, но вместо имени объекта указывается имя класса (хотя можно задействовать и стандартный способ обращения через объект). Подроб­нее статические члены класса обсуждаются позже.

В листинге 4.1 приведен пример программы; в ней, кроме основного класса, опи­сан еще один класс, в котором объявляются несколько полей и два метода, а также показано, как эти поля и метод используются в программе.

 

Листинг 4.1. Класс с полями

class Coords{

// Координаты точки:

double x;

double y;

double z;

// Метод для присваивания значений полям:

void set(double a, double b, double c){

x=a;

y=b;

z=c;

}

// Методом вычисляется расстояние до точки:

double getDistance(){

return Math.sqrt(x*x+y*y+z*z); }

}

class CoordsDemo{

public static void main(String[] args){

// Создание объекта:

Coords obj=new Coords();

// Вызов метода:

obj.set(5.0, 0, 2.5);

// Обращение к полю объекта:

obj.y=-4.3;

// Обращение к методу объекта:

System.out.println(" Расстояние до точки: " +obj.getDistance());

}

}

В программе объявляется класс Coords, который имеет три поля x, y и z — все типа double. Поля являются аналогом координат точки в трехмерном простран­стве. Кроме этого, у класса есть два метода. Метод set() не возвращает резуль­тат (использован идентификатор типа void) и предназначен для присваивания значений полям. У метода три аргумента — значения, присваиваемые полям x, y и z соответственно.

Метод getDistance() не имеет аргументов и возвращает в качестве результата значение типа double, которым определяется расстояние от начала координат системы до точки (напомним, что для точки с координатами x, y и z расстояние определяется выражением ). Для вычисления квадратного кор­ня использована статическая функция sqrt() встроенного Java-класса Math. При вызове этой функции необходимо указать имя класса, то есть в данном случае инструкция вызова функции имеет вид Math.sqrt().

В методе main() класса CoordsDemo командой Coords obj=new Coords() создается объект obj класса Coords. Командой obj.set(5.0, 0, 2.5) для вновь созданного объ­екта вызывается метод set(), которым задаются значения полей объекта. Далее с помощью инструкции obj.y=-4.3 значение поля y меняется. Наконец, еще один метод getDistance() вызывается через инструкцию obj.getDistance() прямо в ар­гументе метода println(). Здесь использовано то обстоятельство, что метод воз­вращает значение. В результате выполнения программы получаем сообщение:

Расстояние до точки: 7.052659073002181

Сделаем несколько замечаний относительно компиляции программы. В Java для каждого класса программы в результате компиляции создается отдельный файл. Каждый такой файл имеет расширение.class, а его название совпадает с именем класса. Запускать на выполнение следует файл, соответствующий основному классу программы, то есть классу, в котором описан метод main().

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.