Diferença entre c # e java
  • Em Java, os métodos são virtuais por padrão, mas você pode torná-los finais. (Em C #, eles são selados por padrão, mas você pode torná-los virtuais.)
  • Existem muitos IDEs para Java, gratuitos (por exemplo, Eclipse, Netbeans) e comerciais (por exemplo, IntelliJ IDEA)
  • Os genéricos são completamente diferentes entre os dois; Os genéricos Java são apenas um "truque" em tempo de compilação (mas útil nisso). Em C # e .NET, os genéricos também são mantidos no tempo de execução e funcionam para tipos de valor e tipos de referência, mantendo a eficiência apropriada (por exemplo, uma Lista como um byte [], em vez de uma matriz de bytes em caixa.)
  • C # não possui exceções verificadas
  • Java não permite a criação de tipos de valor definidos pelo usuário
  • Java não possui sobrecarga de operadores e conversões
  • Java não possui blocos de iteradores para implementação simples de iteradores
  • Java não tem nada como LINQ
  • Em parte devido à falta de delegados, o Java não tem nada parecido com métodos anônimos e expressões lambda. Classes internas anônimas geralmente preenchem esses papéis, mas de maneira desajeitada.
  • Java não tem árvores de expressão
  • C # não tem classes internas anônimas
  • De fato, o C # não possui as classes internas do Java - todas as classes aninhadas no C # são como as classes aninhadas estáticas do Java
  • Java não possui classes estáticas (que não possuem construtores de instância e não podem ser usadas para variáveis, parâmetros etc.)
  • Java não tem nenhum equivalente aos tipos anônimos do C # 3.0
  • Java não tem variáveis ​​locais digitadas implicitamente
  • Java não possui métodos de extensão
  • Java não tem expressões de inicializador de objetos e coleções
  • Os modificadores de acesso são um pouco diferentes - em Java (atualmente) não há equivalente direto de um assembly, portanto, não há idéia de visibilidade "interna"; em C #, não há equivalente à visibilidade "padrão" em Java, que leva em consideração o espaço para nome (e herança)
  • A ordem de inicialização em Java e C # é sutilmente diferente (o C # executa inicializadores de variáveis ​​antes da chamada em cadeia ao construtor do tipo base)
  • Java não tem um equivalente da instrução using para tentativa simplificada / finalmente manipulação de recursos
  • Java não possui propriedades como parte da linguagem; eles são uma convenção dos métodos get / set / is
  • Java não tem o equivalente ao código "inseguro"
  • A interoperabilidade é mais fácil em C # (e .NET em geral) que a JNI do Java
  • Java e C # têm idéias um pouco diferentes de enumerações. Os Java são muito mais orientados a objetos.
  • Java não possui diretivas de pré-processador (#define, #if etc em C #).
  • Java não tem equivalente de ref de C # e sai para passar parâmetros por referência
  • Java não tem equivalente de tipos parciais
  • Interfaces C # não podem declarar campos
  • Java não possui tipos inteiros não assinados
  • Java não tem suporte de idioma para um tipo decimal. (java.math.BigDecimal fornece algo como System.Decimal - com diferenças - mas não há suporte para idiomas)
  • Java não tem equivalente de tipos de valor anuláveis
  • O boxe em Java usa tipos de referência predefinidos (mas "normais") com operações específicas neles. O boxe em C # e .NET é um assunto mais transparente, com um tipo de referência sendo criado para box pelo CLR para qualquer tipo de valor.
  • Isso não é exaustivo, mas abrange tudo o que consigo pensar de antemão.

Referência: Stackoverflow Crédito: Jon Skeet