Вы достигли нового уровня

Уровень 6

Путь программиста

Моя знакомая частенько задавалась вопросом, почему программисты постоянно ходят такие счастливые. Ответ, к которому она пришла, был простым и обескураживающим: потому что они работают на любимой работе и у них дофига денег.

Добро пожаловать в мир программистов.

Зарплата программиста

Хочу рассказать о зарплатах программистов. Как собственно обстоят дела с зарплатой, куда лучше идти работать, а куда - нет. Если вы не программист и попытаетесь самостоятельно разобраться в этой теме, то можете получить набор очень противоречивых данных.

Все дело в том, что главным фактором, влияющим на зарплату программиста, является не его квалификация, а место работы. Иногда, при одинаковой квалификации, разница между хорошим и плохим местом может достигать 2-10 раз(!)

В каждый конкретный момент времени ваша квалификация постоянна. Вы не можете за месяц стать опытнее в два раза и получать в два раза больше. А вот сменить за месяц работу и получать в два раза больше – очень даже можете. Однажды, в течении двух месяцев моя зарплата выросла в три раза(!) - незабываемое впечатление. Давайте же выясним, где лучше всего работать.

Вот три фактора, которые очень сильно влияют на уровень зарплат в компаниях:

1) Является ли разработка ПО основным бизнесом компании.

2) Ориентирована ли компания на международный рынок или на внутренний.

3) Собственником фирмы является западная компания или отечественная.

Обратите внимание, что город, в котором вы живете не играет решающей роли. Т.е. если вы получаете в 10 раз меньше, живя в Дрездене, чем ваш знакомый в Нью-Йорке, значит, в дело вступили перечисленные выше факторы.

Конкретные цифры

Сложно привести какие-то конкретные цифры для всего мира. Я дам описание ситуации для Восточной Европы, которая в целом справедлива для всех стран, где более-менее развит IT-outsource/outstaff.

Ниже приведен расклад зарплат программистов для Киева – это крупный центр ИТ-аутсорса Восточной Европы. В СПб зарплаты на 10% выше, в Москве где-то на 20%. Не встречал в Восточной Европе ни одного города-миллионника, где бы зарплаты были на 30% меньше чем в Киеве. Так как вы все из разных городов, предлагаю увеличивать приведённые мною цифры, в соответствии с указанной шкалой:

Москва+20%
Санкт-Петербург+10%
Киев (3 миллиона)
Город с населением миллион и больше-20%
Город с населением меньше миллиона-30%

Вот сколько может зарабатывать Java Senior Developer с пятью годами опыта работы, в зависимости от уровня компании в которой работает:

УровеньЗарплата в месяц Описание
1 $200 - $500 На самом низу находятся фирмы, где ИТ – это непрофильное направление бизнеса компании, заказчик - внутренний рынок, а собственник - государство. Например, ИТ отдел в налоговой или другой государственной организации.
2 $500 - $1500 Ниже среднего находятся ИТ отделы различных не государственных структур: банков и т.д.
3 $1,000 - $2,500 Средний уровень – это фирмы, которые занимаются разработкой ПО
4 $3,000 - $4,000 Выше среднего – это фирмы, которые занимаются разработкой ПО, и заказчики у них с запада
5 $4,000 - $5,000 На самом верху – фирмы, занимающиеся разработкой ПО, заказчики у них с запада, и собственник тоже. Их мало. Открытые вакансии имеют не часто, и попасть туда не просто. Но они есть.

Что самое странное в сложившийся ситуации?

Половина всех программистов работает в фирмах уровня 1 и 2.

Хотите узнать, в чем подвох?

Есть сотни открытых вакансий программистов в фирмах уровня 3 и 4. Эти компании готовы предложить более высокие зарплаты и, обычно, гораздо лучшие условия труда.

Я знаю двух Java Junior'ов, один из которых пошел работать на $100 в месяц (в фирму уровня 1), а второй на $1,000 в месяц (уровень 4). Зачем получать меньше?

Спрос на программистов превышает предложение – не идите работать туда, где мало платят!

Вывод 1: Средние зарплаты Java-программистов в Киеве - около $1,200 в месяц

Вывод 2: Ваша средняя зарплата, через 5 лет, если вы не пойдёте работать в фирмы уровней 1 и 2, а пойдете работать в фирмы уровня 3 и 4, будет выше $3,000 в месяц.

