Diferenças entre C/C++ e Java

A maneira de se programar em Java é muito similar à programação em C++. Mas existem algumas diferenças importantes, de interesse para os programadores de C++ que desejam aprender Java. Estas mudanças referem-se a:

Compilador e Interpretador

O compilador pode ser invocado por uma linha de comando com a sintaxe:

javac nome.java

Este arquivo nome.java pode conter mais de uma classe, mas apenas uma poderá ter o atributo public. O compilador gera vários arquivos com extensão class, um para cada classe do arquivo compilado.

A exemplo do compilador, o interpretador pode também ser chamado por meio de uma linha de comando com a seguinte sintaxe:

java nome.class

O arquivo nome.class deve ser referente a classe que possui o método main.

Volta ao início da página

Herança

Da mesma maneira que C++, java suporta herança de objetos, mas não suporta herança múltipla. Em seu lugar Java admite uma nova construção chamada "interface". As interfaces especificam o comportamento de um objeto sem definir a sua implementação. Java suporta a herança múltipla de interfaces com o que ganha-se muitos dos benefícios da herança múltipla de classes sem seus inconvenientes.

Interface é uma coleção de definições de métodos (sem implementação) e constantes. Na declaração de uma classe pode constar que ela implementa uma ou mais interfaces. Algumas caractrísticas das interfaces são:

  • Não é possível herdar variáveis;
  • Não é possível herdar implementação de métodos;
  • A hierarquia de Interfaces é independente da hierarquia de Classes. Duas classes que implementam a mesma Interface não são necessariamente relacionadas na hierarquia de Classes.

Vejamos uma utilidade das interfaces. Suponhamos que queremos fazer referência a um certo conjunto de classes que possuem o método func(), mesmo que não tenham uma superclasse comum a não ser a classe base Object. Para isso, primeiro declaramos uma interface que especifica o método func(). Em seguida criamos subclasses dessas classes, que implementam essa interface. Agora, para fazer referência às classes, basta fazer referência à interface comum.

Volta ao início da página

Ponteiros

Os criadores da linguagem Java retiraram o tipo ponteiro. A princípio, isto pode parecer uma grande dificuldade para aqueles que fazem grande uso deste recurso em outras linguagens, mas é muito simples fazer esta mudança.

O que permitiu a eliminação dos ponteiros sem prejuízo para os programadores foi o fato de que todas as variáveis são manipuladas por referência. Portanto onde se usava ponteiro, passamos a usar simplesmente a variável. É importante ressaltar o problema de cópia de objetos. Por exemplo:

a = new ponto(10,10);
b = ponto();
b = a;
b.x = 20;

No código acima cria-se uma variável ponto de coordenadas x=10 e y=10. Ao se escrever b=a, b passa a referir-se ao mesmo endereço de memória que foi alocado para a. Em seguida o comando b.x = 20, muda a coordenada x de b. O mesmo acontece com a, já que ocupam o mesmo endereço. Para contornar isto deve-se alocar uma posição de memória diferente para b e fazer as modificações desejadas. Isto resulta no código:

a = new ponto(10,10);
b.x = 20;
b.y = a.x;
// cria ponto de coordenadas (10,10)
// faz primeira coordenada igual a 20 e copia a segunda
// a = (10,10) e b = (20,10)

Volta ao início da página

Comandos de Pré-Processador

Diferente de C/C++, Java não possui um ciclo de pré-processamento. Os procedimentos antes executados no pré-processamento são executados em tempo de execução. Isto traz algumas vantagens muito interessantes.

Em Java não é necessário o uso de header files, já que não existe distinção entre definição e declaração de classes. Por este motivo, eliminou-se o comando #Include. Existe o comando Import em Java que se assemelha ao #Include. Java organiza suas bibliotecas de uma forma que possa mapear qualquer classe que se queira usar no programa. Para usar a forma abreviada da classe (sem ter que especificar todo o caminho: java.awt.button, por exemplo), usamos o comando Import para especificar o package que estaremos usando.

Todas as variáveis e bibliotecas são carregadas dinamicamente.

A definição de constantes é feita dentro da classe usando-se os modificadores static final.

A ausência do pré-processador elimina o uso de macros, muito comum para se evitar a repetição do código em várias partes do programa. Isto está de acordo com a filosofia de verificação de erros mais rígida, tornando a linguagem "strongly typed".

Por ser uma linguagem independente de plataforma não existe a necessidade do uso do comando #If def para condicionar a compilação, razão pela qual ele não foi incluído na linguagem. O compilador Javac realiza implicitamente uma compilação condicional, pois ele não compila um trecho do código se verificar que este trecho nunca será executado.

Volta ao início da página

Encapsulamento

O encapsulamento é uma característica da programação orientada a objetos, a qual permite controlar o acesso às variáveis e métodos de um objeto. Os modificadores são similares aos usados em C++, com a alteração da acessibilidade padrão. A tabela abaixo resume as características de cada modificador:

MODO LIMITE DE ACESSIBILIDADE
private Este é o nível de encapsulamento mais restritivo. A acessibilidade das declarações limita-se ao envoltório da classe.
protected A acessibilidade das declarações se limita a própria classe, às classes herdeiras dela e ao package.
Nada especificado A acessibilidade das declarações se limita a própria classe e as classes do mesmo package, mas não às classes herdeiras que estejam fora do package.
public Estas declarações são sempre acessíveis.

Volta ao início da página

Tipos

Foram mantidos os principais tipos primitivos (que são manipulados por valor) de dados de outras linguagens. A tabela abaixo resume os tipos suportados por Java:

Primitivos Aritméticos Inteiros byte 8-bit two's complement Byte-length integer
short 16-bit two's complement Short integer
int 32-bit two's complement Integer
long 64-bit two's complement Long integer
char 16-bit Unicode character A single character
Ponto Flutuante float 32-bit IEEE 754 Single-precision floating point
double 64-bit IEEE 754 Double-precision floating point
Boleano
boolean true or false A boolean value (true or false)
Referência Classe
Interface
Array

Existem algumas diferenças que merecem destaque. O tipo boleano não é mais representado por inteiros 0 e 1. Ele tem valores TRUE e FALSE, o que impede que sejam realizadas operações aritméticas com variáveis boleanas. Foram eliminadas as variáveis do tipo struct e list.

Volta ao início da página


UP ] Índice - Java ] [ Diferenças entre C/C++ e Java ] Exemplos ] Destaques ]