| Pionner Design |
|
Parecida com C, C++: Java tem a aparência de C ou de C++, embora a filosofia da linguagem seja diferente. Por este motivo estaremos frequentemente fazendo comparações alguma destas linguagens. O leitor que programa em qualquer uma delas, ou em uma linguagem orientada a objetos, se sentirá mais a vontade e se tornará um bom programador Java em menos tempo. Java também possui características herdadas de muitas outras linguagens de programação: Objective-C, Smalltalk, Eiffel, Modula-3, etc. Muitas das características desta linguagem não são totalmente novas. Java é uma feliz união de tecnologias testadas por vários centros de pesquisa e desenvolvimento de software. Compilada:
Um programa em Java
é compilado para o chamado “byte-code”, que é próximo as instruções
de máquina, mas não de uma máquina real. O “byte-code” é um código
de uma máquina virtual idealizada pelos criadores da linguagem. Por isso Java
pode ser mais rápida do que se fosse simplesmente interpretada.
Portável: Java foi criada para ser portável. O “byte-code” gerado pelo compilador para a sua aplicação específica pode ser transportado entre plataformas distintas que suportam Java (Solaris 2.3Ò, Windows-NTÒ, Windows-95Ò, Mac/Os etc) . Não é necessário recompilar um programa para que ele rode numa máquina e sistema diferente, ao contrário do que acontece por exemplo com programas escritos em C e outras linguagens. Esta
portabilidade é importante para a criação de aplicações para a
heterogênea internet. Muitos d os programas exemplo deste tutorial foram
escritos e compilados numa plataforma Windows-95Ò
e rodaram perfeitamente quando simplesmente copiados para uma plataforma
Solaris 2.3Ò.
Em Java um inteiro por exemplo, tem sempre 32
bits, independentemente da arquitetura. O próprio compilador Java
é escrito em Java, de modo que ele é portável para
qualquer sistema que possua o interpretador de “byte-codes”. Um
exemplo de programa escrito em Java é o browser hotjava. Orientada
a Objetos: A portabilidade é uma das características que se inclui nos objetivos almejados por uma linguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora com relação ao grupo atual de linguagens orientadas a objetos. Java suporta herança, mas não herança múltipla. A ausência de herança múltipla pode ser compensada pelo uso de herança e interfaces, onde uma classe herda o comportamento de sua superclasse além de oferecer uma implementação para uma ou mais interfaces. Java permite a criação de classes
abstratas. Outra característica importante em linguagens orientadas a
objetos é a segurança. Dada a sua
importância o tópico foi escrito a parte.
Segura: A presença de coleta automática de lixo, evita erros comuns que os programadores cometem quando são obrigados a gerenciar diretamente a memória (C , C++, Pascal ). A eliminação do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas traz benefícios em termos de segurança. O programador é proibido de obter acesso a memória que não pertence ao seu programa, além de não ter chances de cometer erros comuns tais como “reference aliasing” e uso indevido de aritmética de ponteiros. Estas medidas são particularmente úteis quando pensarmos em aplicações comerciais desenvolvidas para a internet. Ser “strongly typed” também é uma vantagem em termos de segurança, que está aliada a eliminação de conversões implícitas de tipos de C++. A presença
de mecanismos de tratamento de exceções torna as aplicações mais
robustas, não permitindo que elas abortem, mesmo quando rodando sob condições
anormais. O tratamento de exceções será útil na segunda parte para
modelar situações tais como falhas de transmissão e formatos incompatíveis
de arquivos.
Suporta
concorrência:
A linguagem permite a criação
de maneira fácil, de vários “threads” de execução. Este tópico
será útil quando você estudar animações, e é particularmente
poderoso nos ambientes em que aplicações Java são suportadas, ambientes estes que
geralmente podem mapear os threads da linguagem em processamento paralelo
real. Eficiente:
Como Java
foi criada para ser usada em computadores pequenos, ela exige pouco espaço,
pouca memória. Java é muito mais eficiente que grande
parte das linguagens de “scripting” existentes, embora seja cerca de
20 vezes mais lenta que C, o que não é um marco definitivo. Com a evolução
da linguagem, serão criados geradores de “byte-codes” cada vez mais
otimizados que trarão as marcas de performance da linguagem mais próximas
das de C++ e C. Além disso um dia Java
permitirá a possibilidade de gerar código executável de uma particular
arquitetura “on the fly”, tudo a partir do “byte-code”. Suporte
para programação de sistemas distribuídos:
Java fornece facilidades para programação com sockets, remote method call, tcp-ip, etc. Estes tópicos não serão abordados neste texto. PROGRAMAÇÃO ORIENTADA
A OBJETOS NOTA
AOS PROGRAMADORES “C”
A leitura deste hipertexto é
fortemente recomendada para os programadores que tem “C” ou ”C++”
como sua principal linguagem de programação, mesmo antes de iniciar a
leitura deste tutorial: Iniciaremos
com um pouquinho de teoria sobre orientação a objetos. Se você quiser
algum hipertexto para aprofundamento ou para ler em paralelo com esta
introdução sobre classes e objetos e use: 1.
CLASSES E OBJETOS
Uma classe é um tipo definido pelo usuário que contém o molde, a especificação para os objetos, algo mais ou menos como o tipo inteiro contém o molde para as variáveis declaradas como inteiros. A classe envolve, associa, funções e dados, controlando o acesso a estes, definí-la implica em especificar os seus atributos (dados) e seus métodos (funções). Um programa que utiliza uma interface controladora de um motor elétrico provavelmente definiria a classe motor. Os atributos desta classe seriam: temperatura, velocidade, tensão aplicada. Estes provavelmente seriam representados na classe por tipos como int ou float. Os métodos desta classe seriam funções para alterar a velocidade, ler a temperatura, etc. Um programa editor de textos definiria a classe parágrafo
que teria como um de seus atributos uma String ou um vetor de Strings, e como métodos,
funções que operam sobre estas strings. Quando um novo parágrafo é
digitado no texto, o editor cria a partir da classe Parágrafo um objeto contendo as informações
particulares do novo texto. Isto se chama instanciação ou criação do
objeto.
1.1.
ESPECIFICANDO UMA CLASSE
Suponha um programa que controla um motor elétrico através de uma saída serial. A velocidade do motor é proporcional a tensão aplicada e esta proporcional aos bits que vão para saída serial e passam por um conversor digital analógico. Vamos abstrair todos estes detalhes por enquanto e
modelar somente a interface do motor como uma classe, a pergunta é que métodos
e que atributos deve ter nossa classe, que argumentos e valores de retorno
devem ter os métodos? Representação
da velocidade:
A velocidade do motor será representada por um atributo inteiro (int). Usaremos a faixa
de bits que precisarmos, caso o valor de bits necessário não possa ser
fornecido pelo tipo , usaremos então o tipo long, isto depende do conversor digital analógico
utilizado. Representação
da saída serial: O motor precisa conhecer a sua saída serial, a sua
ligação com o “motor do mundo real”. Suponha uma representação em
hexadecimal do atributo endereço de porta serial, um possível nome para
o atributo:
enderecomotor. Não se preocupe em saber como usar a representação
hexadecimal. Alteração do
valor da velocidade: Internamente o usuário da classe motor pode desejar alterar a velocidade, cria-se então o método: public void altera_velocidade(int novav);. O código anterior corresponde ao cabeçalho do método ele é definido junto com a classe motor, associado a ela. O valor de retorno da função que “implementa” o método é void, poderia ser criado um valor de retorno (boolean) que indicasse se o valor de velocidade era permitido e foi alterado ou não era permitido e portanto não foi alterado. O ato de invocar um método também é chamado de passar uma mensagem para o objeto que está executando este método. Não faz sentido usar, chamar, este método separado de uma variável do tipo motor, mas então porque na lista de argumentos da função não se encontra um motor? Este pensamento reflete a maneira de associar dados e código (funções) das linguagens procedurais. Em linguagens orientadas a objetos o código e os dados são ligados de forma diferente, a própria declaração de um tipo definido pelo usuário já engloba as declarações das funções inerentes a este tipo, isto será explicado em 1.2. O objeto ao qual é aplicado o método é passado de outra forma. Note que não fornecemos o código do método, isto não
é importante, por hora a preocupação é com a interface definida pela
classe: seus cabeçalhos de métodos e atributos. Apenas pense que sua
interface deve ser flexível de modo a não apresentar entraves para a
criação do código que seria feita numa outra etapa. Nesta etapa teríamos
que imaginar que o valor numérico da velocidade deve ir para o conversor
onde irá se transformar numa diferença de potencial a ser aplicada nos
terminais do motor, etc. Um diagrama simplificado da classe motor com os atributos e métodos:
Este e outros diagramas deste texto foram elaborados com uma ferramenta case para “object oriented modeling and design” segundo a metodologia descrita em [[1]] |