Чего можно добиться, если не тупить

Если вы будете постоянно заниматься саморазвитием в области программирования, то ваша зарплата, начиная с сегодняшнего дня, может выглядеть примерно так.

План

0-3 месяца (Ученик)

Вы знаете о программировании очень мало. Может учили в школе и/или университете, но очень поверхностно.

Ваша задача – учиться программированию и изучать Java.

Ваша цель – устроится на работу Java Junior’ом в компанию не ниже 3-го уровня.

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

3-15 месяцев (Java Junior Developer)

Вы уже работаете программистом, и ваш опыт растёт с каждым днём. Не прохлаждайтесь. Вам ещё многое предстоит сделать, чтобы можно было почивать на лаврах.

Ваша задача – изучать технологии, которые понадобятся вам, как Middle разработчику. Какие именно технологии? Мир меняется. Я сейчас насоветую, а жизнь все поменяет. Найдите в интернете несколько вакансий и посмотрите, что для них требуется. Обязательно прочитайте книгу Брюса Эккеля «Философия Java».

Ваша цель в первый год работы Java Junior’ом – это дорасти до уровня Java Middle. Никто не говорит что это очень легко, но вполне возможно для целеустремлённого человека. Это сразу даст скачок ЗП до полутора тысяч.

2-й год работы программистом (Java Middle Developer, level 1)

Вы хорошо потрудились в прошлый год, и теперь вы - Java Middle Developer. С зарплатой в полторы тысячи можно нормально жить. На работе вам дают серьёзные задания, и ваш опыт растёт как на дрожжах. Вы дорастёте до Java Senior Developer за два-три года. Нет смысла ускорять этот процесс. Сильного роста в зарплате вы все равно не получите.

Ваша задача – изучите паттерны проектирования, прочитайте «Совершенный код» МакКоннела. Улучшайте качество своего кода и свои навыки работы в команде. Можно взять за правило каждую неделю читать одну книгу по ИТ-тематике. Тогда через 4 года, вы будете на 50 книг умнее всех остальных. Не стоит откладывать это на потом: свободного времени у вас больше не станет, к тому же, вероятно, у вас появится семья, или пополнится, если уже есть.

Ваша цель – выбрать несколько технологий, в которых вы будете специализироваться как Senior разработчик. Всего вам все равно не изучить. А быть гуру в небольшой области – это хорошее решение.

3-й год работы программистом (Java Middle Developer, level 2)

Вы уже опытный Middle разработчик и начинаете подумывать – стать Senior Developer. Это приятно и престижно. Ваша зарплата превышает 2 тысячи долларов (данные для Киева). С этого момента спрос на таких профессионалов как вы, превышает предложение. Вы всегда сможете устроиться на работу за пару дней, и вряд ли будете получать меньше, чем сейчас. Если, конечно, не выкинете какую-нибудь глупость.

Ваша задача – продолжить изучение выбранных технологий. Работайте лучше. Не ради работодателя, ради вас самих. Проситесь в проекты с перспективными технологиями (такими как Big Data, на момент написания этой статьи). Вы все равно будете проводить в офисе 8 часов в день, так почему бы не получить за это немного больше денег и, что гораздо важнее, ценнейший опыт, который вам ещё понадобится.

Ваша цель – сменить работу. Хороший коллектив есть везде. Вы столкнётесь с новыми проектами и технологиями. Не стоит раньше времени прирастать к стулу. Если вы все ещё работаете в компании третьего уровня, подумайте над переходом на четвёртый уровень. Пятый уровень, хоть и очень привлекательный, пока недостижим.

4-й год работы программистом (Java Senior Developer, level 1)

Вы стали Senior разработчиком. Поздравляю. Возможно, стали им незаслуженно, и вы это чувствуйте. Все равно поздравляю. Не важно, достойны ли вы сейчас вашей должности, главное чтобы вы стали достойны её в будущем. Согласитесь, лучше сначала получить хорошую работу, а через год дорасти до неё, чем дорасти до хорошей позиции и ждать её ещё год.

Надеюсь, вы не забыли мой совет и читали по одной книге в неделю - теперь вашим возможностям позавидует любой студент. Вернее он готов молиться на них. Подумайте, у вас серьёзная зарплата, приближающаяся к трём тысячам долларов. Скорее всего, вы ещё молоды. Весь мир у вас под ногами.

