Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Синтаксис композиции

Читайте также:
  1. I. О понятии композиции
  2. IV. Время как фактор и задача композиции. Изображение движения и время
  3. Базовые принципы композиции
  4. Виды композиции
  5. Виды композиции
  6. ВОДНЫЕ КОМПОЗИЦИИ В ПАРКОСТРОЕНИИ
  7. Динамичные раппортные композиции
  8. Задания к теме 4. Теория композиции.
  9. Закон подчиненности всех элементов и средств композиции единому замыслу
  10. Закономерности композиции

До сих пор, композиция достаточно часто использовалась, Вы просто помещали ссылку на объект внутрь нового класса. Для примера, представьте себе, что Вы хотите получить объект, который хранит различные объекты типа String, пару примитивных типов и объект другого класса. Для не примитивных объектов Вы помещаете ссылки внутри вашего класса, но примитивные типы Вы определяете напрямую:

//: c06:SprinklerSystem.java// Композиция для повторного использования кода. class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = new String("Constructed"); } public String toString() { return s; }} public class SprinklerSystem { private String valve1, valve2, valve3, valve4; WaterSource source; int i; float f; void print() { System.out.println("valve1 = " + valve1); System.out.println("valve2 = " + valve2); System.out.println("valve3 = " + valve3); System.out.println("valve4 = " + valve4); System.out.println("i = " + i); System.out.println("f = " + f); System.out.println("source = " + source); } public static void main(String[] args) { SprinklerSystem x = new SprinklerSystem(); x.print(); }} ///:~

Один из методов определенных в WaterSource особенный - toString(). Вы узнаете позже, что все не примитивные объекты имеют метод toString() и он вызывается в особых ситуациях, когда компилятор хочет получить String, но эти объекты не являются таковыми. Так в выражении:

System.out.println("source = " + source);

компилятор видит Вашу попытку добавить объект String (" source = ") к WaterSource. И при этом для компилятора нет никакой разницы, поскольку Вы можете только добавить строку (String) к другой строке (String), при этом он "скажет": "Я преобразую source в String вызвав метод toString()!" После выполнения этой операции компилятор объединит эти две строки и передаст результат в виде опять же строки в System.out.println(). В любое время, когда вы захотите получить доступ к такой линии поведения с классом, Вам нужно только написать в нем метод toString().

На первый взгляд, вы можете позволить Java принять на себя заботу об безопасности, потому, что компилятор автоматически создаст объекты для каждой ссылки, как в предыдущем коде. Например, вызов конструктора по умолчанию для WaterSource при инициализации source. Вывод печатаемых данных на самом же деле такой:

valve1 = nullvalve2 = nullvalve3 = nullvalve4 = nulli = 0f = 0.0source = null

Примитивные типы-поля класса автоматически инициализируются в нулевое значение, как и было описано в главе 2. Но ссылки на объекты инициализируются в null и если Вы попытаетесь вызвать любой из этих методов, то Вы получите исключение. В действительности достаточно хорошо (и удобно) то, что Вы можете распечатать их без обработки исключения.

Этот пример дает понять, что компилятор только просто создает объект по умолчанию для каждой ссылки, потому, что в противном случае система может в отдельных случаях подвергнуться перегрузке. Если же Вы желаете инициализировать полностью эти ссылки, Вы можете сделать это такими способами:

  1. В месте, где объект был определен. Это означает, что они будут всегда проинициализированы до того, как будет вызван конструктор.
  2. В конструкторе класса.
  3. Прямо перед тем моментом, как Вам действительно понадобится использовать этот объект. Этот способ часто называют " ленивой инициализацией ".

При этом может быть уменьшена перегрузка системы в ситуациях, когда объектам нет необходимости быть созданным все время работы программы.

Все три подхода представлены ниже:

//: c06:Bath.java// Инициализация конструктора с композицией. class Soap { private String s; Soap() { System.out.println("Soap()"); s = new String("Constructed"); } public String toString() { return s; }} public class Bath { private String // Инициализация в точке определения: s1 = new String("Happy"), s2 = "Happy", s3, s4; Soap castille; int i; float toy; Bath() { System.out.println("Inside Bath()"); s3 = new String("Joy"); i = 47; toy = 3.14f; castille = new Soap(); } void print() { // Отложенная (ленивая) инициализация: if(s4 == null) s4 = new String("Joy"); System.out.println("s1 = " + s1); System.out.println("s2 = " + s2); System.out.println("s3 = " + s3); System.out.println("s4 = " + s4); System.out.println("i = " + i); System.out.println("toy = " + toy); System.out.println("castille = " + castille); } public static void main(String[] args) { Bath b = new Bath(); b.print(); }} ///:~

Заметьте, что в конструкторе Bath оператор выполняется до того, как произойдет инициализация. Если вы не проинициализируете объект в точке определения, то нет никакой гарантии, что Вы выполните инициализацию до того, как вы пошлете сообщение объекту и неизбежно получите исключение.

Ниже приведен вывод программы:

Inside Bath()Soap()s1 = Happys2 = Happys3 = Joys4 = Joyi = 47toy = 3.14castille = Constructed

Когда вызывается print() он заполняется из s4 потому, что все поля были правильно инициализированы до того времени, когда они были использованы.




Дата добавления: 2015-09-11; просмотров: 28 | Поможем написать вашу работу | Нарушение авторских прав

Многомерные массивы | Упражнения | Скрытие реализации | Package: модуль библиотеки | Создание уникальных имен пакетов | Использование импорта для изменения поведения | Спецификаторы доступа в Java | Private: Вы не можете коснуться этого! | Интерфейс и реализация | Доступ класса |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав