Классы в языке Java

Классы являются основой объектно-ориентированного программирования. Физически классу соответствует некоторая сущность.

Например, можно рассматривать класс автомобилей, класс водителей, класс дорожных знаков, класс бездомных животных и т. п. Для того чтобы что-то можно было делать с классом, его следует описать. Схематически это можно представить таким образом:

class автомобиль {

описание свойств класса автомобиль описание методов класса автомобиль

}

Свойствами класса автомобиль могут быть стоимость, марка, тип, срок эксплуатации. Каждое свойство для различных автомобилей различное, но оно принадлежит некоторому диапазону значений. Диапазон значений называется в программировании типом. С учетом сказанного можно несколько детализировать описание класса автомобиль.

class автомобиль {Число стоимость;

Строка марка;

Строка тип;

Число срок;

описание методов класса автомобиль

}

Допустим, в классе автомобиль определен метод show(), который выдает на дисплей информацию о стоимости и марке автомобиля:

show ()

{

выдать на дисплей <марка>; выдать на дисплей <стоимость>;

}

Теперь определение класса получает следующий вид:

class автомобиль

Число стоимость;

Строка марка;

Строка тип;

Число срок; show ()

{

вьщать на дисплей <марка>; выдать на дисплей <стоимость>;

}

}

Разумно также определить метод для установки начальных значений всех свойств. Такой метод по терминологии, принятой в объектном программировании, называется конструктором. Название конструктора совпадает с названием класса. Его можно было бы определить так:

автомобиль (s,m,t,srok)

{

стоимость = s; марка = m; тип = t; срок = srok;

}

Объединяя все сказанное о классе автомобиль, получим следующее его описание:

class автомобиль {

Число стоимость;

Строка марка;

Строка тип;

Число срок; show ()

вьщать на дисплей <марка>; выдать на дисплей <стоимость>;

}

автомобиль (s,m,t,srok)

{

стоимость = s; марка = m; тип = t; срок = srok;

}

}

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

автомобиль myauto = new автомобиль(3000,

"opel","дизель",10);

Можно создать еще один автомобиль таким же образом:

автомобиль myauto2 = new автомобиль(3500,

"audi","дизель",7);

Переменные myauto и myauto2 называются объектными переменными. Каждая из этих переменных получила значения свойств при выполнении конструктора. Можно воспользоваться методом show (), чтобы показать, каковы эти значения — например, выполнить команду: myauto2.show();

Эта команда должна вывести на экран дисплея информацию об индивидуальном автомобиле myauto2.

На основании класса автомобиль можно построить другой класс, например, автомобиль_на_продажу. Мы хотели бы, чтобы в этом классе присутствовало свойство продажная_цена и свойство покупатель, а также новый метод — продан(), который возвращает значение "продан", если свойство покупатель имеет не пустое значение.

Новый класс наследует свойства и методы класса автомобиль и добавляет новые свойства и методы. Это делается следующим образом:

class автомобиль_на_продажу extends автомобиль {

Число продажная_цена;

Строка покупатель; продан ()

{

если покупатель=="" return "продан"; иначе return "не продан";

}

}

Для данного класса используется конструктор класса автомобиль. Но этот конструктор не определяет значения свойств покупатель и продажная_цена. Поэтому, вообще говоря, нам следует позаботиться о написании нового конструктора, например:

автомобиль_на_продажу (s,m,t,srok,pc,pok)

{

aBTOMo6nnb(s,m,t,srok); // вызьшаемродительский конструктор продажная_цена=рс; покупатель =po k;

}

Обратим внимание на то, что в новом конструкторе нам пришлось вызвать конструктор класса автомобиль. В Java дочерний ютсс при использовании собственного конструктора должен вызывать конструктор родительского класса с помощью команды super(cnncoK аргументов). Таково техническое решение, предложенное разработчиками языка. Хорошо оно, или плохо — нам выбирать не приходится.

Заметим, что хотя свойства стоимость, марка, тип, срок не определены в классе автомобиль_на_продажу, в конструкторе мы явно ссылаемся на эти свойства. Таким образом, мы рассмотрели одно из важнейших свойств класса — наследование. Также классы обладают еще такими свойствами, как полиморфизм и инкапсуляция, о чем более подробные сведения можно почерпнуть из [6].

Следует ли уничтожать создаваемые объекты? Вообще говоря — да, однако Java снимает эту обязанность с программиста. Java "понимает", когда созданный объект больше не требуется, и удаляет его из памяти. Это одно из больших достоинств Java.

Теперь мы перейдем к рассмотрению синтаксиса классов в языке Java.

Начнем с примера приложения (листинг 1.6), демонстрирующего использование классов.

ЛистинН.6. Демонстрация использования классов

import java.awt.*; import java.awt.event.*; class Book

String title; int price;

Book(String s, int i)

this.title=s; this.price=i;

public class labl extends Frame implements ActionListener {

Book book;

Button bl=new Button("Exit");

Button b2=new Button("Create Object");

Button b3=new Button("Show Object"); public labl()

{

setLayout(null) ; add (Ы) ; add(b2); add (b3) ;

Ы.addActionListener(this); b2.addActionListener(this) ; b3.addActionListener(this);

Ы.setBounds(20,20,100,20) ; b2.setBounds (20,50,100,20); b3.setBounds(20,80,100,20); setBackground(new Color(120,200,120));

}

public void actionPerformed (ActionEvent e)

{

if (e.getSource()==bl)

System.exit(0); else

if (e.getSource()==b2)

{

if (book == null) book=new Book("Pinoccio",200); else

System.out.println("The object already exists");

}

else

if (e.getSource()==b3)

{

if(book!=null)

{

Graphics g= getGraphics(); g.drawString(book.title,20,200);

}

}

}

public static void main(String [] args)

{

labl f= new labl();

resize(500,500);

f.setVisible(true);

}

}

