Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Скачать 1.76 Mb.
|
4.5 Назначение ссылочных переменных объектаРассмотрим, следующий фрагмент. Box b1 = new Box(); Box b2 = b1; После того, как этот фрагмент выполнится, обе переменных (b1и b2) будут ссылаться на один и тот же объект. Назначение b1 переменной b2 не распределяет никакой памяти и не копирует какую-либо часть первоначального объекта. Эта операция просто помещает в b2 ссылку из b1. Таким образом, любые изменения, сделанные в объекте через b2 затронут объект, на который ссылается b1, т.к. это один и тот же объект см. рис. 2. Рисунок 2. Две ссылки на один и тот же объект. Хотя b1 и b2, обе ссылаются на тот же самый объект, они не связаны каким-то другим способом. Например, следующее присваивание к b1 просто отключит b1 от исходного объекта без воздействия на объект или переменную b2: Box b1 = new Box(); Box b2 = b1; // ... b1 = null; Здесь b1 был установлен в null, но b2 все еще указывает на первоначальный объект. Замечание. Присваивание одной ссылочной переменной объекта к другой, не создает копии объекта, а делает только копию ссылки. 4.6 Представление методовКлассы состоят из двух видов компонентов – переменных экземпляра и методов. Общая форма метода такова: type name (parameter-list) { // тело метода } Здесь type определяет тип данных, возвращаемых методом. Это может быть любой допустимый тип, включая типы классов, которые вы создаете. Если метод не возвращает значения, его возвращаемый тип должен быть void. name определяет имя метода. Это может быть любой допустимый идентификатор, но отличающийся от тех, что уже используются другими элементами в пределах текущей области действия имен. Parameter-list – это последовательность пар тип-идентификатор, разделенных запятыми. Параметры – это переменные, которые принимают значения аргументов, посылаемых методу во время его вызова. Если метод не имеет параметров, то список его параметров пуст. Методы, у которых тип возвращаемого значения отличен от void, возвращают значение вызывающей подпрограмме, используя следующую форму оператора return: return value; Здесь value – возвращаемое значение, тип которого идентичен или совместим типом этого метода. 4.6.1 Добавление метода к классу BoxСоздавать класс, который содержит только данные, случается редко. Чаще используют методы для доступа к экземплярным переменным, которые определены в классе. Методы определяют интерфейс с большинством классов. Они позволяют разработчику класса скрывать специфическое размещение внутренних структур данных за более ясными абстракциями метода. Кроме методов, которые обеспечивают доступ к данным, можно также определять методы, использующиеся внутри самого класса. Так как объем блока зависит от его размера, то имеет смысл поручить это вычисление Box-классу. Добавим метод вычисления объема к Box-классу.: // Эта программа включает метод внутрь класса Box. class Box { double width; double height; double depth; // показать объем блока void volume() { System.out.print("Объем равен "); System.out.println(width * height * depth); } } class BoxDemo3 { public static void main(String args[]) { Box myboxl = new Box(); Box mybox2 = new Box(); // присвоить значения переменным экземпляра myboxl myboxl.width = 10; myboxl.height = 20; myboxl.depth = 15; /* присвоить другие значения переменным экземпляра mybox2 */ mybox2.width = 3; mybox2.height = 6; mybox2.depth = 9; // показать объем первого блока myboxl.volume(); // показать объем второго блока mybox2.volume(); } } Эта программа генерирует следующий вывод, который является таким же, как в предыдущей версии. Объем равен 3000.0 Объем равен 162.0 Рассмотрим подробнее две следующие строки программы: myboxl.volume(); mybox2.volume(); Первая строка включает метод volume() объекта mybox1. Точнее, она обращается к методу volume() объекта myboxl, используя имя объекта, за которым следует операция «точка». Таким образом, обращение к mybox2.volume() отображает объем блока, определенного переменной mybox1, а обращение к mybox2.volume() Отображает объем блока, определенного переменной mybox2. Когда выполняется mybox1.volume(), исполняющая система Java передает управление коду, определенному внутри метода volume(). После того как операторы внутри volume() выполнятся, управление возвращается в вызывающую подпрограмму, и работа продолжается со строки кода, следующей за вызовом. В самом общем смысле метод – это способ реализации подпрограмм в языке Java. Обратите внимание внутри метода volume(): переменные width, height и depth указаны прямо, без предшествующих им имен объектов и «точечных» операций. Когда метод использует переменную экземпляра, которая определена в его классе, он указывает ее прямо, без явной ссылки на объект и использования «точечной» операции. Метод всегда вызывается из некоторого объекта его класса. Раз этот вызов произошел, значит объект известен. Таким образом, внутри метода нет необходимости указывать объект второй раз. Это означает, что переменные width, height и depth внутри метода volume() неявно ссылаются на копии переменных, находящихся в объекте, который вызывает этот метод. Когда к переменной экземпляра обращается код, который не является частью класса, в котором данная переменная определена, это должно быть сделано через объект, при помощи «точечной» операции. Однако, когда к такой переменной обращается код, являющийся частью ее класса, на эту переменную можно ссылаться прямо (т. е. без квалификации ее имени именем объекта). Этот же принцип относится и к методам. |