• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Knitter

[Java] Introdução à Programação em Java

1 mensagem neste tópico

Este tópico pretende ser uma introdução à lingugem Java e um complemento ao tópico iniciado aqui.

Não pretendo apresentar a história do Java, para isso podem recorrer ao tópico indicado ou à wikipedia onde podem obter informações sobre a plataforma e sobre a linguagem.

Darei início a uma leve apresentação da linguagem, chamem-lhe capítulo zero, que depois complementarei com conceitos mais aprofundados.

Capítulo Zero, parte I.

Java é uma linguagem apoiada por um paradigama de programação chamado Programação Orientada a Objectos, sem o qual não é possível programar em Java. Como não espero que leiam os textos que indiquei, farei um pequeno resumo...

1. Um pouco de teoria!

Apenas uma introdução.

1.1.E que raio é isso de POO?

Conceito geral de Programação Orientada a Objectos

A Programação Orientada a Objectos consiste em ver um programa como um conjunto de entidades, os objectos, que interagem entre si através do uso de mensagens.

Cada objecto é definido por um grupo de atributos e por métodos que disponibiliza para o exterior.

Podem assim ser considerados pequenas caixas pretas cuja implementação não interessa para os outros objectos, apenas a forma como podem comunicar é importante.

Em POO traduzir um problema real para programação torna-se mais fácil e natural uma vez que os objectos possuem muitas vezes semelhanças com objectos reais.

Java não é, no entanto, uma linguagem orientada a objectos pura uma vez que possui tipos de dados primitivos que não são objectos.

1.2.Algumas definições

Para que todos falemos a mesma língua.

Package: Forma de organizar as classes ou outros recursos do programa, como imagens e ficheiros de i18n, por semelhanças, seja por categorias, funcionalidades ou outras.

Um package pode conter outros dentro e por convenção o seu nome é em minúsculas.

Classe: Abstracção que define um objecto. Consideremos uma classe como um molde. Uma classe é normalmente definida num ficheiro mas um ficheiro pode ter outras classes definidas, que se chamam Classes Anónimas e Classes Internas.

Estes últimos dois nomes são traduzidos de "Nested Class" e de "Inner Class" e por isso podem ver outras traduções.

Objecto ou instância: Resultado do molde ou classe ao qual foram aplicados valores. A classe String define um conjunto de caracteristas que qualquer 'string' possui. Em contrapartida "Knitter" pode ser o objecto resultante da classe String.

Um objecto ou instância possui valores específicos, memória associada, referência, etc.

Método: Capacidades do objecto de onde se salientam as formas de comunicação do mesmo. Os métodos podem ser de instância, na medida em que afectam apenas o objecto sobre o qual se invocou o método ou de classe afectando todas as instâncias da classe presentes.

Herança: Processo pelo qual os objectos ganham caracteristicas dos seus pais. Mas uma subclasse pode e deve introduzir comportamento e características próprias. Uma classe em Java é sempre subclasse de outra, por defeito da classe Object.

Encapsulamento: Conceito que permite esconder os detalhes de implementação de determinada classe. Os métodos e atributos de uma classe podem ser públicos, protegidos1 ou privados dependendo se estão disponíveis para todas as outras classes, apenas subclasses, ou apenas na própria classe, respectivamente.

Caso não seja especificado o tipo de acesso de determinado atributo/método, o Java assume que ele se encontra acessivel à própria classe e a classes no mesmo package.

Polimorfismo: Polimorfismo é a capacidade de um objecto redefinir o comportamento herdado provondo assim o aparecimento de duas classes que respondem de formas diferentes à mesma mensagem. Isto é, a classe Object possui um método chamado toString que transforma em String o nome da classe e alguns outros parâmetros. Ao criar a classe MeuObjeto posso redifinir o método para que apresente qualquer texto que eu queira. Ao ser invocado o método nos dois objectos, a mesma mensagem, produz efeitos diferentes.

2. Caracteristicas da linguagem

- É uma linguagem orientada a objectos.

- É um linguagem independente da plataforma e da arquitectura. Um programa criado em Java é compilado para bytecode, este código é universal e entendido por todas as máquinas virtuais de Java. Desta forma o código não fica restrito à plataforma onde foi compilado e pode ser executado sem alterações em qualquer plataforma onde exista um interpretador Java, ou JVM.

