Spec-Zone .ru
спецификации, руководства, описания, API
|
Как только Вы создали объект, Вы, вероятно, хотите использовать его для чего-то. Вы, возможно, должны использовать значение одного из его полей, изменить одно из его полей, или вызвать один из его методов, чтобы выполнить действие.
К объектным полям получает доступ их имя. Следует использовать имя, которое однозначно.
Можно использовать простое имя для поля в пределах его собственного class. Например, мы можем добавить оператор в пределах Rectangle
class, который печатает width
и height
:
System.out.println("Width and height are: " + width + ", " + height);
В этом случае, width
и height
простые имена.
Код, который является вне class объекта, должен использовать ссылку на объект или выражение, сопровождаемое точечным (.) оператором, сопровождаемым простым именем поля, как в:
objectReference.fieldName
Например, кодом в CreateObjectDemo class является вне кода для Rectangle class. Так обратиться к origin, width, и полям height в пределах объекта Rectangle, названного rectOne, CreateObjectDemo, class должен использовать имена rectOne.origin, rectOne.width, и rectOne.height, соответственно. Программа использует два из этих имен, чтобы вывести на экран width и height rectOne:
System.out.println("Width of rectOne: " + rectOne.width); System.out.println("Height of rectOne: " + rectOne.height);
Пытаясь использовать простые имена width и height от кода в CreateObjectDemo, class не имеет смысла — те поля существуют только в пределах объекта — и результаты в ошибке компилятора.
Позже, программа использует подобный код, чтобы вывести на экран информацию о rectTwo. У объектов того же самого типа есть своя собственная копия тех же самых полей экземпляра. Таким образом у каждого объекта Rectangle есть поля под названием origin, width, и height. Когда Вы получаете доступ к полю экземпляра через ссылку на объект, Вы ссылаетесь на поле того определенного объекта. У двух объектов rectOne и rectTwo в программе CreateObjectDemo есть различный origin, width, и поля height.
Чтобы получить доступ к полю, можно использовать именованную ссылку на объект, как в предыдущих примерах, или можно использовать любое выражение, которое возвращает ссылку на объект. Вспомните, что оператор new возвращает ссылку на объект. Таким образом, Вы могли использовать значение, возвращенное из нового, чтобы получить доступ к полям нового объекта:
int height = new Rectangle().height;
Этот оператор создает новый объект Rectangle и сразу получает его height. В основном оператор вычисляет значение по умолчанию height Rectangle. Отметьте, что после того, как этот оператор был выполнен, у программы больше нет ссылки на создаваемый Rectangle, потому что программа, никогда сохраненная ссылка нигде. На объект нессылаются, и его ресурсы свободны быть переработанными виртуальной машиной Java.
Вы также используете ссылку на объект, чтобы вызвать метод объекта. Вы добавляете простое имя метода к ссылке на объект с прошедшим точечным оператором (.). Кроме того, Вы обеспечиваете, в пределах включения круглых скобок, любых параметров методу. Если метод не требует никаких параметров, используйте пустые круглые скобки.
objectReference.methodName(argumentList);
или:
objectReference.methodName();
У Rectangle class есть два метода: getArea(), чтобы вычислить область прямоугольника и move(), чтобы изменить источник прямоугольника. Вот код CreateObjectDemo, который вызывает эти два метода:
System.out.println("Area of rectOne: " + rectOne.getArea()); ... rectTwo.move(40, 72);
Первый оператор вызывает rectOne getArea()
метод и дисплеи результаты. Вторая строка перемещает rectTwo, потому что метод move() присваивает новые значения origin.x объекта и origin.y.
Как с полями экземпляра, objectReference должен быть ссылкой на объект. Можно использовать имя переменной, но также можно использовать любое выражение, которое возвращает ссылку на объект. Оператор new возвращает ссылку на объект, таким образом, можно использовать значение, возвращенное из нового, чтобы вызвать методы нового объекта:
new Rectangle(100, 50).getArea()
new Rectangle(100, 50) выражения возвращает ссылку на объект, которая обращается к объекту Rectangle. Как показано можно использовать запись через точку, чтобы вызвать метод getArea() нового Rectangle, чтобы вычислить область нового прямоугольника.
Некоторые методы, такие как getArea(), возвращают значение. Для методов, которые возвращают значение, можно использовать вызов метода в выражениях. Можно присвоить возвращаемое значение переменной, использовать это, чтобы принять решения, или управлять циклом. Этот код присваивает значение, возвращенное getArea() к переменной areaOfRectangle
:
int areaOfRectangle = new Rectangle(100, 50).getArea();
Помните, вызывая метод на определенный объект то же самое как отправка сообщения к тому объекту. В этом случае объект, на который вызывается getArea(), является прямоугольником, возвращенным конструктором.
Некоторые объектно-ориентированные языки требуют, чтобы Вы отследили все объекты, которые Вы создаете и что Вы явно уничтожаете их, когда они больше не необходимы. Управление памятью явно утомительно и подвержено ошибкам. Платформа Java позволяет Вам создавать так много объектов, как Вы хотите (ограниченный, конечно, тем, что Ваша система может обработать), и Вы не должны волноваться об уничтожении их. Среда выполнения Java удаляет объекты, когда она решает, что они больше не используются. Этот процесс вызывают сборкой "мусора".
Объект имеет право на сборку "мусора", когда нет больше ссылок на тот объект. Ссылки, которые сохранены в переменной, обычно отбрасываются, когда переменная выходит из контекста. Или, можно явно отбросить ссылку на объект, устанавливая переменную в специальное значение null. Помните, что у программы могут быть многократные ссылки на тот же самый объект; все ссылки на объект должны быть отброшены прежде, чем объект имеет право на сборку "мусора".
У среды выполнения Java есть сборщик "мусора", который периодически освобождает память, используемую объектами, на которые больше не ссылаются. Сборщик "мусора" делает свое задание автоматически, когда он решает что настало время.