Механизм построения нового класса из объектов существующих классов называется композицией (composition).
И мы это уже не раз делали, но просто не знали что это так называется :). Например в паттерне Builder мы внедрили объекты класса String (а String – это класс), как поля класса Contact. Точно так же мы могли бы использовать и объекты классов которые мы создали сами. Хотя по существу при композиции полями класса являются ссылки на объекты определенных классов. И мы можем использовать готовую функциональность этих классов. Например:
Вывод данной программы:
В этом примере видно что в наш класс MyClass мы включили два других класса как поля, а по существу как ссылки на объекты этих классов: String и MyString. Соответственно мы создали два поля ссылающихся на эти классы str и mystr, а затем в методе main() мы создали объект класса MyClass и использовали функциональность этих объектов, которые вывели нам результат.
Обратите внимание что в классе MyString мы переопределили метод класса Object toString(), что позволило нам вывести значение поля myStr, которое кстати тоже является ссылкой на объект.
Композиция позволяет повторно использовать существующий код или функциональность классов.
Но в случае композиции мы ни как не можем повлиять на эту функциональность используемых классов. Мы можем только использовать ее, но не изменить поведение, так как нам может быть нужно. Но есть и другой способ который гораздо интереснее когда новый класс создается как специализация уже существующего класса. Взяв существующий класс за основу, вы добавляете к нему свой код без изменения существующего класса. Этот механизм называется наследованием (inheritance). И далее мы переходим к изучению наследования в Java.
Spasibo.
ОтветитьУдалитьНепонятно, что вызывает метод "toString()"?
ОтветитьУдалитьВ данной программе этот метод не используется. Но вообще он просто возвращает значение переменной myStr.
УдалитьСтранно, потому что без этого метода вторая строка выводится как ссылка, а для вывода "MyString" требуется написать "println(mc.mystr.myStr)"
УдалитьИзвините да. Посмотрел не внимательно. Давно писал же :) Три года назад почти. Это переопределенный метод toString() базового класса Object.
УдалитьMike, toString неявно вызывается при вызове методов записи, грубо говоря, в данном случае, под капотом println() вызывается метод toString
УдалитьВидишь суслика? Нет? А он есть)))
УдалитьОб этом у меня кстати в статье и написано. Вы не внимательно прочитали.
ОтветитьУдалитьПрочитал, только не понял почему он вызывается, ведь в этом коде ничего его не вызывает, это происходит неявно?
ОтветитьУдалитьДа это происходит не явно. Каждый класс наследуется от класса Object. И естественно наследует все его методы. Я про это еще не писал статью. Это было в планах. Но сейчас нет времени пока.
УдалитьВот теперь прояснилось, спасибо, у вас замечательный блог)
УдалитьПожалуйста.
Удалить