Для разработчиков C #, которые стремятся изучить Java, есть ли какие-либо существенные различия между двумя языками, на которые следует указать?
Может быть, некоторые люди могут подумать, что все будет по-прежнему, но есть некоторые важные аспекты, которые не следует упускать из виду? (или вы действительно можете облажаться!)
Может быть, с точки зрения конструкций ООП, того, как работает сборщик мусора, ссылок, связанных с развертыванием и т. Д.
Ответы:
Несколько ошибок в голове:
byte
подписан на Java (к сожалению)static
он будет иметь неявную ссылку на экземпляр содержащего класса.источник
вот очень подробное сравнение двух языков:
http://www.25hoursaday.com/CsharpVsJava.html
Добавлено: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
источник
Я удивлен, что никто не упомянул свойства, которые в C # довольно фундаментальны, но отсутствуют в Java. В C # 3 и выше также автоматически реализованы свойства. В Java необходимо использовать методы типа GetX / SetX.
Еще одно очевидное отличие - LINQ и лямбда-выражения в C # 3 отсутствуют в Java.
В Java отсутствуют некоторые другие простые, но полезные вещи, такие как дословные строки (@ ""), перегрузка операторов, итераторы, использующие yield и препроцессор, также отсутствуют в Java.
Одно из моих личных фаворитов в C # - это то, что имена пространств имен не обязательно должны соответствовать физической структуре каталогов. Мне очень нравится такая гибкость.
источник
Отличий много, но мне на ум приходят следующие:
источник
.equals
это то, что вам нужно использовать..NET расширил дженерики; Java удалила дженерики.
Разница заключается в следующем: если у вас есть
ArrayList<String>
объект, в .NET вы можете сказать (во время выполнения), что объект имеет типArrayList<String>
, тогда как в Java во время выполнения объект имеет типArrayList
;String
часть теряется. Если вы вставляете неString
объекты вArrayList
, система не может обеспечить это, и вы узнаете об этом только после того, как попытаетесь извлечь элемент, и приведение не удастся.источник
String
объекты в этот список, не выполнив неконтролируемое приведение где-нибудь , и компилятор правильно предупредит вас в этот момент, что компилятор больше не может проверять общие границы. Пока ваш список всегда хранится в переменнойList<String>
, попытки вставить в него объект, отличный от String, не будут компилироваться.add
метод (опять же, через отражение). Будет ли система отклонять неString
объект сразу или только при приведении результатаget
?List
. У вас могут быть объекты типов, производных отList
, напримерArrayList
иLinkedList
. (Это важно использоватьList
вместо того, чтобыArrayList
передавать их, но это не меняет того факта, о котором вы не можете сказатьnew List()
.)Одна вещь, которую мне не хватает в C # из Java, - это принудительная обработка проверенных исключений. В C # очень часто не известно об исключениях, которые может вызвать метод, и вы зависите от документации или тестирования, чтобы их обнаружить. Не так в Java с проверенными исключениями.
источник
Java имеет автобоксирование для примитивов, а не для типов значений, поэтому, хотя
System.Int32[]
в C # иInteger[]
является массивом значений, это массив ссылок наInteger
объекты, который не подходит для вычислений с более высокой производительностью.источник
Никаких делегатов или событий - вы должны использовать интерфейсы. К счастью, вы можете создавать классы и реализации интерфейсов встроенными, так что это не такая уж большая проблема.
источник
x => x.Foo
противnew Bar() { public void M(SomeType x) { return x.Foo; } }
- кого волнует, чтобы код был в 10 раз короче?Встроенная функциональность даты / календаря в Java ужасна по сравнению с System.DateTime. Здесь много информации об этом: Что не так с Java Date & Time API?
Некоторые из них могут быть ошибкой для разработчика C #:
Кроме того, Java не имеет всех тех функций, которые предоставляют GAC и сборки со строгими именами. Jar Hell - это термин для обозначения того, что может пойти не так при компоновке / ссылке на внешние библиотеки.
Что касается упаковки / развертывания:
источник
В Java нет делегатов. Таким образом, помимо всех преимуществ, которые делегаты приносят за стол переговоров, мероприятия также работают по-другому. Вместо того, чтобы просто подключить метод, вам нужно реализовать интерфейс и вместо этого присоединить его.
источник
Одна вещь, которая выпадает из моего списка собеседований, заключается в том, что в Java нет «нового» аналога ключевого слова для сокрытия метода и, следовательно, нет предупреждения компилятора «вы должны поместить здесь новое». Случайное скрытие метода, когда вы хотели переопределить, приводит к ошибкам.
(отредактируйте, например) Пример, B является производным от A (используя синтаксис C #, Java ведет себя так же, как в прошлый раз, но не выдает предупреждения компилятора). Вызывается ли foo от A или foo от B? (A вызывается, что, вероятно, удивляет разработчика, реализовавшего B).
class A { public void foo() {code} } class B:A { public void foo() {code} } void SomeMethod() { A a = new B(); // variable's type is declared as A, but assigned to an object of B. a.foo(); }
источник
new
метода для намеренного скрытия - либо не окончательные, поэтому они переопределяются, а не скрываются.В Java нет LINQ, а документация - это ад. Пользовательские интерфейсы на Java сложно разрабатывать, вы теряете все хорошее, что Microsoft дала нам (WPF, WCF и т.д.), но становитесь трудными в использовании, плохо документированными «API».
источник
Единственная проблема, с которой я столкнулся до сих пор при работе с Java, исходящей от C #, - это разные исключения и ошибки.
Например, вы не можете поймать ошибку нехватки памяти с помощью catch (Exception e).
Для получения более подробной информации см. Следующее:
почему-это-java-lang-outofmemoryerror-java-heap-space-not-поймано
источник
Я так давно не был на Java, но то, что я сразу заметил при разработке приложений, - это модель событий C #, перетаскивание C # и использование менеджеров макета в Swing (если вы занимаетесь разработкой приложений) и обработка исключений с помощью Java убедится, что вы перехватили исключение, а C # не требуется.
источник
В ответ на ваш очень прямой вопрос в заголовке:
«Разработчики C #, изучающие Java, какие самые большие различия можно упустить из виду?»
О: Дело в том, что Java работает в Windows значительно медленнее.
источник
Самая неприятная для меня разница, когда я перехожу на java, - это объявление строки.
в C #
string
(большую часть времени) в JavaString
Это довольно просто, но поверьте мне, это заставляет вас терять так много времени, когда у вас есть привычка этого
s
не делатьS
!источник