В этом примере первым объявлен класс Book: class Book {

String title; int price;

Book(String s, int i)

{

this.title=s;

this.price=i;

}

}

В данном классе объявлены два члена (переменные) класса — titie и price. Переменная titie имеет тип string (строковый), переменная price имеет тип int (простой целочисленный тип). Таким образом, создавая объект данного класса, мы рассчитываем, что он будет иметь эти два свойства: titie и price. Вот то место в программе, где мы создаем объект класса

Book:

{

if (book == null) book=new Book("Pinoccio",200);

Переменная book — это не строка и не число. Она называется объектной переменной. Коротко — объектом (или экземпляром класса). Объект является чем-то реальным (соответствует чему-то реальному). В самом деле, конкретная книга есть некий реальный объект, который имеет название и цену. Можно указывать и другие свойства объекта-книги, но в нашем примере это не требуется.

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

book=new Book ("Pinoccio",200);

как раз и обращается к конструктору класса Book. Следует помнить, что конструктор имеет то же имя, что и сам класс. Для чего нужен конструктор? Для того, главным образом, чтобы инициализировать члены класса.

Инициализировать члены класса — значит, присвоить им какието начальные значения. Такими значениями в нашем примере являются название книги "Pinoccio" и цена книги 200. Само присваивание этих значений реализуется в теле конструктора следующим образом

Book(String s, int i)

{

this.title=s;

this.price=i;

}

Идентификатор this вообще говоря, избыточен. Он указывает на тот объект, который инициализируется в конструкторе. Не забываем, что конструктор может использоваться для создания многих объектов. Поскольку вызов конструкторов — частое явление, то запомним, как это схематически реализуется:

MMH_o6beKTHoii_nepeMeHHoii=new имя_класса_объектной_переменной(параметры);

Итак, описание класса Book завершено. Вторым классом является класс labl. Этот класс объявлен как public. Только один класс в приложении Java может содержать метод main() и должен быть объявлен как public. В этом классе помещается точка входа во все приложение — метод с именем main(). Файл, в котором необходимо сохранить данное приложение, должен называться labl.java — именно так, как называется класс public. В классе iabi объявляются объектная переменная book ранее описанного класса Book и программные кнопки (объекты класса :-..:: ■ ):

Book book;

Button bl=new Button("Exit");

Button b2=new Button("Create Object");

Button b3=new Button("Show Object");

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

В классе labl также имеется конструктор:

public labl()

{

setLayout(null); add (Ы) ; add(b2); add (b3) ;

Ы.addActionListener(this) ; b2.addActionListener(this) ; b3.addActionListener(this) ;

Ы.setBounds(20,20,100,20) ; b2.setBounds (20,50,100,20); b3.setBounds(20,80,100,20); setBackground(new Color(120,200,120));

Этот конструктор добавляет кнопки на форму:

add(bl) ; add(b2); add (b3) ;

устанавливает их размеры и места расположения:

Ы.setBounds(20,20,100, 20) ; b2.setBounds (20,50,100,20); b3.setBounds(20,80,100,20); включает для них прослушивателъ событий:

Ы.addActionListener(this); b2.addActionListener(this) ; b3.addActionListener(this) ;

Благодаря прослушивателю событий можно для программных кнопок написать код обработки щелчка мышью.

В классе iabi объявлены три метода:

□               конструктор iabi ();

П обработчик событий public void actionPerformed (ActionEvent e);

□               главный метод класса, с которого начинается выполнение всей программы: main ().

Созданный файл (например, в программе Блокнот) следует сохранить как labl.java.

Компиляция этого файла реализуется из командной строки MS- DOS:

javac labl.java

Чтобы ввести эту команду, например, из программы NC (Norton Commander), наберите в командной строке >cmd.

Программа javac — это и есть компилятор Java-nporpaMM. Если ошибок нет, то будут построены классы iabl.ciass и Book. class. Все эти файлы будут размещены в одном каталоге.

Теперь выполним приложение, введя в командной строке:

java labl

Рис. 1.4. Визуальный интерфейс программы, код которой представлен в листинге 1.6

Увидим такую форму (рис. 1.4).

На форме показан результат нажатия кнопок Create Object и Show Object.

Спросим, почему, собственно, появилось окно? Рассмотрим снова объявление класса iabi:

public class labl extends Frame implements ActionListener

Слова extends Frame в этом объявлении означают, что класс iabi наследует открытые свойства и методы класса Frame. Класс Frame есть родитель класса iabi. В Java в качестве родителя может указываться только один класс или ни одного. Класс Frame как раз и представляет собой окно (форму). Так что ясно, что и labl суть окно. Класс Frame стандартный. Это значит, что в дистрибутиве Java поставляется пакет, содержащий описание данного класса. Такие пакеты подключаются к программе в самом ее начале командой import. Оконные классы подключаются через пакеты java.awt.*. Выполним программу, предварительно убрав строку: import java.awt.*;

Система выдаст 23 сообщения об ошибке (у вас, возможно, их будет и не 23). Знание стандартных классов очень важно, так как они содержат огромное число полезных методов и свойств, без которых пришлось бы писать очень длинные программы. Мы еще вернемся к использованию классов чуть позже в этой главе. Общие принципы использования классов можно найти в [6].

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100