hoxnap

hoxnap

пикабушник
4803 рейтинг 114 подписчиков 1211 комментариев 60 постов 2 в "горячем"
1 награда
5 лет на Пикабу
-2

Джава-13

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


Java позволяет создавать классы, экземпляры которых создавать нельзя. Такие классы называются абстрактными и обозначаются с помощью ключевого слова abstract. Служат они основой для создания новых классов. Проводя аналогию с готовкой на кухне можно сказать, что абстрактными классами являются соусы, супа, горячие блюда, салаты, гарниры. Так, например, аджика, наршараб, кепчунез являются подклассами соуса. Тогда класс соус может иметь поля: название, состав, соотношение ингредиентов и абстрактный метод «приготовление». Расширяя класс соус, и реализуя метод «приготовление» для конкретного соуса мы получаем реализуемый класс – класс, экземпляр которого можно создать.


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


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

Джава-13 Изучениеджава, Java, Длиннопост

Класс animal имеет конкретное поле name, конструктор, метод getName и абстрактный метод toString. При попытке создать экземпляр класса возникает ошибка. Однако можно создать переменную типа animal, которая будет ссылаться на один из наследуемых и не абстрактных классов.

Джава-13 Изучениеджава, Java, Длиннопост

Как вы видите создан класс Cat, наследуемый (extends) от класса Animal. В нём реализован метод toString, добавлено новое поле murchit, которое достаточно уникально для кошек.


Если мы откажемся от абстрактного класса toString в классе Animal, то не сможем вызвать метод обращением к переменной cat, т.к. в классе Animal такой метод не определён. И нам придется приводить переменную к типу Cat, чтобы иметь возможность использовать метод toString.


В качестве самого простого примера использования абстрактного можно привести элементы управления (кнопка, текстовое поле, надпись, флажок, выпадающий список и т.д.). Все они имеют общие (текст, положение, размер, активность, родитель и т.д.) и уникальные поля (для текстового поля – положение курсора, для флажка – установлен ли значок, для выпадающего списка – выбранный элемент). Используя цикл for each можно, например, получить значение поля «текст» из всех элементов управления на форме.

Показать полностью 1
-1

Джава-12

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


В прошлом посте упоминалось динамическое связывание (иногда называемое поздним), суть которого заключается в выборе метода по фактическому типу объекта. Так метод punish для kotuk объявленного как Cat, вызывался из подкласса CatMutant.


Добавим в класс Cat метод, возвращающий имя. Навряд ли при наследовании его придётся каким-либо образом менять. Но вдруг мы забудем, что такой метод существует в суперклассе, и случайно его переопределим (при этом забыв какую-нибудь ключевую деталь), чего нам очень не хочется? Для предотвращения данной ситуации можно использовать ключевое слово final, тогда можно быть уверенным, что метод getName будет работать одинаково в любом случае.


Методы и классы с ключевым словом final называются конечными.


Как стало понятно тоже можно сделать и с классом. Например, класс String является конечным, и, используя один из методов класса String, мы ссылаемся именно на символьную строку. В противном случае можно было бы наследовать класс String (пусть будет подкласс Chars), переопределить метод N, объявить переменную типа String, присвоить ей экземпляр класса Char и в будущем не понимать, почему метод N работает не так, как с другими объектами класса String (вспомните про динамическое связывание).


Теперь о приведение типов. Приведением типов называется процесс принудительного преобразования из одного типа в другой. Вот код, который написал джек:

Джава-12 Java, Изучениеджава, Программирование

В первых трех строках кода красным выделено имя переменной типа CatMutant, чёрным тип переменной. В первой строке мы присваиваем переменной типа Cat переменную типа CatMutant. Компилятор позволяет нам это сделать, однако запоминает фактический тип переменной. Мы какбы говорим компилятору, ты используй эту переменную, но не обращай внимания на его дополнительные возможности.

Однако, он не позволит присвоить эту переменную (cat_CatMutant), переменной типа CatMutant – компилятор не обращает внимание на доп. возможности. Поэтому при компиляции возникнет ошибка (во второй строке).


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


Теперь обратимся ко вторым трём строкам. Вторая строка аналогично абзацу выше. Но третья строка хоть и скомпилируется при выполнении программы выдаст ошибку. Компилятор ответит нам – ты меня обманываешь, нельзя переменную (с реальным типом Cat) привести к CatMutant.


На этом всё, спасибо за внимание.

Показать полностью
82

Бактерии в настойках и как с ними бороться.

Читая пост наткнулся на фразу:

крепость выше 30% должна подавить любую бактериальную активность

и задался вопросом, как концентрация спирта влияет на бактерии. К счастью я знаком с отзывчивым микробиологом, который ответил на мои вопросы. Дальнейший текст пойдёт в виде вопрос-ответ.


В: убивает ли спирт все бактерии?

О: нет, это зависит от бактерий, но большинство бактерий погибает.


В: как это зависит от концентрации?

О: Сильно, например, (тут название какой-то бактерии) 96 % не убивает, а 70 % убивает. На вскидку концентрация от 0 до 30 % практически не оказывает влияния (бактерии могут размножаться), 31-60 процентный спирт даёт бактериостатический эффект (размножение бактерий подавляется), 60 и более убивает микроорганизмы (бактерицидное действие). Однако, 40 % спирт (фабрика выпускает сорокоградусные настойки) медленно, но уменьшает количество бактерий.


В: То есть при средних концентрациях имеется бактерицидный эффект?

О: Да, но маленький.


От себя: выше рассказано о настойке полученной заливом сырья спиртом. Я так понял @obhodchik, хочет получить настойку естественным брожением. Первоначальное количество бактерий таким образом конечно же будет больше. Если есть возможность и мозги, то на вооружение можно взять следующий метод. Делается расчёт на итоговый спирт по таблице и по примеру. Первый залив делается крепким спиртом (70 %), затем делается перерасчёт на оставшуюся часть извлекателя, первый залив сливается в отдельную тару, сырьё заливается остатками. По окончании настаивания части смешиваются между собой.


Спасибо за внимание. Возможно в скором времени напишу немного о теории настоек.

Пикабу не даёт вставить ссылку на таблицу: гугл -> алкоголеметрические таблицы alcatab

-1

Джава-11

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


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


В классе CatMutant создайте private переменную целочисленного типа Eyes и public метод addEye, который увеличивает переменную Eyes на единицу.


Создайте в основном классе экземпляр класса CatMutant с именем komuk и массив типа Cat размерностью два. Первому элементу массива создайте и присвойте экземпляр класса Cat, а второму komuk. Как вы можете видеть, компилятор позволил присвоить переменной суперкласса (Cats[1]) переменную подкласса (komuk). Эта способность переменной называется полиморфизмом - любая объектная переменная может ссылаться на переменную подкласса.


Теперь попробуйте вызвать Cats[1].addEye, компилятор выдаст ошибку, т.к. тип переменной Cats[1] – Cat и такого метода в классе не существует. Однако если вы вызовете метод punish, то второй элемент может восстановить ногу. Дело в том, что вместе с массивом хранятся тип каждого из элементов и при вызове метода компилятор выполняет следующие действия:


* компилятор проверяет тип элемента и имя метода. Затем ищет все доступные методы под именем метода в классе элемента и во всех его суперклассах.


* затем компилятор разрешает перегрузку методов – по типу передаваемых параметров выбирает метод, которому эти параметры подходят.


* если метод является конструктором или имеет модификатор private, static или final, то компилятору точно известно как вызвать метод (статическое связывание), иначе метод выбирается исходя из типа элемента (динамическое/позднее связывание).


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


На примере Cats[1].getName. Во время вызова этого метода пытается найти метод getName в классе CatMutant, но не находя его обращается к суперклассу Cat. Откуда и выполняется метод.

Показать полностью

Готовы принять вызов и засветиться в рекламе? Тогда поехали!

Готовы принять вызов и засветиться в рекламе? Тогда поехали!

Признайтесь, вы хоть раз, но заходили на Авито. Возможно, продавали старые книги, детские вещи или старинные, но совсем ненужные вам вазы или статуэтки. Когда звезды сходятся, покупка или продажа выходит крайне удачной. Как у наших героев.


1. @MorGott

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


2. @Little.Bit

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


3. @MadTillDead

Собралась с силами и продала на Авито все, что напоминало ей о бывшем.


4. @Real20071

Его жена доказала, что в декрете тоже есть заработок. Причем на любимом деле и Авито.


Своим удачным опытом они поделились в коротких роликах. Теперь ваша очередь!

Снимите видео об успешном опыте продажи, покупки или обмена на Авито, отправьте его нам и получите шанс показать свой ролик всей стране. Представьте, вы можете попасть в рекламу Авито! А еще выиграть один из пяти смартфонов Honor 20 PRO или квадрокоптер. Ну что, готовы принять вызов? Смотрите правила, подробности и ролики для вдохновения тут.

Отличная работа, все прочитано!