Para desenvolvedores c # que estão começando a aprender Java, existem grandes diferenças subjacentes entre as duas linguagens que devem ser apontadas?
Talvez algumas pessoas possam presumir que as coisas sejam iguais, mas há alguns aspectos importantes que não devem ser negligenciados? (ou você pode realmente estragar tudo!)
Talvez em termos de construções OOP, a forma como o GC funciona, referências, implantação relacionada, etc.
Respostas:
Algumas pegadinhas na minha cabeça:
byte
é assinado em Java (infelizmente)static
ele terá uma referência implícita a uma instância da classe contida.fonte
aqui está uma comparação muito abrangente dos 2 idiomas:
http://www.25hoursaday.com/CsharpVsJava.html
Adicionado: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
fonte
Estou surpreso que ninguém tenha mencionado propriedades, algo bastante fundamental em C #, mas ausente em Java. C # 3 e acima também implementaram propriedades automaticamente. Em Java, você deve usar métodos do tipo GetX / SetX.
Outra diferença óbvia são as expressões LINQ e lambda em C # 3 ausentes em Java.
Existem algumas outras coisas simples, mas úteis, ausentes em Java, como strings verbatim (@ ""), sobrecarga de operador, iteradores usando rendimento e pré-processador também estão ausentes em Java.
Um dos meus favoritos pessoais em C # é que os nomes de namespace não precisam seguir a estrutura de diretório físico. Eu gosto muito dessa flexibilidade.
fonte
Existem muitas diferenças, mas estas me vêm à mente:
fonte
.equals
é o que você tem que usar..NET reificou genéricos; Java apagou os genéricos.
A diferença é esta: se você tem um
ArrayList<String>
objeto, em .NET, você pode dizer (em tempo de execução) que o objeto tem tipoArrayList<String>
, enquanto em Java, em tempo de execução, o objeto é do tipoArrayList
; aString
parte está perdida. Se você colocar não-String
objetos noArrayList
, o sistema não poderá forçar isso, e você só saberá sobre isso depois de tentar extrair o item e o elenco falhar.fonte
String
objetos nessa lista sem fazer uma conversão não verificada, em algum lugar , e o compilador irá avisá-lo corretamente naquele ponto que o compilador não pode mais verificar os limites genéricos. Contanto que sua lista esteja sempre armazenada em uma variável deList<String>
, as tentativas de inserir um objeto não String nela não serão compiladas.add
método (novamente, por meio de reflexão). O sistema rejeitará um não-String
objeto imediatamente ou apenas ao lançar o resultado deget
?List
. Você pode ter objetos de tipos descendentes deList
, comoArrayList
eLinkedList
. (É importante usar emList
vez deArrayList
ao distribuí-los, mas não muda o fato de que você não pode dizernew List()
.)Uma coisa que sinto falta em C # do Java é o tratamento forçado de exceções verificadas. Em C #, é muito comum que alguém desconheça as exceções que um método pode lançar e você esteja à mercê da documentação ou dos testes para descobri-las. Não é assim em Java com exceções verificadas.
fonte
Java possui autoboxing para primitivos em vez de tipos de valor; portanto, embora
System.Int32[]
seja uma matriz de valores em C #,Integer[]
é uma matriz de referências aInteger
objetos e, como tal, não é adequada para cálculos de desempenho superior.fonte
Sem delegados ou eventos - você tem que usar interfaces. Felizmente, você pode criar classes e implementações de interface inline, então isso não é um grande negócio
fonte
x => x.Foo
vs.new Bar() { public void M(SomeType x) { return x.Foo; } }
- quem se importa com o código sendo 10 vezes menor?A funcionalidade interna de data / calendário em Java é horrível em comparação com System.DateTime. Há muitas informações sobre isso aqui: O que há de errado com a API Java Date & Time?
Algumas delas podem ser dicas para um desenvolvedor C #:
Além disso, o Java não tem todos os mesmos recursos que o GAC e os assemblies fortemente nomeados trazem. Jar Hell é o termo para o que pode dar errado ao vincular / fazer referência a bibliotecas externas.
No que diz respeito ao empacotamento / implantação:
fonte
Não há delegados em Java. Portanto, além de todos os benefícios que os delegados trazem para a mesa, os eventos também funcionam de forma diferente. Em vez de apenas conectar um método, você precisa implementar uma interface e anexá-la.
fonte
Uma coisa que saltou b / c está na minha lista de entrevistas é que não há nenhuma palavra-chave "nova" análoga em Java para ocultar métodos e, portanto, nenhum aviso do compilador "você deve colocar nova aqui". Ocultação de método acidental quando você pretendia ignorar leads para bugs.
(editar, por exemplo) Exemplo, B deriva de A (usando a sintaxe C #, Java se comporta da mesma forma que verifiquei, mas não emite aviso do compilador). Foo de A é chamado, ou foo de B? (A é chamado, provavelmente surpreendendo o dev que implementou 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(); }
fonte
new
método para ocultar intencionalmente - ou não finais, substituídos em vez de ocultos.Java não tem LINQ e a documentação é um inferno. As interfaces de usuário em Java são difíceis de desenvolver, você perde todas as coisas boas que a Microsoft nos deu (WPF, WCF, etc ...), mas se torna difícil de usar, dificilmente documentadas "APIs".
fonte
O único problema que encontrei até agora ao trabalhar com Java vindo do C # é que exceções e erros são diferentes.
Por exemplo, você não pode detectar um erro de falta de memória usando catch (Exceção e).
Consulte o seguinte para obter mais detalhes:
why-is-java-lang-outofmemoryerror-java-heap-space-not-locked
fonte
Já faz muito tempo desde que estou em Java, mas as coisas que percebi logo de cara no desenvolvimento de aplicativos foram o modelo de evento C #, arrastar e soltar C # vs usar gerenciadores de layout no Swing (se você estiver fazendo desenvolvimento de aplicativos) e tratamento de exceção Java certificando-se de capturar uma exceção e C # não é obrigatório.
fonte
Em resposta à sua pergunta muito direta em seu título:
"Desenvolvedores C # aprendendo Java, quais são as maiores diferenças que alguém pode ignorar?"
R: O fato de Java ser consideravelmente mais lento no Windows.
fonte
A diferença mais dolorosa para mim quando mudo para java é a declaração de string.
em C #
string
(na maioria das vezes) em JavaString
É bem simples, mas acredite em mim, te faz perder muito tempo quando você tem o hábito de
s
não perderS
!fonte