Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Apostila Java, Notas de estudo de Cultura

- - -

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 18/12/2008

luiz-otavio-bertochi-10
luiz-otavio-bertochi-10 🇧🇷

4 documentos

1 / 113

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Tutorial:
A LINGUAGEM DE PROGRAMAÇÃO
JAVAF 0
D 4
ORIENTAÇÃO A OBJETOS
André Augusto Cesta. [email protected]
Orientadora: Profa Dra Cecília Mary Fischer Rubira
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Apostila Java e outras Notas de estudo em PDF para Cultura, somente na Docsity!

Tutorial:

“A LINGUAGEM DE PROGRAMAÇÃO

JAVA

F 0 D 4 (^)

ORIENTAÇÃO A OBJETOS

André Augusto Cesta. [email protected]

Orientadora: Profa^ Dr a^ Cecília Mary Fischer Rubira

INDÍCE

  • 1 CLASSES E OBJETOS...............................................................................................................................
  • 1.1 ESPECIFICANDO UMA CLASSE.............................................................................................................
  • 1.2 OBJETOS EM JAVA....................................................................................................................................
  • 1.2.1 PROGRAMA HELLO INTERNET!...........................................................................................................
  • 1.2.2 ATRIBUTOS................................................................................................................................................
  • 1.2.3 ATRIBUTOS E MÉTODOS........................................................................................................................
  • 1.2.4 MÉTODOS QUE RETORNAM VALORES...............................................................................................
  • 1.2.5 COMPARAÇÃO COM UM PROGRAMA EM PASCAL..........................................................................
  • 1.2.6 CONSTRUTORES.......................................................................................................................................
  • 1.2.7 CONSTRUTORES E AGREGAÇÃO.........................................................................................................
  • 1.2.8 DESTRUTORES OU “finalizers”...............................................................................................................
  • 1.3 PONTEIROS, “POINTERS”, REFERÊNCIAS E OBJETOS.....................................................................
  • 1.3.1 PASSAGEM POR REFERÊNCIA..............................................................................................................
  • 1.3.2 VETORES E MATRIZES............................................................................................................................
  • 1.3.3 COPIA , COMPARAÇÃO E DETERMINAÇÃO DA CLASSE EM OBJETOS.......................................
  • 1.4 OBTENDO VALORES DO USUÁRIO......................................................................................................
  • 1.4.1 LENDO DO TECLADO..............................................................................................................................
  • 1.4.1.1 LEITURA DE STRINGS USANDO UM VETOR DE BYTES..................................................................
  • 1.4.1.2 UMA VISÃO GERAL SOBRE PACKAGES E STREAMS......................................................................
  • 1.4.2 ARGUMENTOS DE LINHA DE COMANDO...........................................................................................
  • 1.5 ENCAPSULAMENTO COM PRIVATE, PUBLIC, “PACKAGE” e PROTECTED..................................
  • 1.5.1 ENCAPSULANDO MÉTODOS E ATRIBUTOS.......................................................................................
  • 1.5.1.1 ATRIBUTOS PRIVATE, MÉTODOS PUBLIC
  • 1.5.1.2 UM ATRIBUTO É PUBLIC......................................................................................................................
  • 1.5.2 ENCAPSULAMENTO E “PACKAGES”...................................................................................................
  • 1.5.2.1 ENCAPSULAMENTO DE ATRIBUTOS E MÉTODOS COM PACKAGES...........................................
  • 1.5.2.2 ENCAPSULAMENTO DE CLASSES COM PACKAGES........................................................................
  • 1.6 TIPO ABSTRATO DE DADOS..................................................................................................................
  • 1.6.1 TAD FRAÇÃO............................................................................................................................................
  • 1.6.2 STRINGS, UM MODELO DE CLASSE...................................................................................................
  • 1.6.3 TAD E ALOCAÇÃO DINÂMICA.............................................................................................................
  • 2 HERANÇA..................................................................................................................................................
  • 2.1 HIERARQUIAS DE TIPOS
  • 2.1.1 UMA HIERARQUIA SIMPLES.
  • 2.1.2 PROTECTED..............................................................................................................................................
  • 2.1.3 REDEFINIÇÃO DE MÉTODOS HERDADOS..........................................................................................
  • 2.2 INTERFACES, UMA ALTERNATIVA PARA HERANÇA MÚLTIPLA...................................................
  • 3 POLIMORFISMO, CLASSES ABSTRATAS.............................................................................................
  • 3.1 REDEFINIÇÃO DE MÉTODOS PARA UMA CLASSE HERDEIRA......................................................
  • 3.2 SOBRECARGA ( MÉTODOS E OPERADORES)....................................................................................
  • 3.2.1 SOBRECARGA DE MÉTODOS, “COPY CONSTRUCTOR”..................................................................
  • 3.2.2 SOBRECARGA DE OPERADOR............................................................................................................
  • 3.3 CLASSES ABSTRATAS E CONCRETAS.................................................................................................
  • 3.3.1 CLASSE ABSTRATA ITERADOR.............................................................................................................
  • 3.3.2 ACOPLAMENTO DINÂMICO DE MENSAGENS..................................................................................
  • 3.3.2.1 UM EXEMPLO ESCLARECEDOR...........................................................................................................
  • 3.3.2.2 O QUE ACONTECE COM O QUE FOI ACRESCENTADO.....................................................................
  • 3.3.3 LISTA HETEROGÊNEA DE FORMAS (geométricas).............................................................................
  • 4 CONCEITOS AVANÇADOS.......................................................................................................................
  • 4.1 ATRIBUTOS STATIC..................................................................................................................................
  • 4.2 MÉTODOS STATIC...................................................................................................................................
  • 4.3 TRATAMENTO DE EXCEÇÕES...............................................................................................................
  • 4.3.1 TRATANDO AS EXCEÇÕES GERADAS POR TERCEIROS..................................................................
  • 4.3.2 GERANDO SUAS PRÓPRIAS EXCEÇÕES.............................................................................................
  • 4.4 threads.....................................................................................................................................................
  • 4.4.1 CRIANDO THREADS USANDO INTERFACES OU HERANÇA...........................................................
  • 4.4.1.1 HERANÇA USADA PARA CRIAR THREADS.........................................................................................
  • 4.4.1.2 INTERFACES USADAS PARA CRIAR THREADS.................................................................................
  • 4.4.2 PENSANDO MULTITHREADED..............................................................................................................

