Здравствуйте, баг, Вы писали:
баг>Впервые столкнулся с этим языком, возникли вопросы.
Если пришли со стороны C/C++, то главное уяснить одну вещь — в Java используются иногда подходы и решения, которые грамотному сишнику и в голову не придут. В частности, нормальным считается кратковременное выделение динамической памяти, множественные проверки всего и вся, многоуровневая косвенность, распространена рефлексия. Как ни странно, это не слишком сказывается на производительности.
баг>1. Привычное множественное наследование: есть класс-родитель, есть класс-дитё, есть третий класс с неким функционалом, который хочется использовать, но нельзя.
баг>Какие шаблоны для выхода из ситуации? Третий класс в виде члена дитя, статические методы в персом? Что ещё?
Множественное наследование и в C++, имхо, было ошибкой. Как уже правильно сказали, правильный ответ — агрегация.
баг>2. Множественные результаты функции. В других языках есть передача по ссылке, в Яве вроде как нету этого. Как прикажете возвращать? Заворачивать в новый класс и возвращать его? Или есть может что-то обобшённое вида туплов (tuple)?
Да, с этим плохо. Но и в C++ не очень хорошо без множественного присваивания и автораспаковки pair/tuple. Да, оборачивают в новый класс. Или модифицируют изменяемый параметр (массив, коллекцию).
баг>3. Сериализация. В С++ просто: объявил структуру и привёл к ней любой участок памяти. В Яве? Собственный DataInputStream и ObjectInputStream? Или как ещё парсят сетевые бинарные протоколы?
Вот в C++ это плохой, ужасный способ. Проблемы с переносимостью — разные размеры, эндинг, представление, выравнивание. Которые могут изменяться даже в одном компиляторе при разных опциях. Проблема с безопасностью — сериализируются и дыры в структуре. Надёжный и безопасный способ — явная упаковка/распаковка в байты, в Java для этого используется DataInputStream или вручную.
баг>4. Коллбэки. В C++ функторы и указатели на функции, в C# делегаты, а здесь что?
Анонимные классы, реализующие интерфейс (аналог функторов C++, но удобнее). Это более универсальный способ, хотя и более громоздкий, по сравнению с указателем на функцию. Выше я упомянул EventHandler, но вам это не надо.
баг>5. Беззнаковые типы
Их нет. Частично это компенсируется беззнаковым сдвигом, BigInteger, BitSet.