Главная » Java, Web » Создание классов на основе существующих классов java

0

Мы говорили о подклассах, но делали это только теоретически. Сейчас мы коснемся практической стороны работы с подклассами. В повседневном программировании работа с подклассами главным образом сводится к тому, что разработчик создает новые классы на основе уже существующих классов. Разработка новых классов с нуля, создание классов на основе собственных классов — весь этот процесс создания больших пакетов с нуля используется не всегда. Существующий класс может быть использован для создания подкласса, при этом подкласс расширяет базовый суперкласс, на что указывает модификатор extends:

class имя-подкласса extends имя-существующего-класса { // изменения и дополнения

}

(Конечно, класс может быть объявлен как public.)

В качестве примера можно рассмотреть карточную игру Blackjack. При создании программы мы можем воспользоваться существующими классами card (Карта), Hand (Сдача), Deck (Набор карт). Сдача при игре в Blackjack отличается от сдачи в других играх. Мы должны иметь возможность посчитать значение сдачи в игре Blackjack. Правило вычисления значения следующее. Значение сдачи вычисляется путем сложения значений всех карт, входящих в сдачу. Значение для валета, дамы и короля равно 10, значение туза равно либо 1, либо 11, в зависимости от того, превысит сумма (значение сдачи) величину 21 или нет. Если сумма становится больше 21, то значение туза 1, в противном случае туз дает 11 очков. Это означает, что второй, третий и четвертый туз в сдаче дает по одному очку.

Чтобы учесть эти особенности, можно создать класс на основе класса Hand, в который можно вставить метод, вычисляющий значение сдачи:

public class BlackjackHand extends Hand { public int getBlackjackValue() { // возвращает значение сдачи // для игры Blackjack int val;                   // значение сдачи

boolean асе; // значение true, если в сдаче есть туз

int cards; // количество карт в сдаче

val = 0;

асе = falser-

cards = getCardCount ();

for (int i = 0; i < cards; i++) {

// прибавляем к значению сдачи значение 1-ой карты Card card; // 1-ая карта

int cardVal; // значение 1-ой карты card = getCard(i);

cardVal = card.getValue(); // обычное значение от 1 до 13 if (cardVal > 10) {

cardVal =10; // Для валета, дамы, короля.

}

if (cardVal == 1) {

асе = true;                // Есть хотя бы один туз.

}

val = val + cardVal;

}

if (асе == true && val + 10 <= 21) val = val + 10; return val;

} }

Указатели this и super

В языке Java существуют специальные переменные this и super. Статический член класса обладает простым именем, которое доступно только внутри класса. Чтобы использовать это имя за пределами класса, его необходимо указать в составе полного имени в форме имя-класса.простое-имя, например System.out. Полное имя для статических имен можно использовать всегда, в том числе и внутри класса, которому они принадлежат. Иногда это просто необходимо, например, в том случае, если статическое имя члена класса скрыто за таким же локальным именем.

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

Java предлагает специальную, заранее определенную переменную this. Именно эта переменная помогает в данной ситуации. Эта переменная указывает на текущий объект. Если х — это переменная экземпляра класса, то полное имя этой переменной будет this.x. Если метод otherMethodо — метод экземпляра класса, то его полное имя this.otherMethod о .

! Пример                                                                                                                                                    !

public class Student {

private String name; // имя студента public Student(String name) {

// Конструктор. Создаем учётную запись студента с указанным именем. this.name = name;

//Прочие переменные и методы.

В экземпляре объекта имя name скрыто за именем, которое используется в списке параметров. Чтобы использовать переменную экземпляра класса с таким же именем, как и имя параметра, мы пользуемся полным именем, а именно this.name. Это упрощает жизнь — нет необходимости придумывать новые имена для параметров. Еще один пример применения this — использование методов, которые в качестве параметра получают ссылку на объект. Для вывода строкового представления объекта мы можем написать System.out.println(this);.

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

I Пример                                                                                                                                                    I

public class GraphicalDice extends PairOfDice { public void roll() {

// бросает и прорисовывает кости.

super.roll(); // вызывает метод roll класса.

redraw();          // рисует кости.

// прочие методы, в том числе определение метода redraw()

Конструкторы в подклассах

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

Проблема решается с использованием специальной переменной super. В качестве первой инструкции конструктора мы можем использовать super, эта инструкция вызовет конструктор суперкласса. Если конструктор суперкласса в качестве параметров требует задания двух целых чисел (как в примере ниже), то мы можем написать так:

public class GraphicalDice extends PairOfDice {

public GraphicalDice() { // конструктор этого класса

super(3,4); // вызов конструктора класса PairOfDice с параметрами 3, 4 initializeGraphics(); // инициализация для класса GraphicalDice

//прочие конструкторы, методы, переменные…

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии