Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 6. Введение в классы 157

Эта программа генерирует следующий вывод:

Стек в mystackl:

9

8

7

6 . - .

5

4

3

2

1

о

Стек в mystack2:

19 '

18

17

16

15

14

13

12

11

10

Нетрудно заметить, что содержимое каждого стека различно.

Наконец, последнее замечание относительно класса stack: в данной реали­зации возможно изменение массива stck, который содержит стек, кодом, находящимся вне класса stack, оставляя его открытым для неправильного использования или повреждений. В следующей главе вы увидите, как ис­править эту ситуацию.

Глава 7

Методы и классы

Эта глава продолжает обсуждение методов и классов, начатое в предшест­вующей главе. В ней рассматривается несколько тем, касающихся методов, включая перегрузку, передачу параметров и рекурсию. Затем изложение воз­вращается к классам, обсуждая управление доступом, использование клю­чевого слова static и один из наиболее важных встроенных Java-классов

String.

Перегрузка методов

В языке Java в пределах одного класса можно определить два или более ме­тодов, которые совместно используют одно и то же имя, но имеют разное количество параметров. Когда это имеет место, методы называют перегру­женными, а о процессе говорят как о перегрузке метода. Перегрузка мето­дов — один из способов, с помощью которого Java реализует полиморфизм. Если вы никогда не пользовались языком, допускающим перегрузку мето­дов, то концепция может сначала показаться странной. Но, как вы увидите, перегрузка метода — одна из наиболее захватывающих и полезных особен­ностей языка Java.

Чтобы определить при вызове, какую версию перегруженного метода в дей­ствительности вызывать, Java руководствуется типом и/или числом его па­раметров. Таким образом, перегруженные методы должны отличаться по типу и/или числу их параметров. Хотя такие методы могут иметь различные типы возвращаемого значения, однако одного его недостаточно, чтобы раз­личить две версии метода. Когда Java сталкивается с вызовом перегружен­ного метода, он просто выполняет его (метод) версию, чьи параметры соот­ветствуют параметрам, используемым в вызове.

Глава 7. Методы и классы 159

Простой пример, который иллюстрирует перегруженный метод:

// Демонстрация перегруженного метода, class OverloadDemo {

void test() {

System.out.println("Параметры отсутствуют");

}

// Перегруженный метод test с одним int-параметром. void test(int a) j

System.out.println("a: " + a); }

// Перегруженный метод test с двумя int-параметрами. void testtint a, int b) {

System.out.println("а и Ь: " + a + " " + b); }

// Перегруженный метод test с double-параметром, double test(double a) {

System.out.println("Вещественное двойной точности а: " + a),

return a*a; } }

class Overload {

public static void main(String arcfs [] ) { OverloadDemo ob = new OverloadDemo(); double result;

// вызвать все версии testf) ob.test(); ob.test(10); ob.test(10, 20); result = ob.test(123.2);

System.out.println("Результат ob.test(123.2): " + result) } }

Эта программа генерирует следующий вывод:

Параметры отсутствуют

а: 10

а и Ь: 10 20

Вещественное двойной точности а: 123.2

Результат ob.test(123.2): 15178.24

Как можно видеть, test о перегружен четыре раза. Первая версия не имеет никаких параметров, вторая имеет один параметр целого типа, третья — два

160 Часть I. Язык Java

целочисленных параметра, а четвертая — один double-параметр. Тот факт, что четвертая версия test о еще и возвращает значение, не имеет никакого отношения к перегрузке, так как типы возвращаемых значений не играют никакой роли для выбора перегруженных методов.

Когда вызывается перегруженный метод, Java ищет соответствие между ар­гументами вызова метода и его параметрами. Однако это соответствие не всегда может быть точным. В некоторых случаях определенную роль в вы­боре перегруженного метода могут сыграть автоматические преобразования типов Java. Например, рассмотрим следующую программу:

// Автоматическое преобразование типов в применении к перегрузке, class OverloadDemo {

void test() {

System.out.println("Параметры отсутствуют");

}

// Перегруженный test с двумя int-параметрами. void test(int a, int b) {

System.out.println("а и b: " + a + " " + b); }

// Перегруженный test с double-параметром и возвращаемым типом, void test(double a) {

System.out.println("Внутри test(double) a: " + a); } '

}

class Overload {

public static void main(String args[]) { OverloadDemo ob = new OverloadDemo (); int i = 88;

ob.testO;

ob.test(10, 20);

ob.test(i); // здесь будет вызван test(double) ob.test(123.2); // здесь будет вызван test(double) } }

Эта программа генерирует следующий вывод:

Параметры отсутствуют

а и Ь: 10 20

Внутри test (double) a: 88

Внутри test (double) a: 123.2

Соседние файлы в папке JavaLit