Se você é um programador C++ que numca usou o Java, este artigo de certeza vai ser interessante. Serão mencionados os vários aspectos no qual Java se diferencia do C++. Este artigo não tem o objectivo de ser referência no assunto. Não serão abordados todos os assuntos que marcam a diferença entre Java e C++, apenas uma visão, para que você possa facilmente se integrar no mundo do Java..
Nada de ponteiros!
A grande diferença entre Java e C++ é pelo facto de Java não usar ponteiros. Para um programador C++ pode parecer impossivel sobreviver sem ponteiros. Com o Java, podemos criar complexas estruturas de dados, sem recorrer a ponteiros. Você notará que isso não só é possivel, como também é muito mais fácil trabalhar sem ponteiros. Actualmente Java apenas possui ponteiros explicitos, em forma de endereços de memória. As vezes se fala em Java que tudo é um ponteiro. Isto não é completamente verdade, mas é aceitável. Vamos analisar isto em mais detalhes.
Referências
Java trata tipos primitivos( como int,float e double) diferentemente dos objectos. Veja estas duas declarações:
int intVar; // uma variável int chamada intVar BankAccount bc1; // referência ao objecto BankAccount
Na primeira declaração, um local da memória chamado intVar actualmente armazena um valor numérico, como por exemplo 127( assumindo que um valor foi armazenado ali). Em contrapartida, o local bc1 não armazena dados do objecto BankAccount. Em vez disso, ele contém o endereço para o objecto BankAccount que está armazenado algures na memória. O nome bc1 é uma referência para um objecto e não o objecto em si.Actualmente, bc1 não armazena nenhuma referência, pois ele não foi associado a nenhum objecto em algum ponto do programa. Antes de ser associado a nenhum objecto, ele armazena a referência a um objecto especial chamado null. Do mesmo modo, intVar não armazenará nenhum valor numérico se não for associado a nenhum. O compilador irá reagir se você tentar usar uma variável não associada a nenhum número.Em C++, a declaração
BankAccount bc1;
Cria um objecto; ele reserva memória suficiente para armazenar todos os dados do objecto. Em Java, tudo o que a declaração cria é um lugar para colocar o endereço do objecto na memória. Você pode entender referência como sendo um ponteiro com uma sintaxe de uma variável ordinaria.(C++ possui variáveis de referências, mas elas devem ser especificadas explicitamente usando o símbolo &).
Atribuição
O operador (=) opera de uma forma diferente para objectos Java, em relação aos objectos C++, Em C++, a declaração
bc2 = bc1;
copia todos os dados do objecto chamado bc1 para um objecto diferente chamado bc2. Seguido desta declaração, teremos dois objectos diferentes com os mesmos dados. Em Java, por seu turno, a declaração acima copia o endereço de memória que bc1 referencia para o bc2. Dai bc1 e bc2 passarão a referenciar exactamente ao mesmo objecto; Elas são referencias a este. Isto pode te levar a alguns sarrilhos se você ainda não entendeu o que o operador de atribuição faz exactamente. Seguindo a declaração vista acima, a declaração
bc1.acrescenta(21.00); ebc2.acrescenta(21.00);
todas acrescentam $21 a mesma conta bancáriaSuponha que agora você pretende copiar os dados de um objecto para outro. Neste caso, você terá de ter a certeza de que você possui dois objectos separados para começar, e depois copiar cada célula separadamente. O sinal de igualidade não é capaz de fazer o trabalho por você!
O operador new
Todos os objectos em Java devem ser criados usando a palavra reservada new. Em contrapartida, em Java, new retorna uma referência e não um ponteiro como em C++. Assim, para ponteiros não é necessário usar o operador new. Aqui está uma forma de criar uma conta:
BankAccount ba1; ba1 = new BankAccount();
Eliminar ponteiros torna o sistema mais seguro. Como programador, você pode encontrar o endereço actual do ba1, mas você não pode corromper este objecto. Porém, provavelmente você não precisará conhecer isto, a menos que você esteja planeando algo mau.Como é que podemos liberar a memória alocada pelo operador new, quando já não precisamos mais dela? Em C++, usamos delete. Em Java, você não precisa se preocupar com isto. Java verifica periodicamente os endereços de memória alocados pelo operador new, para verificar se ainda existem referências válidas a este endereço ou não. Se já não existirem referências, o objecto é transformado em memória livre. Este processo é chamado de Garbage Colletion. Em C++ muitas vezes os programadores se esquecem de liberar os blocos de memória, causando vazamentos de memória que consomem os recursos do sistema, levando a uma péssima performance ou ainda quebrando o sistema. Vazamentos de memória não podem ocorrer em Java( ou são muito raros).
Argumentos
Em C++ ponteiros são usados para passar objectos à funções, para evitar a cópia de largos objectos. Em Java, os objectos são sempre passados como referências. Isto também evita a cópia de objectos.
void methodo1() {
BankAccount ba1 = new BankAccount(350.00);
methodo2(ba1);
}
void methodo2(BankAccount acct){}
Neste código, as referências ba1 e acct referênciam ao mesmo objecto. Dados de tipos primitivos por outro lado, são sempre passados por valor. Isto é, uma nova variável é criada na função e o valor do argumento é passado para ela.
Igualdade e identidade
Em Java, se você está falando de tipos primitivos, o operador de igualdade(==) irá te indicar se duas variáveis possuem o mesmo valor:
int intVar1 = 27;
int intVar2 = intVar1;
if(intVar1 == intVar2)
System.out.println("Eles são iguais");
Esta sintaxe é a mesma que em C e C++, mas em java, porque são usadas referências, esta instrução funcionda de uma forma diferente para objectos. O operador de igualdade, quando aplicado à objectos, apenas indica se duas referências são iguais, isto é, se elas referênciam a um mesmo objecto:
carPart cp1 = new carPart("fender");
carPart cp2 = cp1;
if(cp1 == cp2)
System.out.println("Eles são idênticos");
Em C++, esta operação indicaria se dois objectos contém os mesmos dados. Se você pretende verificar se dois objectos possuem os mesmos dados em Java, você deve usar o método equals() da classe Object:
carPart cp1 = new carPart("fender");
carPart cp2 = cp1;
if( cp1.equals(cp2) )
System.out.println("Eles são iguais");
Isto funciona porque todos os objectos em Java são implicitamente derivados da classe Object
Operadores sobrecarregados
Esta é simples: Não existem operadores sobrecarregados em Java. Em C++, você pode redefinir os operadores +,*,= e muitos outros operadores, para que eles actuem de uma forma diferente para objectos de determinada classe. Nenhuma redefinição é possível em Java. Em vez disso, use métodos como add().









Comentários Recentes