Для того чтобы проиллюстрировать особенности создания классов на языке Java, создадим класс, инкапсулирующий сведения о транспортных средствах, например, о легковых автомобилях, фургонах и грузовиках. Назовем этот класс Vehicle. В нем будут храниться следующие сведения: количество пассажиров, емкость топливного бака и среднее потребление топлива (в милях на галлон).
Ниже приведен первый вариант класса Vehicle. В нем определены три переменные экземпляра: passengers, fuelcap и mpg. Обратите внимание на то, что в классе Vehicle пока еще отсутствуют методы. Они будут добавлены в последующих разделах, а до тех пор в этом классе содержатся только данные.
1 2 3 4 5 |
class Vehicle { int passengers; // количество пассажиров int fuelcap; // емкость топливного бака int mpg; // потребление топлива в милях на галлон } |
Объявление класса создает новый тип данных. В данном случае этот тип называется Vehicle. Мы будем использовать это имя для объявления объектов типа Vehicle. Вспомните, что объявление класса — это всего лишь описание типа данных, и реальный объект при этом не создается. Следовательно, приведенный выше код не приводит к появлению объектов типа Vehicle.
Для фактического создания реального объекта Vehicle потребуется примерно следующий код:
1 |
Vehicle minivan = new Vehicle() // создать объект minivan типа Vehicle |
В результате создается объект minivan, представляющий собой экземпляр класса Vehicle. Иными словами, абстрактная оболочка класса обретает физическую форму.
Всякий раз, когда вы создаете экземпляр класса, вы создаете объект, содержащий собственные копии всех переменных экземпляра, определенных в классе. Иными словами, каждый объект типа Vehicle будет содержать свои копии переменных passengers, fuelcap и mpg. Для обращения к этим переменным используется так называемая точечная нотация, в соответствии с которой имя переменной указывается после имени объекта и отделяется от него точкой:
1 |
объект.член |
В этой форме объект указывается слева, а член — справа от точки. Так, если переменной fuelcap объекта minivan требуется присвоить значение 16, это можно сделать следующим образом:
1 |
minivan.fuelcap = 16; |
Вообще говоря, точечной нотацией можно пользоваться для обращения как к переменным экземпляра, так и к методам.
Ниже приведен пример программы, в которой используется класс Vehicle.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/* Программа, в которой используется класс Vehicle * Присвойте файлу с исходным кодом имя VehicleDemo.java */ class Vehicle { int passengers; // количество пассажиров int fuelcap; // емкость топливного бака int mpg; // потребление топлива в милях на галлон } //В этом классе объявляется объект типа Vehicle class VehicleDerno { public static void main(String args[]) { Vehicle minivan = new Vehicle(); int range; // Присвоить значения полям в объекте minivan minivan.passengers = 7; minivan.fuelcap = 16; minivan.mpg = 21; // Рассчитать дальность поездки при полном баке range = minivan.fuelcap * minivan.mpg; System.out.println("Mини-фypгoн может перевезти " + minivan.passengers + " пассажиров на расстояние " + range +" миль"); } } |
Файлу, содержащему приведенный выше код, следует присвоить имя VehicleDemo.java, поскольку метод main() находится не в классе Vehicle, а в классе VehicleDemo.
В результате компиляции программы будут созданы два файла с расширением . class:
- один — для класса Vehicle
- другой — для класса VehicleDemo
Компилятор Java автоматически помещает каждый класс в отдельный файл с расширением .class.
Совсем не обязательно, чтобы классы Vehicle и VehicleDemo находились в одном и том же исходном файле. Их можно расположить в двух файлах: Vehicle.java и VehicleDemo.java.
Для того чтобы привести эту программу в действие, следует запустить на выполнение файл VehicleDemo. class. В итоге на экран будет выведен следующий результат:
1 |
Мини-фургон может перевезти 7 пассажиров на расстояние 336 миль |
Прежде чем двигаться дальше, рассмотрим следующий основополагающий принцип: каждый объект содержит собственные копии переменных экземпляра, определенных в его классе.
Следовательно, содержимое переменных в одном объекте может отличаться от содержимого тех же самых переменных в другом объекте. Между объектами нет никакой связи, за исключением того, что они относятся к одному и тому же типу.
Так, если имеются два объекта типа Vehicle, каждый из них содержит собственную копию переменных passengers, fuelcap и mpg, причем значения одноименных переменных в этих двух объектах могут отличаться.
Продемонстрируем это на примере приведенной ниже программы (обратите внимание на то, что класс, содержащий метод main(), на этот раз назван TwoVehicles).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// В этой программе создаются два объекта класса Vehicle class Vehicle { int passengers; // количество пассажиров int fuelcap; // емкость топливного бака int mpg; // потребление топлива в милях на галлон } //В этом классе объявляется объект типа Vehicle class TwoVehicles { public static void main (String args []) { Vehicle minivan = new Vehicle(); Vehicle sportscar = new Vehicle(); int range1, range2; // Присвоить значения полям в объекте minivan minivan.passengers = 7; minivan.fuelcap = 16; minivan.mpg = 21; // Присвоить значения полям в объекте sportscar sportscar.passengers = 2; sportscar.fuelcap = 14; sportscar.mpg = 12; // Рассчитать даль ность поездки при полном баке range1 = minivan.fuelcap * minivan.mpg; range2 = sportscar.fuelcap * sportscar.mpg; System.out.println("Мини-фypгoн может перевезти" + minivan.passengers + "пассажиров на расстояние" + range1 + " миль"); System.out.println("Cпopтивный автомобиль может перевезти" + sportscar.passengers + " пассажиров на расстояние" + range2 + " миль"); } } |
Ниже приведен результат выполнения данной программы:
1 2 |
Мини-фургон может перевезти 7 пассажиров на расстояние 336 миль Спортивный автомобиль может перевезти 2 пассажиров на расстояние 168 миль |
Как видите, данные из объекта mini van отличаются от соответствующих данных из объекта sportscar. Это обстоятельство иллюстрирует приведенный ниже рисунок.