No entanto o bytecode criado pode ser compilado para a plataforma, tornando-se assim código nativo. Isto é conseguido recorrendo ao compilador JIT que analisa o código e o torna nativo.

De notar que existem duas formas difentes de máquinas virtuais ou JVM, a "client" e a "server" que possuem capacidade distintas. A JVM "client", ou cliente, é a que é usado pelas aplicações comuns e é a que é possível encontrar no JRE standard. A "server", ou servidor, é usada pelas aplicações "enterprise", aplicações mais exigentes onde as optimizações da componente "server" se fazem notar.

- Distribuída. Possui primitivas de comunicação de alto nível como carregamento de recursos via URL, Remote Method Invocation e CORBA IIOP.

Possui primiticas de comunicação de baixo nível através de Sockets.

Permite também carregar código de forma transparente a partir de qualquer lugar.

- Robusta. Não possui ponteiros. Em Java os ponteiros são substituidos por referências e toda a aritmética de ponteiros desaparece. Existe a verificação de acesso a tabelas e operações de cast em runtime.

- Segura. Acrescentando ao facto de que o código é verificado durante a execução, de que código desconhecido é executado isoladamente, de que não é possível aceder a indíces fora de tabelas e de que não existem ponteiros com os seus acessos perigoso à memória, o Java permite ainda que o código seja autenticado através de assinaturas digitais e certificados.

- Suporta multithreading. As bibliotecas são thread safe, e o suporte para threads, além de fazer parte da biblioteca, usando a classe Thread, está embutido na linguagem através de métodos sincronizados e semáforos associados a cada classe.

3. O código

Java tem grande base em C/C++, o compilador HotSpot da Sun é feito em C++, e por isso programadores que estejam habituados a essas duas linguagens encontrarão muito delas na linguagem Java.

3.1. Comentários

Comentários são conseguidos da mesma forma que em C/C++ no entanto aparecem novos tipos de comentários associados à linguagem, os comentários de documentação.

/*Isto é um 
comentário de 
várias linhas*/

//Isto é um comentário de linha única

/** Isto é um comentário para ser usado na documentação ou JavaDoc
*  Alguns IDEs geram documentação de comentários deste tipo. Existem várias
*  tags que podem ser usadas para formatar o aspecto final da documentação mas isso é outra história.
*/

3.2.Tipos de dados

Em Java todos os tipos de dados têm tamanho fixo, isso mesmo, seja em 64bits seja em 32bits, se estiverem a usar java, um int tem sempre o mesmo tamanho. Essa é mais uma razão que torna o Java independente da plataforma.

Além disso todos os tipos primitivos possuem uma classe que permite adaptá-los e transformá-los em objectos.

Todos os tipos de dados possuem sinal e não existe o modificador unsigned como no C/C++

[table]

[td]Tipo Primitivo[/td]

[td]Tamanho[/td]

[td]Valor minímo[/td]

[td]Valor máximo[/td]

[td]Valores possíveis[/td]

[td]Classe de adaptação[/td]

[td]boolean[2][/td]

[td]1 bit[/td]

[td]-[/td]

[td]-[/td]

[td]true, false[/td]

[td]Boolean[/td]

[td]char[/td]

[td]16 bit[/td]

[td]Unicode 0[/td]

[td]Unicode 2^16 - 1[/td]

[td]'a' b' 'c'... etc.[/td]

[td]Character[/td]

[td]byte[/td]

[td]8 bit[/td]

[td]-128[/td]

[td]128[/td]

[td]Qualquer valor dentro da gama. Formato pode ser decimal(10, 12, -1), octal(010, 017) ou hexadecimal(0x2e, 0xff)[/td]

[td]Byte[/td]

[td]short[/td]

[td]16 bit[/td]

[td]-32,762[/td]

[td]32,762[/td]

[td]Qualquer valor dentro da gama. Formato pode ser decimal(10, 12, -1), octal(010, 017) ou hexadecimal(0x2e, 0xff)[/td]

[td]Short[/td]

[td]int[/td]

[td]32 bit[/td]

[td]-2,147,483,648[/td]

[td]2,147,483,648[/td]

[td]Qualquer valor dentro da gama. Formato pode ser decimal(10, 12, -1), octal(010, 017) ou hexadecimal(0x2e, 0xff)[/td]

[td]Integer[/td]

[td]long[/td]

[td]64 bit[/td]

[td]-9,223,372,036,854,775,808[/td]

[td]9,223,372,036,854,775,808[/td]

[td]Qualquer valor dentro da gama. Suporta os formatos decimal, octal e hexadecimalacrescentando um L ou l ao final. Ex.: 0x7ffffffffffffffL[/td]

[td][/td]

[td]float[/td]

[td]32 bit[/td]

[td]+/-3.4e-38[/td]

[td]+/-3.4e+38[/td]

[td]Qualquer valor dentro da gama. Formato idêntico ao do long mas com a letra F ou f.[/td]

[td]Float[/td]

[td]double[/td]

[td]64 bit[/td]

[td]+/-1.7e-308[/td]

[td]+/-1.7e+308[/td]

[td]Qualquer valor dentro da gama. Formato decimal ou científico(2.2e-2 ou 2.2E-2)[/td]

[td]Double[/td]

[/table]

3.3. Operadores

Apenas os principais. São iguais ao C.

3.3.1. Atribuição

=

3.3.2. Aritméticos

Não podem ser aplicados ao tipo boolean

+, -, /, *, %

3.3.3. Aritméticos + atribuição

+=, -=, /=, *=, %=

 

3.3.4. Relacionais

Produzem um resultado do tipo boolean

>, >=, <, <=, ==, !=

Só o == e o != é que podem ser aplicados ao tipo boolean

3.3.5. Lógicos

Apenas podem ser aplicados a valores boolean e produzem como resultado um valor também do tipo boolean.

&&; AND lógico.

||; OR lógico.

!; Negação lógica.

3.3.6. Operador ternário

expressão do tipo boolean ? expressão caso verdadeiro : expressão caso falso

3.3.7. Operador de conversão, Cast

(Novo tipo)Expressão

A conversão de tipos menores para tipos maiores é feita de forma automática.

A conversão de tipos maiores para tipos menores tem de ser feita de forma explicita utilizando o operador de cast.

Tomando como exemplo as duas classes apresentadas acima, Object e a sua subclasse MeuObjecto:

Object x;
MeuObjecto y;

(...)
x=y; //conversão automática, qualquer y é um x
y=(MeuObjecto)x; //conversão explicita, neste caso chamado downcast, pode ocorrer um erro em runtime.
                //Ninguém garante que este x seja um y! Neste caso ocorre mesmo um erro de runtime
                //uma vez que x foi declarado com do tipo Object que nunca pode ser convertido para MeuObjecto.
(...)

O cast de objectos levanta algumas questões. Atenção o seguinte exemplo é meramente académico, não é real e está errado conceptualemente.

Para abordarmos o problema considerem a que uma classe ocupa 2bytes, classe Bytes2, e que a sua subclasse ocupa mais 2 bytes, classe Byte4.

Se efectuarmos o cast de um objecto do tipo Byte4 para o tipo Byte2

Byte2 b2;
Byte4 b4;

(...)
(Byte2)b4;
(...)

não haverá qualquer problema. O que obtemos no final são os 2 bytes de uma classe que ocupava 4, nada de estranho.

Mas se por outro lado tentar-mos converter um objecto do tipo Byte2 em Byte4

Byte2 b2;
Byte4 b4;

(...)
(Byte4)b2;
(...)

Então vamos ter um problema, estamos a tentar fazer crescer uma classe, a classe que ocupava 2 bytes agora tenta ocupar 4. Quem já programou em C vai reconhecer aqui um belo acesso ilegal à memória!

No entanto o Java lança uma excepção e avisa-nos, normalmente este é do tipo de erros que se encontra nos primeiros testes.

3.4. Estruturas de controlo e Mecanismo de Excepções

Iguais às do C/C++ com excepção do mecanismo de excepções.

3.4.1. Estruturas de controlo

while (condição) {
   código
}

for (valor inicial; condição de paragem; incremento) {
   código
}

if (condição) {
   código
}