INFORMAÇÃO SOBRE “COPYRIGHT”

Agradecimento e créditos para F 0D 3 Copyright 1996- IC - UNICAMP.

Marcas Registradas:

Sun , o logotipo da Sun, Sun Microsystems, Solaris, HotJava e Java são marcas registradas de Sun Microsystems, Inc. nos Estados Unidos e em alguns outros países. O personagem “Duke” é marca registrada de Sun Microsystems. UNIX é marca registrada nos Estados Unidos e outros países, exclusivamente licenciada por X/Open Conpany, Ltd.. Netscape Navigator é marca registrada de: “Netscape Communications Corporation”.

Prefácio:

Este texto faz parte de um estudo comparativo de linguagens de programação orientadas a objetos. O conteúdo deste estudo também está disponível na “World Wide Web”, área multímidia da internet, sob o endereço http://www.dcc.unicamp.br/~aacesta. Neste endereço, você pode complementar seu aprendizado, rodando exercícios iterativos, acessando “links” para outros hipertextos sobre linguagens de programação, vendo exemplos de programas e interagindo com aplicações para a internet. A diferença entre este estudo e outros textos que você possa encontrar sobre o mesmo assunto é o caráter prático. Exemplos completos, dicas de programação, explicações sobre detalhes normalmente ignorados em livros, tornarão seu aprendizado mais fácil, principalmente na segunda parte onde tratamos da construção de aplicações para a internet. No inicio, os exemplos podem ser considerados fáceis, mas eles vão se complicando cada vez mais de modo que é importante que o leitor acompanhe o texto fazendo os exercícios. Forneceremos uma série de idéias de programas simples para que você possa testar seu conhecimento. Estes programas simples podem ser melhorados através do uso de interfaces gráficas, assunto que não é coberto neste tutorial.

QUEM DEVERIA LER ESTE TUTORIAL

Qualquer leitor que tenha experiência com pelo menos uma linguagem de programação.

DIAGRAMAÇÃO DESTE TEXTO

Apesar de Java ser uma linguagem que serve para vários propósitos, o seu sucesso atual (época do seu lançamento) se deve a possibilidade de elaboração de aplicações para a internet. Dada a importância deste aspecto da linguagem, este texto está organizado de maneira semelhante as páginas encontradas na WWW, frequentemente você encontrará diagramas como o seguinte:

TUTORIAL

http://www.dcc.unicamp.br/~aacesta “Estudo comparativo de linguagens de programação orientadas a objetos”. Nesta página você encontrará tutoriais sobre diversas linguagens orientadas a objetos, dentre elas: C++, Modula-3, Java. Quanto a Java, você terá a oportunidade de ver código de programas e testá-los, além de poder adquirir a versão mais nova deste texto.Encontrará também links para sites sobre orientação a objetos.

Este diagrama representa um hipertexto que pode ser acessado de modo a complementar seu estudo. A parte escrita em letra maior é o endereço, o texto em itálico faz um resumo do conteúdo desta página. Usando estes “links” ou diagramas você encontrará uma maneira ordenada de aprender sem se perder no mar de informações da internet.

URL: “Uniform Resource Locator”, é o endereço de um computador na internet

O diagrama acima aparecerá toda vez que introduzirmos uma palavra nova. Caso você encontre alguma palavra desconhecida, basta usar o índice remissivo para obter sua definição. É importante lembrar que os hipertextos citados neste tutorial, não são de nossa responsabilidade. Como eles estão sujeitos a mudanças, contamos com a sua ajuda para efetuarmos atualizações, conte você também com a nossa ajuda na internet. Os programas exemplo deste texto são apresentados em caixas retangulares, e todo código é escrito em fonte diferente da usada neste texto comum. O trechos de código que aparecem desmembrados de seus arquivos, tem fundo cinza claro. Todos os arquivos presentes dentro dos retângulos, são arquivos “text-only”, qualquer formatação (negrito) tem apenas função didática.

Os resultados dos programas são indicados pelo diagrama ao lado:

“browsers” compatíveis com Java.

“DOWNLOAD” “BROWSERS”

http://www.microsoft.com A microsoftF 0 D 4licenciou a tecnologia Java e a incorporou em seu novo browser: Internet Explorer versão 3.0 ou superior.

BROWSERS: São uma categoria de programas que permitem você visualizar um documento criado em um certo padrão, no caso html (hipertext markup language). Atualmente os browsers tem se tornado complexos devido a quantidade de padrões existentes (ex. imagens .gif .jpg, etc). A linguagem Java pode contribuir para minimizar esta complexidade.

CARACTERÍSTICAS DA LINGUAGEM

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.3F 0D 2 , Windows-NTF 0D 2 , Windows-95F 0D 2 , 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-95F 0D 2 e rodaram perfeitamente quando simplesmente copiados para uma plataforma Solaris 2.3F 0D 2. 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.

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. 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 []

Exercícios:

1- Lembre-se de algum programa em que você trabalhou, cite que tipos de classes seriam criadas se esse programa fosse escrito em Java, que atributos e que métodos estariam associados a esses objetos? Exemplo: “Eu trabalhei em um programa de contas a pagar e contas a receber. Se esse programa fosse escrito em Java eu definiria a classe conta_bancaria. Os atributos seriam: saldo, taxa_de_juros, limite_de_saque, etc. Minha opção seria por representá-los como variáveis do tipo double (não se preocupe em usar os tipos da linguagem inda)”. “Dentre os métodos desta classe estariam funções para efetuar saques, depósitos e computar juros. ”

1.2.. OBJETOS EM JAVA

Objetos são instâncias de uma classe. Quando um objeto é criado ele precisa ser inicializado, ou seja para uma única classe de nome EstudanteDeGraduacao podemos ter vários objetos durante a execução de um programa.

Estudante de graduação Andre; Identificação 940718 ; Curso Computacao | Estudante de graduação Luiza , Identificação 893249 , Curso Medicina... A classe representa somente o molde para a criação dos objetos, estes sim contém informação, veja tópico. O atributo Identificação tem valor 940718 para a instância (objeto) André da classe Estudantes de Graduação.

INSTANCIAS: Um objeto existente durante um momento da execução de um programa é uma instancia de uma classe.

Uma classe e suas instancias: Cada estudante (ou instancia) poderia ser modelado, desenhado como:

Objetos podem conter objetos, ou seja os atributos de um objeto podem ser objetos, da mesma classe ou não. Objetos podem ser passados pela rede, armazenados em meio físico. Objetos possuem um estado e um comportamento. Métodos podem receber objetos como argumentos, podem declarar objetos como variáveis locais, podem chamar outros métodos. Você pode chamar um método (mandar uma mensagem) para objetos em outras máquinas através de sua rede. Um objeto pode ser visto como um RECORD, só que com uma tabela de funções que podem ser chamadas para ele. Na verdade esta definição não é muito teórica, mas é um bom começo para os programadores que estão acostumados com linguagens procedurais. Na verdade podemos fazer com objetos muito mais do que fazemos com records e procedimentos em Pascal. Em Java, ao contrário de C++ e Modula-3, não existem funções desvinculadas de classes, funções isoladas. Isto implica que todo trecho de código que for escrito deve pertencer a uma classe, mais precisamente deve ser um método desta. O programa mais simples em Java deve conter pelo menos uma classe e um método de início de programa, e é este programa que faremos agora. Esta filosofia é simples e semelhante a adotada em Eiffel, tudo o que se pode fazer com procedimentos, funções isoladas e variáveis de procedimentos, também se pode fazer com classes e métodos. C++ tinha que permitir a criação de funções isoladas para manter a compatibilidade com “C”, mas Java não. Quando neste texto usarmos o termo função no lugar de métodos estaremos mais interessados em enfatizar a parte de implementação em detrimento da interface, você pensar que em Java toda função implementa um método de uma classe. O leitor não acostumado com o paradigma de orientação a objetos, pode achar estranhas as afirmações acima, e a pergunta mais comum neste momento é: “Mas então como você sabe aonde vai começar o programa?”. Antes da resposta a essa pergunta, leia o primeiro programa exemplo, que é semelhante ao primeiro programa em C, “Hello World”, presente em [].

PROGRAMA HELLO INTERNET!

Este exemplo visa apresentar um programa simples para imprimir uma mensagem na tela, este provavelmente será seu primeiro programa em Java.

COMPILANDO UM PRIMEIRO PROGRAMA:

1 -Certifique-se de ter adicionado a sua lista de path’s o path do compilador e interpretador Java. Javac e Java respectivamente.

2 -Crie o arquivo ao lado em um diretório qualquer (“folder” para usuários mac) e salve com o nome: HelloInternet.Java

//Comentario de uma linha