Ваша задача – ещё раз просмотреть выбранные вами технологии. Возможно, вам нужно сменить специализацию. Мир изменился, технологии изменились, да и знаний у вас за два последних года прибавилось. То, на чем вы сейчас остановитесь – станет вашим выбором на несколько ближайших лет. Самое время выбирать любимые технологии.

Ваша цель - выбрать направление, в котором вы могли бы развиваться дальше. Их очень много, всех вариантов никто не перечислит, но выбор нужно сделать прямо сейчас. Если сегодня вы немного измените своё настоящее, это приведёт к большим изменениям в вашем будущем.

5-й год работы программистом (Java Senior Developer, level 2)

Вы определились с вашим будущим и работаете над воплощением вашей мечты. Правильно выбранное направление в совокупности с желанием идти вперёд и результат не заставил себя ждать. Поздравляю. Я рад, что ещё одним счастливым человеком стало больше.

Есть одна мудрая истина. Люди часто переоцениваю чего можно добиться за один год, и недооценивают, чего можно добиться за пять лет. Оглянитесь на пять лет назад. Так оно и есть.

Ваша задача – не принимать глупых решений и не идти на поводу у лени.

Ваша цель – выбрать направление и двигаться дальше. А вы думали это конец? Вспомните свой выпускной класс. Это не конец, это только начало.

Будущая специализация

Вы можете развиваться как технический специалист (верхняя ветка), как управленец (нижняя ветка) или как наемный профессионал/независимый консультант (средняя ветка). Все зависти от ваших предпочтений.

Карьера программиста

Профессия программист отличается от других профессий. Здесь нет необходимости делать карьеру менеджера, чтобы хорошо зарабатывать. Нередки ситуации, когда старший программист получает больше, чем его начальник-менеджер. Чем больше вы набираете опыта, тем сильнее ваши отношения с начальством движутся от точки «начальник-рабочий» к отношениям вида «кинозвезда и её менеджер». Зажравшиеся знающие себе цену программисты перебирают и проектами и вакансиями. Порадуемся за своих.

Что же нужно, чтобы стать таким высококлассным и востребованном в мировом масштабе программистом? Вы должны иметь большой опыт в самых новых и востребованных технологиях. Как этого достичь? Ответ ниже.

После того, как вы первый раз устроились работать программистом, с вами начинают происходить две вещи, которые, как ни странно, не всегда бросаются в глаза.

1 Вы начинаете быстро набирать опыт работы в реальных проектах. Один год опыта работы программистом может дать вам больше знаний и навыков в вашей специальности, чем 5 лет университета. Опыт – это настолько значимый показатель, что в IT-вакансиях зачастую пишут «требуется Java-программист с тремя годами опыта работы».

2 Вы по 8 часов в день изучаете новые технологии, а вам за это ещё и щедро платят. Значимость этого фактора трудно переоценить. В некоторых случаях полученные навыки настолько ценны, что ради их получения можно работать бесплатно, а то и доплачивать. Если вы грамотно выбираете проекты, на которых соглашаетесь работать, то вас ждёт головокружительная карьера программиста.

Вот только, что же выбрать?

Зачастую, если вы не знаете, какие технологии будут вам полезны, вы начинаете выбирать технологии по принципу «нравится, не нравится» или «модно, не модно». Тут уж как повезёт. Так что, лучше знать заранее, куда вы хотите попасть.

Путей развития программиста очень много, поэтому я, для простоты, выделю несколько из них, и напишу своё видение полученной ситуации. Не стоит воспринимать эту схему как жёсткую позицию, скорее как упрощённый взгляд на вещи, с целью внести хоть какую-то ясность.

Двухсотлетний программист

Если больше всего вам нравится программировать, то ваш путь: Senior Developer, затем Tech Lead Developer и архитектор. Также вы можете просто работать программистом лет 50. Зачастую зарплаты старших программистов и техлидов превышают зарплаты их менеджеров. Не прогадайте.

Менеджер. Тебе повезло, ты не такой как все.

Вы перешли на сторону врага. Шучу. Если у вас открылись недюжие организаторские способности, то ваш путь: Team Lead, а затем Project Manager. Это даст вам шанс стать директором и поможет при открытии своего дела. Вы ведь этого хотите, не так ведь?

Украсть трактор.

Если вы успели завести семью и детей, то возможно вы хотите тихой и безбедной жизни в стране со стабильной экономикой. Задумываетесь над переездом/иммиграцией в Канаду, США, Швейцарию или даже Австралию. У вас есть отличные навыки и востребованная профессия. Вам не придётся начинать с мойщика посуды. А, например, с Java Senor Developer. Да ещё и, вероятно, на большую зарплату. Не так уж и плохо.

Посмотреть весь мир, кроме Парижа и не умирать.

У вас ещё нет семьи, и вы хотите попутешествовать. oDesk – ваше все. Найдите себе заказчика, обговорите с ним рейты – от $20/час, берите ноутбук и вперёд. Вашей зарплаты должно хватить, чтобы нормально жить в любой стране мира. Почему бы не приступить к исполнению своей мечты прямо сейчас?

Я не хочу ничего программировать, я – девочка.

Если вы – девочка, то можете уйти в декрет. Звучит как сексисткая шутка, каковой и является. Впрочем, тут есть большая доля здравого смысла. Скорее всего, при уходе в декрет вы сможете получить кучу декретных денег (в странах с высокой социальной защитой). Есть компании, которые не платят ничего, есть и другие, которые платят очень хорошо. Одна моя ученица, уходя в декрет получила треть годовой зарплаты. И это весной 2009 года. В разгар массовых увольнений. А годика через полтора вы можете вернуться обратно, как минимум Middle разработчиком.



Глупые тратят все заработанные деньги. Умные - откладывают. А будущие программисты вкладывают в себя и свое профессиональное образование. IT-шников ждет отличное будущее!

1. Видимость объектов и ссылка null.

- Привет, Амиго!

- Привет, Элли! Что интересного расскажешь сегодня?

- Сегодня я расскажу тебе про время жизни объекта. Каждый объект после создания существует (живёт) пока хотя бы одна переменная хранит его адрес (на него есть хотя бы одна ссылка). Если ссылок больше не остаётся – объект умирает. Примеры:

- Объект «кот Томми» существует всего одну строчку с момента создания. Уже на следующей строке единственную переменную, которая хранит на него ссылку, «обнуляют» и объект уничтожается Java-машиной.

- Объект «кот Семми» после создания хранится в переменной cat1. Или, если быть точным, там хранится ссылка на него. Парой строчек ниже эта ссылка копируется в cat2. После этого в cat1 сохраняется ссылка на другой объект, и ссылка на «кот Семми» остаётся только в cat2. Наконец, в последней строке метода main, последнюю ссылку на объект обнуляют.

- Объект «кот Мейси» существует сразу после создания всего одну строчку. На следующей строке переменной cat2 присваивают другое значение, и ссылка на «кот Мейси» теряется. Объект становится недостижимым и считается мусором (объект умер).

- Объект «кот Джинджер» существует сразу после создания и до конца метода. Вместе с окончанием метода будет уничтожена переменная cat2, и следом за ней и объект «кот Джинджер».

- Ясно.

- Но если создать объект Cat в каком-нибудь методе и сохранить ссылку на него в переменную класса, то объект Cat будет существовать все время, пока существует ссылка на него из другого живого объекта.

- Обычно объект уничтожается не сразу. Java-машина время от времени запускает уборку мусора – уничтожение неиспользуемых объектов. Об этом ниже.

- Если мы хотим, чтобы какая-то переменная перестала хранить ссылку на объект – можно присвоить ей значение null или же ссылку на другой объект.

2. Уборка мусора

- Привет, Амиго! Вот тебе полезная ссылочка, про «уборку мусора» в Java. Это, конечно, не мои превосходные лекции, но тоже ничего:

Основы "уборки мусора"

3. Знакомство с методом finalize

- И снова привет! Сегодня будет кратенькое знакомство с методом finalize(). Этот метод вызывается Java-машиной у объекта перед тем, как объект будет уничтожен. Фактически этот метод – противоположность конструктору. В нем можно освобождать ресурсы, используемые объектом.

- Этот метод есть у класса Object и, следовательно, есть в каждом классе (все классы в Java считаются унаследованными от класса Object и содержат копию его методов). Ты можешь просто написать в твоём классе такой же метод, и он будет вызываться перед уничтожением объектов этого класса. Пример:

Пример:
class Cat
{
    String name;

    Cat(String name)
    {
        this.name = name;
    }