switch (valor de teste) {
   case 1:
       código;
       [break]
   case 2:
       código;
       [break]
   case (...):
       código;
       [break]
   case n:
       código;
       [break]
   default: 
       código;
       [break]
}

3.4.2. Mecanismo de excepções

O mecanismo de excepções será tratado mais adiante.

try {
   código
} catch (TipoDeExcepção nome) {
   Código
} finally {
código
}

3.5. Declaração de variáveis, métodos e os demais.

Em Java as variáveis podem ser declaradas em qualquer parte do código, normalmente são declaradas no início, muito à semelhança do C. No entanto, e tendo em conta que um objecto é uma caixa preta da qual não importa a implementação, muitos autores e alguns programas de modelação colocam as variáveis no fundo do código de modo a dar foco à funcionalidade. Em última análise é uma escolha pessoal.

Por outro lado as convenções ditam que as variáveis deve ter o seu nome começado por uma letra minúscula e que devem sempre ser iniciadas[3].

Os métodos terão também os seus nomes iniciados por uma letra minúscula

As classes são escritas com a primeira letra dos seus nomes em maiúculas e sempre que o seu nome for resultado da composição de dois ou mais nomes, cada nome será iniciado em maiúscula.

Ex. MeuObjecto, MinhaPrimeiraClasse, etc.

Apresentação de uma classe:

package xpto;

import java.lang.String; 

public class MinhaPrimeiraClasse extends String implements Serializable {
   
   private int numero = 0;
   private String nome = null;
   
   public MinhaPrimeiraClasse() {
       this("Sem nome", 0);
   }
  
   public MinhaPrimeiraClasse(String nome, int numero) {
       this.nome = nome;
       this.numero = numero;
   }
}

O exemplo acima apresenta uma classe, que herda ou que é subclasse da classe String e que implementa uma interface chamada Serializable. O conceito de interfaces será apresentado futuramente.

Podem ver algumas coisas que não falei como o facto de a classe também ser publica, ou a palavra reservada this ou o import mas esses são assuntos a aprofundar mais tarde.

5. O que precisam para começar a programar?

O Java Development Kit, que além do JRE, contém os compiladores da linguagem e as APIs que permitem a programação.

O manual de java da sun, que podem ler on-line ou descarregar para usarem sempre que precisarem.

Um bom IDE

- Eclipse - Gratuito

- Borland JBuilder - Pago

- Netbeans - Gratuito

6. Recursos

Para quem falhou os links indicados no texto e para os que querem saber mais.

Geral:

- Why Java is Better than C;

- Site oficial da plataforma/linguagem;

- Forúm oficial da plataforma/linguagem.

Na wikipedia:

- Plataforma Java.

- Linguagem Java.

- POO.

- Bytecode Java.

- JVM.

- HotSpot JVM, a máquina da Sun

- Java package.

- Interantionalization ou i18n

Notas:

[1] Se verificarem com atenção métodos e atributos protegidos têm o mesmo acesso que métodos e atributos públicos, senão vejamos o caso dos atributos, que em tudo é igual ao dos métodos:

um atributo protegido é acedido apenas pela própria classe e pelas suas subclasses, assim basta que eu crie uma subclasse da classe com o atributo protegido a que quero ter acesso e tenho controlo desse atributo. Daqui posso criar métodos públicos que forneço a qualquer outra classe.

Em resumo o uso da palavra reservada protected e a consequente definição de atributos ou métodos protegidos não trás vantagens, pelo contrário poderá dar uma falsa segurança a um programador mais distraido.

[2] Em C/C++ o valor 0, zero, e o valor NULL eram considerados falso, em Java isso não acontece.

Enquanto que a seguinte instrução C é válida e avalia falso caso x == 0, e verdadeiro em caso contrário,

(...)
if(x) {
   //executa se x != 0
else
   //executa se x == 0
(...)

em Java a instrução terá de ser traduzida para:

(...)
if(x != 0) {
   //executa se x != 0
else
   //executa se x == 0
(...)

Qualquer tentativa de reproduzir o código de C/C++ directamente para Java provoca um erro de compilação.

[3] A palavra inglesa initialize não traduz para o português inicializar uma vez que inicializar não consta no dicionário de português. Traduz no entanto, em sentido, para a palavra iniciar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora