×
Traktatov.net » Философия Java » Читать онлайн
Страница 71 из 395 Настройки
Это полезно, особенно в отношении простых различий. Вы говорите «вымыть посуду», «вымыть машину» и «вымыть собаку». Было бы глупо вместо этого говорить «посудоМыть посуду», «машиноМыть машину» и «собакоМыть собаку» только для того, чтобы слушатель не утруждал себя выявлением разницы между этими действиями. Большинство человеческих языков несет избыточность, и даже при пропуске некоторых слов определить смысл не так сложно. Уникальные имена не обязательны — сказанное можно понять из контекста.

Большинство языков программирования (и в особенности С) требовали использования уникальных имен для всех функций. Иначе говоря, программа не могла содержать функцию print() для распечатки целых чисел и одноименную функцию для вывода вещественных чисел — каждая функция должна была иметь уникальное имя.

В Java (и в С++) также существует другой фактор, который заставляет использовать перегрузку имен методов: наличие конструкторов. Так как имя конструктора предопределено именем класса, оно может быть только единственным. Но что, если вы захотите создавать объекты разными способами? Допустим, вы создаете класс с двумя вариантами инициализации: либо стандартно, либо на основании из некоторого файла. В этом случае необходимость двух конструкторов очевидна: один из них не имеет аргументов (конструктор по умолчанию, также называемый конструктором без аргументов (no-arg)), а другой получает в качестве аргумента строку с именем файла. Оба они являются полноценными конструкторами, и поэтому должны называться одинаково — именем класса. Здесь перегрузка методов (overloading) однозначно необходима, чтобы мы могли использовать методы с одинаковыми именами, но с разными аргументами>8. И хотя перегрузка методов обязательна только для конструкторов, она удобна в принципе и может быть применена к любому методу.

Следующая программа показывает пример перегрузки как конструктора, так и обычного метода:

//: initialization/Overloading.java // Демонстрация перегрузки конструкторов наряду // с перегрузкой обычных методов, import static net.mindview util Print *;

class Tree {

int height:

Tree О {

print("Сажаем росток"): height = 0;

}

Tree(int initialHeight) {

height = i niti alHeight: print("Создание нового дерева высотой " + height + " м."):

}

void infoO {

print("Дерево высотой " + height + " м."):

}

void info(String s) {

продолжение &

print(s + ": Дерево высотой " + height + " м.");

}

}

public class Overloading {

public static void main(String[] args) { for(int i = 0; i < 5; i++) { Tree t = new Tree(i); t.infoO:

t.info("Перегруженный метод");

}

// Перегруженный конструктор: new TreeO;

}

} /* Output:

Создание нового дерева высотой 0 м.

Дерево высотой 0 м.

Перегруженный метод: Дерево высотой 0 м.

Создание нового дерева высотой 1 м.

Дерево высотой 1 м.

Перегруженный метод: Дерево высотой 1 м.

Создание нового дерева высотой 2 м.

Дерево высотой 2 м.

Перегруженный метод: Дерево высотой 2 м.

Создание нового дерева высотой 3 м.

Дерево высотой 3 м.

Перегруженный метод: Дерево высотой 3 м.

Создание нового дерева высотой 4 м.

Дерево высотой 4 м.