    protected void finalize() throws Throwable
    {
        System.out.println(name + " destroyed");
    }
}

- Понятно.

- Но! Java-машина сама решает – вызвать данный метод или нет. Чаще всего объекты, созданные в методе и объявленные мусором после его завершения, уничтожаются сразу же и без всяких вызовов метода finalize(). Этот метод скорее дополнительная страховка, чем надёжное решение. Лучшим вариантом будет освобождать любые используемые ресурсы (обнулять сохраненные ссылки на другие объекты), когда наш объект ещё жив. О пользе этого метода и нюансах его работы я расскажу тебе уровней через 10, или 20. А пока что ты должен знать две вещи: такой метод существует, и (сюрприз!) не всегда вызывается.

4. Время жизни объекта

- Ещё хочу рассказать пару интересных вещей про время жизни объектов. В Java случайно потерять объект очень сложно – если у тебя есть ссылка на него, значит, объект гарантированно жив.

- Ссылки на объекты нельзя поменять. Нельзя увеличить или уменьшить. Также нельзя создать ссылку на объект – ее можно только присвоить. Или обнулить. Все.

- Ясно. Т.е. если я обнулю (сотру) все ссылки на объект, то я никогда не смогу получить на него ссылку и обращаться к нему?

- Да. Но часто наблюдается обратная ситуация – слишком много неиспользуемых живых объектов. Часто программисты создают объекты десятками и хранят их в различных списках для обработки, но никогда эти списки не чистят.

- Чаще всего ненужные объекты помечаются программистами, как неиспользуемые и все. А удалением их из списков никто не занимается. Так что для больших Java-программ характерно раздувание – все больше и больше неиспользуемых объектов остаются жить в памяти.

-Ты столкнёшься с этим ещё не скоро. Но я буду каждый раз обращать твоё внимание, на неиспользуемые больше объекты и правильный способ их утилизации.

- Ок. спасибо. Ты прояснила мне пару моментов насчет ссылок.

5. Задачи на время жизни объекта

- Привет, Амиго! Вот тебе пара задачек:

Задачи
1. Метод finalize класса Cat

В классе Cat создать метод protected void finalize() throws Throwable
2. Классы Cat и Dog и метод finalize для каждого

В каждом классе Cat и Dog написать метод finalize, который выводит на экран текст о том, что такой-то объект уничтожен.
3. По 50 000 объектов Cat и Dog

Создать в цикле по 50 000 объектов Cat и Dog. (Java-машина должна начать уничтожать неиспользуемые, и метод finalize хоть раз да вызовется).
4. Счётчик котов

В конструкторе класса Cat [public Cat()] увеличивать счётчик котов (статическую переменную catCount этого же класса) на 1. В методе finalize уменьшать на 1.

6. Статические классы и методы

- Новая интересная тема. Хочу рассказать тебе о статических переменных и методах.

- О, я уже слышал про статические переменные. И про статические методы, кажется. Но хотелось бы больше подробностей.

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

Объявление класса
class Cat                        //класс
{
    String name;                 //переменная  

    Cat(String name)             //конструктор 
    {
        this.name = name;        //инициализация переменной 
    }
}
Код в методе main:
Cat cat1 = new Cat("Vaska"); //создали один объект, его name содержит строку «Vaska»
Cat cat2 = new Cat("Murka"); //создали один объект, его name содержит строку «Murka»
System.out.println(cat1.name);
System.out.println(cat2.name);
Вывод на экран будет таким:
Vaska
Murka

- Переменные cat1.name и cat2.name, хоть и описаны в одном классе – Cat, но хранят разные значения, т.к. привязаны к разным объектам.

- Это понятно.

- Статические же переменные – существуют в одном экземпляре, и обращаться к ним нужно по имени класса:

Объявление класса
class Cat                   //класс
{
    String name;            //обычная переменная
    static int catCount;    //статическая переменная

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   //увеличиваем значение статический переменной на 1
    }
}
Код в методе main:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Vaska");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Murka");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
Вывод на экран будет таким:
0
1
Vaska
Murka
2

- Это тоже понятно.

- Методы класса тоже делятся на две категории. Обычные методы вызываются у объекта и имеют доступ к данным этого объекта. Статические методы не имеют такого доступа – у них просто нет ссылки на объект, они способны обращаться либо к статическим переменным этого класса либо к другим статическим методам.