public class HelloInternet {

public static void main (String args[]) {

É um qualificador do método que indica que este é acessível externamente a esta classe (para outras classes que eventualmente seriam criadas), não se preocupe com ele agora, apenas declare todos os métodos como public. Voltaremos a este assunto em.

static É um outro qualificador ou “specifier”, que indica que o método deve ser compartilhado por todos os objetos que são criados a partir desta classe. Os métodos static podem ser invocados, mesmo quando não foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe: .(argumentos);. Retornaremos a esta explicação mais tarde, por hora você precisa saber que particularmente o método main precisa ter essa qualificação porque ele é chamado sem que se crie nenhum objeto de sua classe (a classe HelloInternet).

Curiosidade:

Se você gosta de paradoxos e já conhece um pouco de orientação a objetos, pense que se o método main tivesse que ser chamado para um objeto (o que não é o caso) este objeto teria que ter sido criado em algum outro lugar então este lugar seria o início do programa e main 1 deixaria de ter esta finalidade. A linguagem de programação Eiffel adota uma técnica diferente para resolver este problema: todo programa começa com a criação de um objeto (e não mais a chamada automática de main), este objeto é chamado ROOT, ele pode conter atributos que são inicializados e um método de inicialização, construtor do objeto, que é o início do código do programa.

void Semelhante ao void C++ ou C, é o valor de retorno da função, quando a função não retorna nenhum valor ela retorna void, uma espécie de valor vazio que tem que ser especificado.

main Este é um nome particular de método que indica para o compilador o início do programa, é dentro deste método e através das iterações entre os atributos, variáveis e argumentos visíveis nele que o programa se desenvolve.

(String args[]) É o argumento de main e por consequência do programa todo, ele é um vetor de Strings que é formado quando são passados ou não argumentos através da invocação do nome do programa na linha de comando do sistema operacional, exemplo: Java HelloInternet argumentotexto1 argumentotexto No nosso caso, ignoramos a possível passagem de argumentos via linha de comando, retornaremos a este assunto em.

“Abre chaves” e “fecha chaves”. Para quem não conhece C ou C++, eles podem ser entendidos como algo semelhante ao BEGIN END de Pascal ou Modula-3, ou seja: delimitam um bloco de código. Os programadores Pascal notarão que variáveis locais dos métodos podem ser declaradas em qualquer local entre as chaves. Mas por motivos de clareza do código declararemos todas no início do abre chaves.

System.out.println("Hello Internet!"); Chamada do método println para o atributo out da classe ou objeto System, o argumento é uma constante do tipo String. println assim como writeln de Pascal, imprime a String e posiciona o cursor na linha abaixo , analogamente print não avança linha. Por hora você pode guardar esta

(^1) main, do inglês: Principal.

linha de código como o comando para imprimir mensagens na tela, onde o argumento que vem entre aspas é a String a ser impressa. O ; “ponto e vírgula” separa operações.

Finalmente o fecha chaves termina com a declaração da classe HelloInternet.

Conclusão:

Normalmente o volume de conceitos presentes num primeiro programa de uma linguagem orientada a objetos como Java ou Eiffel é grande se comparado com o de um primeiro programa em C ou Pascal. Esses conceitos ainda serão aprofundados e são citados aqui apenas por curiosidade, é normal que você não tenha entendido tudo. De agora em diante não explicaremos mais como compilar os programas.

Exercícios:

1- Experimente fazer modificações no programa HelloInternet. Imprima outras mensagens na tela, adicione comentários.

ATRIBUTOS

No programa anterior, não observamos a criação de nenhum objeto, apenas a declaração da classe HelloInternet que continha o método main. O nosso programa funcionou, porque o método main não precisa de um objeto específico para ser invocado. Este exemplo declara uma classe (Circulo) e em seguida cria um objeto deste tipo em main e altera o conteúdo desta variável. Uma classe é parecida com um record de Pascal, a nossa representa um círculo com os atributos raio e x , y, que são coordenadas cartesianas. Note que este objeto não possui métodos ainda. A classe círculo é especificada em um arquivo separado do arquivo da classe que contém o método main (início do programa), um arquivo neste texto é representado pelo retângulo envolvendo um trecho de código, até o tópico cada classe será especificada em um arquivo. É importante entender este exemplo, quando você estudar interfaces gráficas, poderá usar a classe círculo pré-definida na linguagem para desenhar círculos que se movem na tela. Embora não tenhamos explicado com detalhes os tipos básicos da linguagem, usaremos neste exemplo o tipo float (real), e nas explicações o tipo String e o tipo int (inteiro). No final deste tópico forneceremos uma explicação detalhada sobre tipos.

//Classe circulo, arquivo Circulo.Java

public class Circulo { //so atributos entre as chaves

public float raio; //atributo raio do circulo public float x; //posicoes em coordenadas cartesianas public float y;

}

O primeiro arquivo deste exemplo contém o código da classe Circulo, esta classe contém três atributos. A declaração de atributos segue sintaxe semelhante a de C++ (haverão acréscimos a esta sintaxe):

EspecificadorModoAcesso NomeTipo NomeAtributo;

public float raio; public float x; public float y;

Todos os atributos pertencentes a classe são do tipo float (Ponto flutuante 32-bit IEEE754, veja tabela de tipos básicos). Estão especificados como public o que significa que podem ser modificados a partir de uma classe que usa um objeto Circulo seja como variável de método ou como atributo (este tipo de modificação será exemplificado na classe Principal). Existem outros especificadores que abordaremos mais adiante, por hora todos os métodos e atributos que criarmos deverão ser public. Vale lembrar que na declaração de variáveis simples em métodos, não faz sentido usar o EspecificadorModoAcesso. Esta classe Circulo não possui métodos. Como exemplo de declaração de variáveis simples tome a declaração de uma variável Circulo no método main. Seguida de sua alocação: umcirc=new Circulo(); //alocacao dessa variavel. Sem a alocação a variável não pode ser usada. Note que os atributos são por default inicializados para zero.

Classe Principal declaração e inicialização de atributos:

A classe Principal não possui atributos, porque nenhum objeto desta classe é criado, apenas seu método main é chamado. O método main declara uma referência para objeto da classe Circulo: Circulo umcirc;. Note que diferentemente de C++ não são necessários “includes” ou “header files” para poder declarar essa variável de um “tipo” definido pelo usuário e existente em outro arquivo. Antes da referência ao objeto ser usada, este precisa ser alocado na memória o que é feito através de umcirc=new Circulo();. Se você tivesse declarado um objeto da classe String, já definida na linguagem, e depois fizesse sua alocação, o código seria semelhante ao seguinte: String umastring; umastring=new String(“Valor inicial”); A diferença com a alocação do objeto Circulo é que entre os parênteses incluem um argumento “Valor inicial”, isto ocorre porque a linguagem permite que você aproveite a alocação de um objeto para inicializar alguns de seus atributos, isto será explicado em .. Neste nosso programa, os atributos contidos na área de memória alocada por new, são alterados de outra forma.

Coleta automática de lixo:

A desalocação do objeto é feita pela linguagem, (“automatic garbage collection”), você não precisa se preocupar com ela. Após o fecha chaves de main, a memória do objeto umcirc já pode ser liberada, o que normalmente não ocorre de imediato, pois o ambiente da linguagem executa um “tread” em baixa prioridade que libera de tempos em tempos os espaços inutilizados de memória, tirando proveito por exemplo de eventuais pausas de iteração do usuário com o programa. Por executar em um “tread” entenda paralelamente ou quase paralelamente, voltaremos a este tópico mais adiante.

Acesso aos atributos e métodos e alterações dos atributos:

O acesso aos atributos da variável (objeto) umcirc deve ser feito usando o nome do objeto e o nome do atributo deste, separados por um ponto: umcirc.raio=10.0;. Note que raio sozinho não faz sentido no programa, precisa-se especificar de que objeto se deseja alterar ou obter o raio.

A sintaxe de chamadas de métodos é semelhante a sintaxe descrita acima, só que ao envés de nome do atributo temos o nome do método seguido dos parênteses que podem conter zero ou mais argumentos. Volte ao primeiro programa (HelloInternet) e verifique a declaração do método main, onde chamamos o método println() para o objeto System.out.

Imprimindo variáveis do tipo float e inteiro (int) na tela:

System.out.println("("+umcirc.x+","+umcirc.y+","+umcirc.raio+")"); O argumento de println que conhecemos é uma única variável do tipo String, no entanto o código acima mistura nos argumentos desse método os seguintes elementos: Strings: “(“, operadores : +, e variáveis float: umcirc.y. Fica muito fácil de você entender porque isto funciona se pensar que + é também operador de concatenação de Strings e que os argumentos int ou float e de outros tipos básicos desse método são convertidos para Strings.

Importante aos que não programam em C ou C++, os operadores = e ==:

Em Java, C, e C++ o operador = (igual) tem a função de atribuição e o operador == (igual igual) tem a função de comparação entre valores, retornando o valor booleano verdadeiro se estes valores forem idênticos. Alguns podem não achar esta escolha de operadores sensata, principalmente os matemáticos, mas com um pouco de uso da linguagem ela se tornará automática.

Curiosidade (só para programadores C e C++), eliminação do problema que ocorre em C e C++ com os operadores = e == :

Em C, C++ e também em Java é permitido escrever: int i,j,k; i=0; j=k=i+3; //final, j vale 3, k vale 3 e i continua valendo 0 Essas atribuições em cadeia permitem escrever código mais compacto, elas fazem sentido porque atribuições nessas linguagens possuem valores, assim k=i+3; no final tem o valor de k que é igual a i+3. O valor de j=... .no nosso exemplo é descartado, ignorado pois não há nada a esquerda desta atribuição. Em C e C++ existe um problema grave que é frequentemente uma cilada para os programadores Pascal e outros. O problema é que nessas duas linguagens (C e C++) não existe o tipo boolean, no lugar deste tipo é usado o tipo int (inteiro), onde 1 significa verdadeiro e 0 falso. Assim em C e C++ (mas não em Java) a==a tem valor 1 com o significado dado pelo programador de true ou verdadeiro, mas a=1+0; também tem como resultado o valor 1, mas agora com o significado inteiro, numérico. O compilador não sabe distinguir entre os significados numérico e booleano. Essa ambiguidade faz com que programadores (C ou C++) não acostumados com esta convenção de operadores = e ==, incorram no erro de escrever j=1 quando na verdade queriam dizer j==1, mas para o compilador ambas as expressões tem valor inteiro de modo que se esse engano ocorrer num teste de parada de um loop, pode ocorrer que ele nunca pare, pois 1 tem o mesmo valor de true. Java elimina este tipo de erro introduzindo o tipo boolean com os valores true e false, que não tem nenhuma relação com o tipo int e qualquer outros tipos.

Tipos básicos E CONSTANTES OU VALORES LITERAIS (para nossa sorte os tipos básicos são os mesmos para qualquer ambiente de programação Java, porque a linguagem é portável):

char Caractere UNICODE 16-bit

float a; a=(float)3.14159265; //a recebe PI Ou então usar uma terminação em f para indicar que o número deve ser representado como float: float a=3.14159265f //ou F maiusculo Expoentes podem ser escritos usando o caracter e ou E: 6,02E23 ou 1.380658e-23. Onde e-1, significa multiplicado por dez elevado a menos 1 ou *0.1. O separador de casas decimais é o ponto. Apesar de todas estas regras para uso de valores literais, quando dois números de tipo diferentes como double e int são usados em um calculo do lado direito de uma atribuição, você não precisa fazer o type cast desses valores. O compilador promove o número do tipo mais fraco para o tipo mais forte antes de fazer o calculo. Você pode desejar fazer o type cast do resultado, para atribuir a uma variável long por exemplo.

Exercícios:

1- Repita o mesmo exemplo só que agora mova o círculo alterando as componentes x e y. Coloque o círculo na posição (1.0,1.0), através de atribuições do tipo acirc.x=1.0;. Acompanhe todas as modificações do objeto imprimindo seus atributos na tela.

2- Simplifique o programa anterior retirando o atributo raio. Você pode dar o nome de Ponto ou Ponto_geometrico para esta classe. Não se esqueça de compilar, use o compilador como ferramenta para verificar se você aprendeu corretamente a sintaxe da linguagem.

3 - Reescreva a classe Circulo para trabalhar com atributos do tipo int.

ATRIBUTOS E MÉTODOS

Os métodos determinam o comportamento dos objetos de um classe. Quando um método é invocado, se diz que o objeto está recebendo uma mensagem (para executar uma ação). Programas complexos formam conjuntos de objetos que trocam mensagens entre si gerenciando inclusive os recursos do sistema. O programa a seguir exemplifica chamadas de métodos, para tal define um objeto que serve como contador, a implementação representa a contagem no atributo num que é um número inteiro. Os métodos são simples: incrementa adiciona um ao contador em qualquer estado e comeca inicializa a contagem em zero. Decrementa faz o oposto de incrementa.

//Classe Contador, arquivo Contador.Java

public class Contador {

public int num; //este é o atributo //numero do contador

public void incrementa() //incrementa contador { num=num+1; //acesso ao atributo }

public void decrementa() //decrementa contador { num=num-1; }

public void comeca(int n) //comeca a contar { num=n; }

//Classe principal, Arquivo Princ.Java

public class Principal {

public static void main(String args[]) { Contador umcont; //declaracao de atributo contador

umcont=new Contador(); //alocacao

umcont.comeca(0); System.out.println(umcont.num);

umcont.incrementa(); System.out.println(umcont.num); }

}

Exercícios:

1- Defina um método chamado mostra para a classe contador. Este método deve imprimir o estado do contador na tela. A implementação deste método depende de onde você está imprimindo o estado do contador? Pense em programas de interfaces gráficas e de linha de comando.

2- Crie uma classe contador cíclico, exemplo o contador de minutos de relógios digitais: 0,1,2,...,57,58,59,0,1,2,.... A operação modulo ou resto da divisão inteira, tem sintaxe semelhante a de C++: a % b==a-((int)a/b)*b. Não tente usar a estrutura de decisão if ainda.

Máquinas de estados: