Отметим, что сигнатура метода может содержать и другие ключевые слова (например, идентификатор уровня доступа).
Программы, которые рассматривались до этого, содержали один класс. Точнее, все эти программы состояли из одного класса. В этом классе описывался всего один метод - главный метод программы main(). Для удобства будем называть класс, содержащий основной метод mаin(), основным классом программы. В основном классе ранее никаких полей и дополнительных методов не объявлялось (хотя это допустимо и нередко так и поступают). Мы продолжим придерживаться этой традиции (пока, во всяком случае).
Сказанное, в свою очередь, означает, что кроме базового класса придется создать еще один класс и, соответственно, объект этого класса в методе main(). Таким образом, мы плавно подходим к способам создания объектов. Рассмотрим наиболее простой вариант без особого углубления в подробности. В некотором смысле создание объекта напоминает создание массива.
Объект создается в два этапа, которые обычно объединяют. На первом этапе объявляется объектная переменная или переменная объекта - формально, это имя объекта. С технической точки зрения объектная переменная содержит в качестве значения адрес объекта. Второй этап состоит в выделении в памяти места под объект (непосредственно создание объекта) и присваивание в качестве значения объявленной на предыдущем этапе объектной переменной ссылки на созданный объект. Синтаксис объявления объектной переменной мало отличается от объявления переменной базового типа с той лишь разницей, что в качестве типа переменной указывается имя класса, для которого создается объект. Создание объекта (выделение памяти под объект) выполняется с помощью оператора new, после которого указывается имя класса с пустыми круглыми скобками. На самом деле в этом месте указывается конструктор с аргументами. Таким образом, синтаксис создания объекта имеет вид:
имя_класса имя_объекта; // объектная переменная
имя_объекта=nеw имя_класса(); // выделение памяти
Обычно эти две команды объединяют:
имя_клаcса имя_объекта=nеw имя_класса();
Пример объявления класса, содержащего два поля и метод:
class MyClass{
double Х:
int m;
void set(double z, int n){
x=z;
m=n;}
}
Класс имеет название MyClass и содержит два поля (поле x типа double и поле m типа int), а также метод с названием set(). Метод не возвращает результат, поэтому в сигнатуре метода в качестве типа возвращаемого результата указано ключевое слово void. У метода два аргумента: один типа doublе и второй типа int. Первый аргумент присваивается в качестве значения полю x, второй определяет значение поля m.
Обращаем внимание, что описание класса к созданию объектов не приводит. Другими словами, описывающий класс код - это всего лишь шаблон, по которому впоследствии можно создавать объекты, а можно и не создавать. В данном случае команды по созданию объекта клacca MyClass могут выглядеть так:
MyClass obj; // Объектная переменная
obj=new MyClass(); // Создание объекта
Или так:
MyClass obj=new MyClass();
В последнем случае объединены две команды: команда объявления объектной переменной и команда создания объекта.
Jаvа-программа может состоять из нескольких классов. Классы можно описывать в разных файлах, но каждый класс должен быть описан только в одном файле. В Java описание метода и его реализация должны размещаться вместе в теле класса.
Поскольку все объекты класса создаются по единому шаблону, очевидно, что они имеют одинаковый набор полей и методов. Если в программе используется несколько объектов одного класса, необходимо как-то различать, поле или метод какого объекта вызывается - ведь только по названию метода или поля этого не определишь. В Jаvа, как и в прочих объектно-ориентированных языках, применяют так называемый точечный синтаксис. Основная его идея состоит в том, что при обращении к полю или методу объекта сначала указывается имя этого объекта, затем ставится оператор «точка» и после этого имя поля или метода. Забегая наперед, заметим, что кроме обычных существуют так называемые статические члены класса (обычно это поля). Статический член класса один для всех объектов класса. Для использования статического члена класса объект создавать не обязательно. К статическому члену обычно обращаются тоже через точечный синтаксис, но вместо имени объекта указывается имя класса (хотя можно задействовать и стандартный способ обращения через объект).
В листинге 1 приведен пример программы; в ней, кроме основного класса, описан еще один класс, в котором объявляются несколько полей и два метода, а также показано, как эти поля и метод используются в программе.
Листинг 1. Класс с полями
class Coords{
// Координаты точки:
double х:
double у;
double z;
// Метод для присваивания значений полям:
void set(double a, double b, double с){
х=а;
у=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;
// Обращение к методу объекта:
Sуstеm. оut. рrintln("Расстояние до точки: "+obj. getDistance());
}
}
В программе объявляется класс Coords, который имеет три поля х, у и z - все типа doublе. Поля являются аналогом координат точки в трехмерном пространстве. Кроме этого, у класса есть два метода. Метод set() не возвращает результат (использован идентификатор типа void) и предназначен для присваивания значений полям. У метода три аргумента - значения, присваиваемые полям х, у и z соответственно.
Метод getDistance() не имеет аргументов и возвращает в качестве результата значение типа doublе, которым определяется расстояние от начала координат системы до точки (напомним, что для точки с координатами х, у и z расстояние определяется выражением √(х2 + у2 + z2). Для вычисления квадратного корня использована статическая функция sqrt() встроенного Jаvа-класса 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().
Статические элементы
Помимо обычных полей и методов, в классе могут быть статические члены. От нестатических членов статические принципиально отличаются тем, что они общие для всех объектов данного класса. Например, если речь идет о нестатическом поле, то у каждого объекта класса это поле имеет свое уникальное для объекта значение. Если поле является статическим, то у всех объектов значение этого поля одно и то же.
Для объявления статического члена класса, в том числе статического поля, используется идентификатор static. Синтаксис описания статического поля следующий:
static тип_поля имя_поля;
Перед ключевым словом statiс также может следовать спецификатор доступа к полю. Инициализация значения статического поля выполняется в специальном статическом блоке. Статический блок также выделяется ключевым словом static, после которого в фигурных скобках следуют команды инициализации статических полей класса. Статический блок не является обязательным. Синтаксис описания статического блока такой:
static{ // начало статического блока
// статический блок
} // завершение• статического блока
Вне класса обращение к статическим элементам может выполняться обычным способом (через объект), однако, как правило, к ним обращаются непосредственно через класс: после имени класса через точку указывается имя статического поля.
Статические методы класса от обычных отличаются в первую очередь тем, что могут обращаться только к статическим полям класса. Причина достаточно очевидна: метод, который не связан с конкретным экземпляром класса, может, естественно, оперировать с полями, тоже не связанными с конкретным экземпляром, поскольку действие метода должно затрагивать сразу все объекты, относящиеся к классу. Кроме того, в статических методах недопустимо использование ключевых слов this (ссылка на экземпляр класса, из которого вызывается метод) и super (ссылка на экземпляр суперкласса, на основе которого создан вызывающий метод производный класс). Причина та же, что и в первом случае.
Объявляется статический метод так же, как и статическое поле. В частности, в сигнатуре метода указывается ключевое слово static:
static тип_результата имя_метода(список аргументов){
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