- Статические методы не могут обращаться к нестатическим методам или нестатическим переменным!

- А почему?

- Каждая обычная переменная класса находится внутри объекта. Обратиться к ней можно только имея ссылку на этот объект. В статический метод такая ссылка не передается.

- А в обычные методы передается?

- Да, в обычные методы передается, неявно. В каждый метод неявно передается ссылка на объект, у которого этот метод вызывают. Переменная, которая хранит эту ссылку, называется this. Таким образом, метод всегда может получить данные из своего объекта или вызвать другой нестатический метод этого же объекта.

- В статический метод вместо ссылки на объект передается null. Поэтому он не может обращаться к нестатическим переменным и методам – у него банально нет ссылки на объект, к которому они привязаны.

- Ясно.

- Так работают обычные нестатические методы:

Как выглядит кодЧто происходит на самом деле
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
При вызове метода в виде «объект» точка «имя метода», на самом деле вызывается метод класса, в который первым аргументом передаётся тот самый объект. Внутри метода он получает имя this. Именно с ним и его данными происходят все действия.

- А вот как работают статические методы:

Как выглядит кодЧто происходит на самом деле
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
При вызове статического метода, никакого объекта внутрь не передаётся. Т.е. this равен null, поэтому статический метод не имеет доступа к нестатическим переменным и методам (ему нечего неявно передать в обычные методы).

- Переменная или метод являются статическими, если перед ними стоит ключевое слово static.

- А зачем такие методы нужны, если они так сильно ограничены?

- У такого подхода тоже есть свои преимущества.

- Во-первых, для того, чтобы обратиться к статическим методам и переменным не надо передавать никакую ссылку на объект.

- Во-вторых, иногда бывает нужно, чтобы переменная была в единственном экземпляре. Как, например, переменная System.out (статическая переменная out класса System).

- И в третьих, иногда нужно вызвать метод, еще до того, как будет возможность создавать какие-то объекты

- Это когда же?

- А почему, по-твоему, метод main объявлен статическим? Чтобы его можно было вызвать сразу после загрузки класса в память. Еще до того, когда можно будет создавать какие-то объекты.

7. Статические классы и методы

- Кроме статических методов есть ещё и статические классы. Что это такое мы рассмотрим в будущем, я лишь покажу пример, что такое может быть:

Пример
public class StaticClassExample
{
    private static int catCount = 0;

    public static void main(String[] args) throws Exception
    {
        Cat vaska = new Cat("Bella");
        Cat murka = new Cat("Tiger");

        System.out.println("Cat count " + catCount);
    }
    
    public static class Cat
    {
        private String name;

        public Cat(String name)
        {
            this.name = name;
            StaticClassExample.catCount++;
        }
    }

}

- Объектов класса Cat можно создавать сколько угодно. В отличие от, например, статической переменной, которая существует в единственном экземпляре.

- Основной смысл модификатора static перед объявлением класса - это регулирование отношения класса Cat к классу StaticClassExample. Смысл примерно такой: класс Cat не привязан к объектам класса StaticClassExample, и не может обращаться к обычным (нестатическим) переменным класса StaticClassExample.

- Значит, я могу создавать классы внутри других классов?

- Да. Java такое позволяет. Не слишком задумывайся об этом сейчас. В будущем я объясню еще некоторые вещи, и все станет немного проще.

- Надеюсь.

8. Задачи на статические методы

- Привет, Амиго! Вот тебе несколько интересных задач на статические методы:

Задачи
1. Класс Cat и статическая переменная catCount
Создать статическую переменную int catCount в классе Cat. Создай конструктор [public Cat()], в котором увеличивай данную переменную на 1.
2. Статические методы: int getCatCount() и setCatCount(int)
Добавить к классу Cat два статических метода: int getCatCount() и setCatCount(int), с помощью которых можно получить/изменить количество котов (переменную catCount)
3. Класс Util
Реализовать статический метод double getDistance(x1, y1, x2, y2). Он должен вычислять расстояние между точками. Используй метод double Math.sqrt(double a), который вычисляет квадратный корень переданного параметра
4. Класс ConsoleReader
Сделать класс ConsoleReader, у которого будут 4 статических метода:
String readString() – читает с клавиатуры строку
int readInt() – читает с клавиатуры число
double readDouble() – читает с клавиатуры дробное число
boolean readBoolean() – читает с клавиатуры строку "true" или "false" и возвращает соответствующую логическую переменную true или false
Внимание: создавайте переменную для чтения данных с консоли (BufferedReader или Scanner) внутри каждого метода
5. Класс StringHelper
Cделать класс StringHelper, у которого будут 2 статических метода:
String multiply(String s, int count) – возвращает строку, повторенную count раз.
String multiply(String s) – возвращает строку, повторенную 5 раз.

