Отправка email из программы java по протоколу SMTP

SMTP (Simple Mail Transfer Protocol) является протоколом передачи электронной почты по сетям tcp/ip. Он включает в себя набор несложных правил, с помощью которых происходит процесс общения почтовых клиента и сервера. Клиент подключается к почтовому серверу по 25 порту, далее происходит примерно такой диалог:

Server: (ожидает соединения)
Client: (Подключается к порту 25 сервера)
Server:220 mail.company.tld ESMTP CommuniGate Pro 5.1.4i is glad to see you! Читать далее Отправка email из программы java по протоколу SMTP

Можно ли наследовать внутренние классы?

Да. Внутренние классы можно расширять. В плане наследования классов и реализации интерфейсов у них нет проблем.

 

Можно ли наследовать анонимные внутренние классы?

Описывая анонимный класс мы уже наследуемся от какого-то класса или реализуем какой-либо интерфейс. К анонимным классам напрямую нельзя применить слова extends или implements, но ведь никто не мешает заранее подготовиться и расширить нужный интерфейс, который будем реализовывать с помощью анонимного класса. Пример в коде ниже.

 

Можно ли переопределять внутренние классы?

В начале нужно четко понять что же мы хотим сделать. Логика следующая:[
1)Есть некий класс A;
2)Есть некий класс B, внутренний для класса A;
3)Мы хотим создать класс C, наследующийся от класса А и ещё раз описать в классе С класс В.

 

Из примера видно что повторное описание внутреннего класса — это не более чем работа с пространством имён. Итог — внутренний класс, подобно методам, переопределить нельзя.

Какие ограничения есть у локальных классов?

Вначале вспомним что такое локальный класс. Это класс, описанный в блоке кода, то есть, по-простому — между кавычек {}. Наиболее часто эти кавычки являются телом метода. Но могут они быть и просто блоком, статическим блоком, телом if-ов, циклов и т.д.
Локальный класс наделён особенностями внутренних классов, но имеет отличительные черты, а именно:
1)он имеет доступ только к финальным полям и аргументам обрамляющего метода, а также ко всем полям обрамляющего класса, в том числе приватным и статическим;
2)локальный класс виден и может создаваться только в блоке, в котором описан;

3)у локального класса не ставиться модификатор доступа;
4)не может иметь статических полей, методов, классов (за исключением финальных);
5)локальный класс, объявленный в статическом блоке может обращаться только к статическим полям внешнего класса.

 

Но! Начиная с Java8 мы можем обращаться в локальных классах к не финальным локальным переменным, если они не были изменены до момента инициализации класса. Также теперь стало возможным обращение к не финальным параметрам метода.

 

Может ли анонимный внутренний класс содержать статические методы?

Нет. У Анонимных внутренних классов, как и у внутренних классов не может быть статических полей, методов. Это вам подтвердит IDE, если вы попытаетесь запустить в ней код ниже.

 

Можно ли создать объект внутреннего класса, если у внешнего класса только private конструктор?

Имея подобный код

Напрямую, в другом классе (вне обрамляющего), конечно, создать объект InnerClass следующим способом не получится:

Но! Что если у нас есть метод, возвращающий экземпляр PrivateConst:

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

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

 

Во что компилируются анонимные внутренние классы?​

Анонимные внутренние классы компилируются в файлы внешнийКласс$n.class. На месте внешнего класса, соответственно, название обрамляющего класса, внутри которого описывается анонимный внутренний класс. На месте n число от 1 до количества анонимных классов. Всё станет понятно когда Вы скомпилируете код и проследите за компиляцией файлов в директории проекта. ​

 

Чем отличаются анонимные классы созданные на основе интерфейса и на основе класса? Можно ли создать анонимный статический вложенный класс?​

Каких то преимуществ в выборе способа создания анонимного класса при реализации интерфейса или же наследовании от другого класса мы не получаем. Отталкиваться следует от начальной задачи. Если при обычной реализации интерфейса нам доступно неограниченное количество, которое мы можем объявить в списке имплементируемых, то при создании анонимного класса данное преимущество утрачивается, так как нам становится доступен лишь один интерфейс. Конечно можно где-то в другом месте унаследовать нужный нам интерфейс от множества других и в итоге создать на его основе анонимный класс… но это же можно сделать и с наследованием классов. Так что отличия анонимного класса созданного на основе интерфейса от созданного на основе класса такие же как и у обычных классов… методы реализуются/перегружаются и т.п.
Анонимный класс является статическим(не статическим) в зависимости от того находится ли он в статическом (не статическом) блоке кода или нет.

Можно ли создавать статические методы/переменные во внутреннем классе?​ Назовите три любых внутренних класса? Как внутренние классы решают проблему множественного наследования в java?​

Статические методы/переменные объявлять во внутреннем классе (не вложенном) нельзя. Внутренние классы можно встретить во всей библиотеке java core, private static class Holder —вложенный класс HashMap из java.util, в интерфейсе Map есть interface Entry<K,V>, который опять же в HashMap и реализуется в другом вложенном классе static class Entry<K,V> implements Map.Entry<K,V>. Открываем исходники обёрток и в Integer натыкаемся на private static class IntegerCache. И так далее… Ещё одним плюсом внутренних классов — является частичное решение проблемы множественного наследования, которое запрещено в java. Если классу А необходимо использовать protected методы класса B и C, то можно от класса В унаследоваться, а внутри себя объявить класс D, который будет наследником С. Таким образом у класса А появится доступ к желаемым методам в обход удовлетворения связи «является».