Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Вложенные классы (Inner)
Можно создавать классы внутри других классов – вложенные классы. Они могут работать со всеми членами внешнего класса. Пример 1. В класс Outer помещено два класса Inner1, Inner2
public class Outer { int y; Outer (int x) {// конструктор y=x; }
class Inner1 {… public int f1() {return y++; } } //внутренний класс
int g (String s) { // метод class Inner 2 {…}// локальный внутренний класс } } Компилятор сделает файлы: Outer.class Outer$Inner1.class Outer$Inner2.class
Порождение объекта внутри класса Outer: Inner1 i1 = new Inner1 ();
Порождение снаружи: Outer t1 = new Outer (); Outer.Inner1 i2 = t1. new Inner1(); // t1 -объект класса Outer Пример 2. public class Parcel1{ void f() {} _________________________________________________________________________
class Contents { private int i =11; public int value () {return i; } public Parsel1 outer(){ return Parsel1.this; }//синтаксис!!! } //ссылка на внешний класс ___________________________________________________________________________
class Destination {//пакетный доступ, может быть и private-тогда снаружи //нельзя создать объект private String label;
Destination (String whereTo) {// конструктор label = where To; } String readLabel () {return label; } } ______________________________________________________________________________
public void ship (String dest) { Contents c = new Contents (); //создаем объекты внутренних //внутри внешних Destination d = new Destination (dest);
System.out.println (d.readLabel()); //используется метод //внутреннего класса. }
public Contents cont () {return new Contents (); }//создаем объект //внутреннего класса public static void main (String [] args) {
Parcel1 p = new Parcel1 (); p.ship (“Тасмания”);
Parcel1 q = new Parcel1(); Parcel1.Contents c = q.cont(); //имя внутреннего класса
Parcel1.Destination d = p.new Destination (“Танзания”); c.outer().f(); } }// Тасмания
Внутренний класс содержит скрытую ссылку на внешний. Объект внутреннего класса можно создать только в сочетании с объектом внешнего.
Внутренний класс получает доступ к членам внешнего класса.
interface Selector { //для перебора элементов массива (итератор) boolean end(); // достигнут ли конец последовательности? Object current(); // обратиться к текущему объекту void next(); // перейти к следующему объекту }
public class Sequence { //оболочка для массива Object с размером size private Object[] items; private int next = 0;
public Sequence(int size){ items = new Object[size]; }//конструктор
public void add(Оbject x) { // добавление новых объектов к массиву if (next < items.lenght) items[next++] = x; }
private class SequenceSelector implements Selector { //закрытый //класс, реализующий Selector private int i = 0; // поле внутреннего класса public boolean end() {return i == items. length; }//работаем с //закрытым полем внешнего класса public void next() { if(i < items. length) i++; } }
public Selector getSelector() {//вернем Selector!!!!! return new SequenceSelector(); }
public static void main(String[] args) { Sequence sequence = new Sequence(10); for (int i=0; i< 10; i++) Sequence.add(Integer.toString(i)); // создание //последовательности с заполнением String Selector selector = sequence.getSelector(); // получили ссылку на // Selector while (! selector.end()){//передвигаемся по последовательности System.out.print(selector.current() + “ ”); selector.next(); }// while }// main }//class //0 1 2 3 4 5 6 7 8 9
Внутренний класс может обращаться ко всем полям и методам внешнего. Зачем нужны внутренние классы ??? Обычно внутренний класс реализует интерфейс или наследует от какого – либо класса. А его код имеет доступ к членам внешнего класса. Почему не реализовать интерфейс внешним классом? 1) Проектирование. Внутренний класс не обязан реализовывать отношение is – a. (Sequence не является Selector). Кроме того, можно создать еще один внутренний класс Selector, для перебора, например, в обратном направлении (метод reverceSelector () его вернет). Это дает гибкость-несколько внутренних классов, реализующих один интерфейс. 2) Можно наследовать от нескольких классов: внешний класс от одного, внутренний – от другого (множественное наследование реализации). То есть наследование от многих не интерфейсов, а классов. 3) Можно создать несколько экземпляров внутреннего класса (Selector), которые будут работать одновременно.
|