Пример:
Амиго → АмигоАмигоАмигоАмигоАмиго

9. Лекция про уборку мусора, статику и время жизни объектов

- А вот и снова я. К сожалению, ссылок сегодня дать не могу. Эти великолепные лекции где-то затерялись. Боюсь, что сегодня тебе придётся обойтись своими силами. Но лучше больше слушай Элли или Ришу, они всегда могут научить тебя чему-нибудь.

Хотя… попробуй заглянуть сюда:

Жизненный цикл объекта

10. Хулио

- Привет, Амиго! Ты сегодня отлично поработал. Я просто не имею права заваливать тебя работой ещё. Давай уже, садись, начинается:

Оригинал видео на YouTube

11. Капитан Джон Бобров

- Здорово, боец!

- Здравия желаю, капитан Бобров!

- У меня для тебя шикарная новость. Вот тебе задания для закрепления полученных навыков. Выполняй их каждый день, и твои навыки будут расти с неимоверной скоростью. Они специально разработаны для выполнения их в Intellij IDEA.

Дополнительные задания для выполнения в Intellij Idea
1. Класс Cat и статическая переменная catCount

В классе Cat создай статическую переменную public int catCount. Создай конструктор [public Cat()]. Пусть при каждом создании кота (нового объекта Cat) статическая переменная catCount увеличивается на 1. Создать 10 объектов Cat и вывести значение переменной catCount на экран.
2. Статические коты

1. В классе Cat добавь public статическую переменную cats (ArrayList<Cat>).
2. Пусть при каждом создании кота (нового объекта Cat) в переменную cats добавляется этот новый кот. Создать 10 объектов Cat.
3. Метод printCats должен выводить всех котов на экран. Нужно использовать переменную cats.

Подсказка: Чтобы создать переменную cats, используйте конструкцию:
public static ArrayList<Cat> cats = new ArrayList<Cat>();
3. Переставь один модификатор static

Переставь один модификатор static, чтобы пример скомпилировался.
4. Минимальное количество static-ов

Расставьте минимальное количество static-ов, чтобы код начал работать, и программа успешно завершилась
5. Есть новые идеи? Подумаем...

1) В классе Solution создать public статический класс Idea
2) В классе Idea создать метод public String getDescription(), который будет возвращать любой непустой текст
3) В классе Solution создайте статический метод public void printIdea(Idea idea), который будет выводить на экран описание идеи - это то, что возвращает метод getDescription
6. KissMyShinyMetalAss

Создай класс с именем KissMyShinyMetalAss. Создай объект этого класса, выведи его на экран.
7. Три статические переменных name

Создай 3 public статических переменных: String Solution.name, String Cat.name, String Dog.name

- Те задания были для духов. Для дедушек я добавил бонусные задания повышенной сложности. Только для старослужащих.

Дополнительные задания для выполнения в Intellij Idea
1. Нужно исправить программу, чтобы компилировалась и работала.

Задача: Программа вводит два числа с клавиатуры и выводит их максимум в виде «Max is 25».
2. Нужно добавить в программу новую функциональность.

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

Пример ввода:
дедушка Вася
бабушка Мурка
папа Котофей
мама Василиса
сын Мурчик
дочь Пушинка

Пример вывода:
Cat name is дедушка Вася, no mother, no father
Cat name is бабушка Мурка, no mother, no father
Cat name is папа Котофей, no mother, father is дедушка Вася
Cat name is мама Василиса, mother is бабушка Мурка, no father
Cat name is сын Мурчик, mother is мама Василиса, father is папа Котофей
Cat name is дочь Пушинка, mother is мама Василиса, father is папа Котофей
3. Задача по алгоритмам.

Задача: Программа вводит с клавиатуры 5 чисел и выводит их в возрастающем порядке.

Пример ввода:
3
2
15
6
17
Пример вывода:
2
3
6
15
17