Шрифт:
Запустив эту программу на выполнение, вы увидите, что она ведет себя точно так же, как и предыдущая ее версия. Преимущество текущей ее версии заключается лишь в том, что теперь справочная система может быть использована повторно всякий раз, когда в этом возникнет потребность. Конструкторы
В предыдущем примере программы мы вынуждены были вручную устанавливать значения переменных экземпляра для каждого объекта типа Vehicle, как показано ниже. minivan.passengers = 7; minivan.fuelcap = 16; minivan.mpg =21;
Но такой подход вообще не применяется в программах, профессионально написанных на Java, по следующим причинам. Во-первых, существует большая вероятность допустить ошибку (можно, например, забыть установить значение одного из полей). И во-вторых, существует гораздо более простой и надежный способ решения подобной задачи: использовать конструктор.
Конструктор инициализирует объект при его создании. У конструктора такое же имя, как и у его класса, а с точки зрения синтаксиса он подобен методу. Но у конструкторов нет возвращаемого типа, указываемого явно. Как правило, конструкторы используются для задания первоначальных значений переменных экземпляра, определенных в классе, или же для выполнения любых других установочных процедур, которые требуются для создания полностью сформированного объекта.
У всех классов имеются конструкторы, независимо от того, определите вы их или нет, поскольку в Java автоматически предоставляется конструктор, используемый по умолчанию и инициализирующий все переменные экземпляра их значениями по умолчанию. Для большинства типов данных значением по умолчанию является нулевое, для типа bool — логическое значение false, а для ссылочных типов — пустое значение null. Но как только вы определите свой собственный конструктор, конструктор по умолчанию больше не используется.
Ниже приведен простой пример, демонстрирующий применение конструктора. // Простой конструктор. class MyClass { int х; // Конструктор класса MyClass. MyClass { х = 10; } } class ConsDemo { public static void main(String args[]) { MyClass tl = new MyClass; MyClass t2 = new MyClass; System.out.println(tl.x + " " + t2.x); } }
В данном примере конструктор класса MyClass объявляется следующим образом: MyClass { х = 10; }
В этом конструкторе переменной экземпляра х, определяемой в классе MyClass, присваивается значение 10. Этот конструктор вызывается оператором new при создании объекта данного класса. Ниже приведена строка кода, в которой используется оператор new. MyClass tl = new MyClass;
В этой строке кода для объекта tl вызывается конструктор MyClass , в котором переменной экземпляра tl. х присваивается значение 10. То же самое происходит и для объекта t2. После вызова данного конструктора переменная экземпляра t2. х также получает значение 10. Таким образом, выполнение приведенного выше примера программы дает следующий результат: 10 10 Параметризированные конструкторы
В предыдущем примере использовался конструктор без параметров. В некоторых случаях этого оказывается достаточно, но зачастую конструктор должен принимать один или несколько параметров. В конструктор параметры вводятся таким же образом, как и в метод. Для этого достаточно объявить их в скобках после имени конструктора. Ниже приведен пример применения параметризированного конструктора класса MyClass. // Параметризированный конструктор. class MyClass { int х; //У этого конструктора имеется параметр. MyClass(int i) { х = i; } } class ParmConsDemo { public static void main(String args[]) { MyClass tl = new MyClass(10); MyClass t2 = new MyClass(88); System.out.println(tl.x + " " + t2.x); } }
Результат выполнения данной программы выглядит следующим образом: 10 88
В данной версии программы в конструкторе класса MyClass определяется единственный параметр i, который используется для инициализации переменной экземпляра х. При выполнении следующей строки кода значение 10 сначала передается параметру i данного конструктора, а затем присваивается переменной х: MyClass tl = new MyClass(10); Добавление конструктора в класс Vehicle
Теперь мы можем усовершенствовать класс Vehicle, добавив в него конструктор, в котором будут автоматически инициализироваться поля passengers, fuelcap и mpg при построении объекта. Обратите особое внимание на то, каким образом создаются объекты типа Vehicle. // Добавление конструктора. class Vehicle { int passengers; // количество пассажиров int fuelcap; // емкость топливного бака int mpg; // потребление топлива в милях на галлон // Это конструктор класса Vehicle. Vehicle(int р, int f, int m) { passengers = p; fuelcap = f; mpg = m; } // возвратить дальность действия транспортного средства int range { return mpg * fuelcap; } // рассчитать объем топлива, необходимого транспортному // средству для преодоления заданного расстояния double fuelneeded(int miles) { return (double) miles / mpg; } } class VehConsDemo { public static void main(String args[]) { // сконструировать полностью объекты транспортных средств Vehicle minivan = new Vehicle(7, 16, 21); Vehicle sportscar = new Vehicle(2, 14, 12); double gallons; int dist = 252; gallons = minivan.fuelneeded(dist); System.out.println("To go " + dist + " miles minivan needs " + gallons + " gallons of fuel."); gallons = minivan.fuelneeded(dist); System.out.println("To go " + dist + " miles sportscar needs " + gallons + " gallons of fuel."); } }
При создании объекты minivan и sportscar инициализируются конструктором Vehicle . Каждый такой объект инициализируется параметрами, указанными в конструкторе его класса. Например, в строке кода Vehicle minivan = new Vehicle(7, 16, 21);
значения 7, 16 и 21 передаются конструктору Vehicle в качестве параметров при создании нового объекта minivan с помощью оператора new.
В итоге копии переменных passengers, fuelcap и mpg в объекте minivan будут содержать значения 7, 16 и 21 соответственно. Рассмотренная здесь версия программы дает такой же результат, как и ее предыдущая версия. Еще раз об операторе new
Теперь, когда вы ближе ознакомились с классами и их конструкторами, вернемся к оператору new, чтобы рассмотреть его более подробно. Ниже приведена общая форма этого оператора в контексте присваивания. переменная_класса = new имя_класса{список_аргументов)
где переменнаякласса обозначает тип переменной создаваемого класса, а имякласса — конкретное имя класса, реализуемого в виде экземпляра его объекта. Имя класса и списокаргументов в скобках, который может быть пустым, обозначают конструктор этого класса. Если в классе не определен его собственный конструктор, то в операторе new будет использован конструктор, предоставляемый в Java по умолчанию. Следовательно, оператор new может быть использован для создания объекта, относящегося к классу любого типа. Оператор new возвращает ссылку на вновь созданный объект, который получает переменнаякласса в результате присваивания в данной форме записи.