64. Сравнение Java и С# Объектность Оба языка — полностью объектно- ориентированные, с синтаксисом, похожим на синтаксис C++. Однако ни один из этих двух языков не является надмножеством C++. Оба они используют сборку мусора, а не явно задаваемое освобождение памяти. Оба включают в свой синтаксис механизмы синхронизации потоков. Типы данных Оба языка поддерживают идею примитивных типов (которые в C# являются подмножеством типов-значений — value types), и оба для трансляции примитивных типов в объектные обеспечивают их автоматическое «заворачивание» в объекты (boxing) и «разворачивание» (unboxing) (в Java - начиная с версии 1.5). У C# имеется больше примитивных типов, чем у Java, за счёт беззнаковых целых типов (unsigned), имеющихся парно ко всем знаковым, и специального типа decimal для высокоточных вычислений с плавающей запятой. В Java отказались от большинства беззнаковых типов ради простоты. В частности, в Java нет примитивного типа беззнакового байта. Массивы и коллекции Массивы и коллекции тоже получили выражение в синтаксисе обоих языков, благодаря особой разновидности цикла for (цикл по коллекции, известный также как цикл foreach). В обоих языках массив является объектом класса Array, но в Java он не реализует какие-либо интерфейсы коллекций, хотя по массивам возможна итерация циклом for(. Внутренние классы Оба языка позволяют определить класс внутри класса. Однако Java поддерживает так называемые внутренние классы (inner classes): класс, объявленный внутри другого класса, может иметь доступ к нестатическим (экземплярным) членам родительского класса, то есть «знает о this»; кроме того, внутри методов можно определять локальные классы, имеющие доступ по чтению к локальным переменным, и безымянные (анонимные) локальные классы, которые фактически позволяют создавать экземпляры объектов и интерфейсов, перекрывающие методы своего класса.