Herbert ScHildt
|
dale Skrien
Programação com
Java
Com uma abordagem clara e lógica, Programação com Java apresenta desde os aspectos básicos da linguagem até o conteúdo mais avançado. Os tópicos
específicos – como o projeto orientado a objetos e a programação da GUI com Swing – são introduzidos apenas no momento apropriado. Códigos comentados e inúmeros exemplos e exercícios esclarecem a finalidade e o uso dos elementos dos programas e testam a compreensão do conteúdo pelo leitor. Atualizado para Java 7 (JDK 7).
PROGRAMAÇÃO destaques
- Verificação do progresso e outros exercícios reforçam conteúdos básicos e fornecem feedback imediato sobre o aprendizado de conceitos-chave. - As seções Pergunte ao especialista fornecem informações adicionais ou comentários interessantes relacionados ao tópico em questão.
- As seções tente isto fornecem exemplos passo a passo que mostram os principais tópicos da programação em ação.
Progr
amação com
Java
H
ildt
|
Skrien
A Bookman Editora é parte do Grupo A, uma empresa que engloba diversos selos editoriais e várias plataformas de distribuição de conteúdo técnico, científico e profissional, disponibilizando-o como, onde e quando você precisar. O Grupo A publica com exclusividade
obras com o selo McGraw-Hill Education em língua portuguesa.
Progr
amação com
Java
Sc
H
ildt
|
Skrien
Uma introd
U
ção abrangente
com
Java
Programação
Herbert ScHildt
|
dale Skrien
Uma introdUção abrangente
Uma introdUção abrangente
conHeça também
ARNOLD, K.; GOSLING, J; HOLMES, D. A Linguagem de Programação Java, 4ª edição GALUPPO, F.; MATHEUS, V.; SANTOS, W. Desenvolvendo com C#GOODRICH, M.T.; TAMASSIA, R.
Estruturas de Dados e Algoritmos em Java, 5ª edição HORSTMANN, C.
Conceitos de Computação com o Essencial de C++, 3ª edição Conceitos de Computação com o Essencial de Java, 3ª edição Conceitos de Computação com Java, 5ª edição
Padrões e Projeto Orientados a Objetos, 2ª edição HUBBARD, J.R.
Programação em C++, 2ª edição (Coleção Schaum) Programação com Java, 2ª edição (Coleção Schaum) LIPPMAN, S.B. C# – Um guia prático MEYERS, S. C++ Eficaz PINHEIRO, F.A.C. Elementos de Programação em C SCHILDT, H.
Java para iniciantes ScHildt, H.; Skrien, d.
Programação com Java – Uma introdução abrangente SEBESTA, R.W.
Conceitos de Linguagens de Programação, 9ª edição STROUSTRUP, B.
Princípios e Práticas de Programação com C++ TUCKER, A.; NOONAN, R.
Linguagens de Programação – Princípios e paradigmas, 2ª edição
ÁREA DO PROFESSOR
Acesse a página do livro em www.grupoa.com.br para fazer download de conteúdo exclusivo (em inglês).
Acesse a página do livro em www.grupoa.com.br para fazer download dos códigos-fonte.
Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 S334p Schildt, Herbert.
Programação com Java [recurso eletrônico] : uma introdução abrangente / Herbert Schildt, Dale Skrien ; tradução: Aldir José Coelho Corrêa da Silva ; revisão técnica: Maria Lúcia Blanck Lisbôa. – Dados eletrônicos. – Porto Alegre : AMGH, 2013.
Editado também como livro impresso em 2013. ISBN 978-85-8055-268-3
1. Ciência da computação. 2. Linguagem de programação – Java. I. Skrien, Dale. II. Título.
CDU 004.438Java
Os autores
Herbert Schildt escreve sobre programação desde 1984 e é autor de vários livros
sobre Java, C++, C e C#. Seus livros de programação venderam milhões de cópias no mundo inteiro e foram traduzidos para muitos idiomas. Embora tenha interesse em todas as áreas da computação, seu foco principal são as linguagens de computador, inclusive a padronização de linguagens. Schildt tem graduação e pós-graduação pela University of Illinois, Urbana/Champaign. Ele forneceu os esboços iniciais da maio-ria dos capítulos deste livro.
Dale Skrien ensina matemática e ciência da computação no Colby College desde
1980 e ensina Java desde 1996. Seu interesse em ensinar os alunos não só a como programar, mas a como programar bem, levou-o à publicação de seu livro
Object--Oriented Design Using Java, da McGraw-Hill. Ele é graduado pelo St. Olaf College e pós-graduado pela University of Illinois e pela University of Washington, insti-tuição onde também obteve o diploma de PhD. Além das contribuições que fez no decorrer do livro, forneceu o Capítulo 16, que introduz o projeto orientado a objetos. Também forneceu os complementos online deste livro.
Tradução:
Aldir José Coelho Corrêa da Silva
Revisão técnica:
Maria Lúcia Blanck Lisbôa
Doutora em Ciência da Computação pela UFRGS Professora do Instituto de Informática da UFRGS
2013 Versão impressa desta obra: 2013
Reservados todos os direitos de publicação, em língua portuguesa, à
AMGH EDITORA LTDA., uma parceria entre GRUPO A EDUCAÇÃO S.A. e McGRAW-HILL EDUCATION
Av. Jerônimo de Ornelas, 670 – Santana 90040-340 – Porto Alegre – RS
Fone: (51) 3027-7000 Fax: (51) 3027-7070
É proibida a duplicação ou reprodução deste volume, no todo ou em parte, sob quaisquer formas ou por quaisquer meios (eletrônico, mecânico, gravação, fotocópia, distribuição na Web e outros), sem permissão expressa da Editora.
Unidade São Paulo
Av. Embaixador Macedo Soares, 10.735 – Pavilhão 5 – Cond. Espace Center Vila Anastácio – 05095-035 – São Paulo – SP
Fone: (11) 3665-1100 Fax: (11) 3667-1333
SAC 0800 703-3444 – www.grupoa.com.br
IMPRESSO NO BRASIL PRINTED IN BRAZIL
ISBN 0-07-802207-X / 978-0-07-802207-4
Edição original copyright ©2012, The McGraw-Hill Companies,Inc., Nova York, Nova York 10020. Todos os direitos reservados.
Tradução para língua portuguesa copyright © 2013, AMGH Editora Ltda., uma empresa do Grupo A Educação S.A. Todos os direitos reservados.
Gerente Editorial: Arysinha Jacques Affonso
Colaboraram nesta edição:
Editora: Mariana Belloli
Capa: Maurício Pamplona
Leitura final: Fernanda Vier
Prefácio
Este livro ensina os fundamentos da programação via linguagem Java. Ele não exige experiência anterior em programação e começa com os aspectos básicos – por exem-plo, como compilar e executar um programa Java. Em seguida, discute as palavras--chave, operadores e estruturas que formam a linguagem. O livro também aborda vá-rias partes da biblioteca Java Application Programming Interfaces (APIs), inclusive o Swing, que é a estrutura usada para criar programas que têm uma interface gráfica de usuário (GUI, graphic user interface), e o Collections Framework, que é usado para armazenar coleções de objetos. Resumindo, ele foi planejado como uma introdução abrangente à linguagem Java. Como a maioria das linguagens de computador, Java evoluiu com o tempo. Quando este texto foi escrito, a versão mais recente era Java 7 (JDK 7), e essa é a versão abordada aqui. No entanto, grande parte do material tam-bém é aplicável a outras versões recentes, como a versão 6.
UMA ABORDAGEM ENCADEADA
O livro usa o que consideramos uma abordagem “encadeada”. Com esse termo que-remos dizer que os tópicos são introduzidos em uma sequência coesa projetada para manter o foco de cada discussão no tópico em questão. Essa abordagem simplifica e otimiza a apresentação. Em ocasiões em que um desvio do fluxo principal da apre-sentação foi necessário, tentamos fazer isso de uma maneira que minimizasse a inter-rupção. O objetivo de nossa abordagem é apresentar a linguagem Java de uma forma que mostre claramente o relacionamento entre suas partes, e não como uma mistura de recursos desconectados.
Para facilitar o gerenciamento do material, este livro foi organizado em três partes. A Parte I descreve os elementos que definem a linguagem Java e os elemen-tos básicos da programação. Ela começa com uma visão geral de Java seguida pelos conceitos básicos dos tipos de dados, operadores e instruções de controle. Em se-guida, introduz progressivamente os recursos mais sofisticados da linguagem, como as classes, os métodos, a herança, as interfaces, os pacotes, as exceções, o uso de várias threads e os tipos genéricos. A Parte I também descreve o I/O (input/output, ou entrada/saída), porque ele faz parte de muitos programas Java, e os aspectos básicos dos applets, porque o applet é um aplicativo Java fundamental. Ela termina com um capítulo sobre o projeto orientado a objetos.
No que diz respeito à Parte I, nossa abordagem “encadeada” mantém o foco nos elementos da linguagem Java e nos fundamentos da programação, com cada nova seção se baseando no que veio antes. Sempre que possível, evitamos divagações que se afastem do tópico principal. Por exemplo, a programação de GUIs com o Swing é abordada na Parte II, em vez de ser intercalada com discussões dos conceitos básicos. Assim, man-tivemos a Parte I firmemente fixada nas questões da linguagem Java e da programação.
A Parte II introduz o Swing. Ela começa com uma visão geral da programação de GUIs com o Swing, incluindo os conceitos básicos de componentes, eventos e gerenciadores de leiaute. Os capítulos subsequentes avançam de maneira ordenada, apresentando uma visão geral dos diversos componentes do Swing, seguida pelos menus, caixas de diálogo, geração de componentes e assim por diante. Essa aborda-gem “encadeada” tem como objetivo ajudar os alunos a integrar mais facilmente cada novo recurso ao quadro geral que estão formando da estrutura do Swing.
A Parte III examina fragmentos da biblioteca de APIs Java. Como a biblioteca de APIs é muito extensa, não é possível discuti-la em sua totalidade neste livro. Em vez disso, nós nos concentramos nas partes da biblioteca que qualquer programa-dor Java deve conhecer. Além de abordar grandes parcelas dos pacotes java.long e java.util (com ênfase especial no Collections Framework), também apresentamos uma visão geral sobre redes e introduzimos a API de concorrência, o que inclui o Framework Fork/Join. O material é apresentado de maneira encadeada, planejada para dar ao aluno uma visão geral sólida dos diversos elementos básicos da biblioteca.
OBJETOS LOGO, MAS NÃO TANTO
Uma das primeiras perguntas que normalmente são feitas sobre um livro de progra-mação é se ele usa uma abordagem de apresentação dos objetos “mais cedo” ou “mais tarde” para ensinar os princípios-chave da programação orientada a objetos. Claro que “mais cedo” ou “mais tarde” pode ser um pouco subjetivo, e nenhum dos dois ter-mos descreve precisamente a organização deste livro. A expressão que usater-mos para caracterizar nossa abordagem é “logo, mas não tanto”. Nosso objetivo é introduzir os objetos no momento apropriado para o aluno. Achamos que isso só deve ocorrer após o aprendizado dos principais recursos da linguagem.
Para atingirmos esse objetivo, os três primeiros capítulos se concentram nos fundamentos da linguagem Java, como sintaxe, tipos de dados, operadores e instru-ções de controle. Acreditamos que dominar esses elementos é uma primeira etapa necessária porque eles formam a base da linguagem e a base da programação em geral. (Em outras palavras, é difícil criar programas coerentes sem entender esses elementos.) Em nossa opinião, só depois de aprender os elementos básicos de um programa é que o aluno está pronto para passar para os objetos.
Após a apresentação dos aspectos básicos, os objetos são introduzidos no Ca-pítulo 4, e daí em diante, os recursos, técnicas e conceitos orientados a objetos são integrados nos capítulos restantes. Além disso, os objetos são introduzidos em um ritmo moderado, passo a passo. O objetivo é ajudar o aluno a trazer cada novo recurso para o contexto, sem ficar sobrecarregado.
RECURSOS PEDAGÓGICOS
Este livro inclui vários recursos pedagógicos para facilitar e reforçar o aprendizado. Os recursos permitem que os alunos conheçam as habilidades básicas, avaliem seu progresso e verifiquem se todos os conceitos foram aprendidos.
䊏 Principais habilidades e conceitos: cada capítulo começa com uma lista das principais habilidades e conceitos apresentados nele.
䊏 Pergunte ao especialista: em vários pontos no decorrer do livro encontram-se caixas Pergunte ao especialista. Essas caixas contêm informações adicionais ou comentários interessantes sobre um tópico e usam um formato de pergunta/ resposta. Elas fornecem informações complementares sem romper o fluxo prin-cipal da apresentação.
䊏 Tente isto: cada capítulo contém uma ou mais seções Tente isto. São exemplos passo a passo percorrendo o desenvolvimento de um programa que demonstra um aspecto de Java relacionado ao tópico do capítulo. Normalmente, são exem-plos mais longos que mostram um recurso em um contexto mais prático.
䊏 Verificação do progresso: no decorrer de cada capítulo, verificações do progres-so são apresentadas para testar a compreensão da seção anterior. As respostas a essas perguntas ficam na parte inferior da mesma página.
䊏 Exercícios: todos os capítulos terminam com exercícios contendo questões di-retas, de preenchimento de lacunas ou de “verdadeiro/falso”, além de exercícios de codificação. As respostas dos exercícios encontram-se no Apêndice C.
RECOMENDAÇÕES DA ACM
A atualização de 2008 do ACM (Association for Computing Machinery) Curricula Recommendations (http://www.acm.org/education/curricula/ComputerScience2008. pdf) recomenda que todos os alunos de ciência da computação sejam fluentes em pelo menos uma linguagem de programação e tenham algum conhecimento em pro-gramação orientada a objetos e dirigida por eventos. Acreditamos que os alunos que aprenderem o conteúdo abordado neste livro terão os conhecimentos e habilidades desejados. Incluímos no livro não apenas uma introdução à programação com o uso da linguagem Java, mas também uma abordagem mais ampla que abrange recursos avan-çados, a estrutura do Swing e partes extensas de vários pacotes importantes de API.
A primeira parte do livro aborda uma parcela significativa dos tópicos da área de conhecimento Fundamentos da Programação (PF, Programming Fundamentals) das recomendações da ACM (as principais exceções são as unidades de conhecimen-to FoundationsInformationSecurity e SecureProgramming). A primeira parte também inclui um capítulo sobre projeto orientado a objetos que aborda vários tópicos das unidades de conhecimento PL/ObjectOrientedProgramming e SE/SoftwareDesign. A segunda parte, que introduz a programação de GUIs com o Swing, aborda alguns dos tópicos da unidade de conhecimento HC/GUIProgramming. A terceira parte inclui, entre outros, tópicos relacionados à concorrência. Na verdade, dedicamos os
Capí-tulos 12 e 27 ao uso de várias threads e à concorrência porque acreditamos, como o ACM Curricula Recommendations discute, que a concorrência está se tornando cada vez mais relevante para a disciplina da ciência da computação.
RECURSOS ONLINE
Acesse o material complementar (em inglês) do livro no site do Grupo A:
䊏 Entre no site do Grupo A, em www.grupoa.com.br.
䊏 Clique em “Acesse ou crie a sua conta”.
䊏 Se você já tem cadastro no site, insira seu endereço de e-mail ou CPF e sua senha na área “Acesse sua conta”; se ainda não é cadastrado, cadastre-se preen-chendo o campo da área “Crie sua conta”.
䊏 Depois de acessar a sua conta, digite o título do livro ou o nome do autor no campo de busca do site e clique no botão “Buscar”.
䊏 Localize o livro entre as opções oferecidas e clique sobre a imagem de capa ou sobre o título para acessar a página do livro.
Na página do livro:
Os alunos podem acessar livremente todos os códigos-fonte dos programas apre-sentados no livro. Para fazer download dos códigos, basta clicar no link “Conteúdo Online”.
Os professores podem acessar conteúdo exclusivo (em inglês) clicando no link “Material para o Professor”. Esse conteúdo inclui:
䊏 Manual de soluções para os exercícios de fim de capítulo.
䊏 Notas do instrutor, incluindo sugestões curriculares e para o ensino de tópicos específicos.
䊏 Exercícios complementares, que podem ser utilizados na criação de questioná-rios e testes.
䊏 Apresentações em PowerPoint®, que servem como orientação para o ensino em sala de aula.
Sumário
PARTE I A LINGUAGEM JAVA 1 Capítulo 1 Fundamentos da programação Java 3 ASPECTOSBÁSICOSDACOMPUTAÇÃO 4
Os componentes de hardware de um computador 4 Bits, bytes e binário 6 O sistema operacional 6 O PROGRAMA 7
LINGUAGENSDEPROGRAMAÇÃO 8 A LINGUAGEM JAVA 9 Origem da linguagem Java 10 Contribuição da linguagem Java para a Internet 11 Applets Java 11 Segurança 12 Portabilidade 12 O segredo da linguagem Java: o bytecode 12 A evolução de Java 13 ASPRINCIPAISCARACTERÍSTICASDAPROGRAMAÇÃOORIENTADAAOBJETOS 14 Encapsulamento 15 Polimorfismo 16 Herança 16 O JAVA DEVELOPMENT KIT 17
UMPRIMEIROPROGRAMASIMPLES 18
Inserindo o programa 18 Compilando o programa 19 Executando o programa 19 Primeiro exemplo de programa linha a linha 19 TRATANDOERROSDESINTAXE 22
OUTROTIPODEDADO 25 DUASINSTRUÇÕESDECONTROLE 28
A instrução if 28 O laço for 30 CRIEBLOCOSDECÓDIGO 32
PONTOEVÍRGULAEPOSICIONAMENTO 33
PRÁTICASDERECUO 34 ASPALAVRAS-CHAVE JAVA 36 IDENTIFICADORESEM JAVA 37 ASBIBLIOTECASDECLASSES JAVA 38
EXERCÍCIOS 39
Capítulo 2 Introdução aos tipos de dados e operadores 42 PORQUEOSTIPOSDEDADOSSÃOIMPORTANTES 42
TIPOSPRIMITIVOSDALINGUAGEM JAVA 43
Inteiros 43 Tipos de ponto flutuante 45 Caracteres 46 O tipo booleano 47 LITERAIS 49
Literais hexadecimais, octais e binários 50 Sequências de escape de caracteres 51 Literais de strings 51 UMEXAMEMAISDETALHADODASVARIÁVEIS 52
Inicializando uma variável 53 Inicialização dinâmica 53 ESCOPOEOTEMPODEVIDADASVARIÁVEIS 54 OPERADORES 57
OPERADORESARITMÉTICOS 57
Incremento e decremento 58 OPERADORESRELACIONAISELÓGICOS 59
OPERADORESLÓGICOSDECURTO-CIRCUITO 61
O OPERADORDEATRIBUIÇÃO 63 ATRIBUIÇÕESABREVIADAS 63 CONVERSÃODETIPOSEMATRIBUIÇÕES 64 USANDOUMACOERÇÃO 65
PRECEDÊNCIADEOPERADORES 67
EXPRESSÕES 69
Conversão de tipos em expressões 69 Espaçamento e parênteses 71 EXERCÍCIOS 72
Capítulo 3 Instruções de controle de programa 75 CARACTERESDEENTRADADOTECLADO 76
A INSTRUÇÃO if 77 Ifs ANINHADOS 79 A ESCADA if-else-if 80 A INSTRUÇÃO switch 81
INSTRUÇÕES switch ANINHADAS 84
O LAÇO for 88
ALGUMASVARIAÇÕESDOLAÇO for 89
Partes ausentes 90 O laço infinito 91 Laços sem corpo 91 DECLARANDOVARIÁVEISDECONTROLEDELAÇODENTRODAINSTRUÇÃO for 92 O LAÇO for MELHORADO 93
O LAÇO while 93
O LAÇO do-while 95
USE break PARASAIRDEUMLAÇO 100
USE break COMOUMAFORMADE goto 102
USE continue 106 LAÇOSANINHADOS 111 EXERCÍCIOS 112 Capítulo 4 Introdução a classes, objetos e métodos 116 FUNDAMENTOSDASCLASSES 116
Forma geral de uma classe 117 Definindo uma classe 118 COMOOSOBJETOSSÃOCRIADOS 121
ASVARIÁVEISDEREFERÊNCIAEAATRIBUIÇÃO 121
MÉTODOS 123 Adicionando um método à classe Vehicle 123 RETORNANDODEUMMÉTODO 125 RETORNANDOUMVALOR 126
USANDOPARÂMETROS 128
Adicionando um método parametrizado a Vehicle 130 CONSTRUTORES 138
CONSTRUTORESPARAMETRIZADOS 139
Adicionando um construtor à classe Vehicle 140 O OPERADOR new REVISITADO 142 COLETADELIXOEFINALIZADORES 142 O método finalize( ) 143 A PALAVRA-CHAVE this 146
Capítulo 5 Mais tipos de dados e operadores 152 ARRAYS 152 Arrays unidimensionais 153 ARRAYSMULTIDIMENSIONAIS 158 Arrays bidimensionais 158 Arrays irregulares 159 Arrays de três ou mais dimensões 161 Inicializando arrays multidimensionais 161 SINTAXEALTERNATIVAPARAADECLARAÇÃODEARRAYS 163
ATRIBUINDOREFERÊNCIASDEARRAYS 163
USANDOOMEMBRO length 165 O LAÇO for DEESTILOFOR-EACH 173 Iterando por arrays multidimensionais 176 Aplicando o laço for melhorado 177 STRINGS 178
Construindo strings 178 Operando com strings 179 Arrays de strings 181 Strings não podem ser alterados 182 Usando um string para controlar uma instrução switch 183 USANDOARGUMENTOSDELINHADECOMANDO 184 OSOPERADORESBITWISE 186
Os operadores bitwise AND, OR, XOR e NOT 186 Os operadores de deslocamento 191 Atribuições abreviadas bitwise 193 O OPERADOR ? 197
EXERCÍCIOS 198 Capítulo 6 Verificação minuciosa dos métodos e classes 202 CONTROLANDOOACESSOAMEMBROSDECLASSES 202 Modificadores de acesso da linguagem Java 203 PASSEOBJETOSPARAOSMÉTODOS 208
COMOOSARGUMENTOSSÃOPASSADOS 209
RETORNANDOOBJETOS 212 SOBRECARGADEMÉTODOS 214 SOBRECARREGANDOCONSTRUTORES 219 RECURSÃO 225 ENTENDENDO static 229 Variáveis estáticas 230 Métodos estáticos 232 Blocos estáticos 233
INTRODUÇÃOÀSCLASSESANINHADASEINTERNAS 237 VARARGS: ARGUMENTOSEMQUANTIDADEVARIÁVEL 241
Aspectos básicos dos varargs 242 Sobrecarregando métodos varargs 244 Varargs e ambiguidade 246 EXERCÍCIOS 247
Capítulo 7 Herança 253 ASPECTOSBÁSICOSDEHERANÇA 253 ACESSOAMEMBROSEHERANÇA 256 CONSTRUTORESEHERANÇA 259 USANDO super PARACHAMARCONSTRUTORESDASUPERCLASSE 261
USANDO super PARAACESSARMEMBROSDASUPERCLASSE 265
CRIANDOUMAHIERARQUIADEVÁRIOSNÍVEIS 269
QUANDOOSCONSTRUTORESSÃOEXECUTADOS? 272
REFERÊNCIASDASUPERCLASSEEOBJETOSDASUBCLASSE 273
SOBREPOSIÇÃODEMÉTODOS 278 MÉTODOSSOBREPOSTOSDÃOSUPORTEAOPOLIMORFISMO 281 PORQUESOBREPORMÉTODOS? 283 Aplicando a sobreposição de métodos a TwoDShape 283 USANDOCLASSESABSTRATAS 287
USANDO final 292
A palavra-chave final impede a sobreposição 292 A palavra-chave final impede a herança 292 Usando final com membros de dados 293 A CLASSE Object 294 EXERCÍCIOS 295 Capítulo 8 Interfaces 298 ASPECTOSBÁSICOSDAINTERFACE 298
CRIANDOUMAINTERFACE 299
IMPLEMENTANDOUMAINTERFACE 300
USANDOREFERÊNCIASDEINTERFACES 304
IMPLEMENTANDOVÁRIASINTERFACES 306
CONSTANTESEMINTERFACES 314 INTERFACESPODEMSERESTENDIDAS 316 INTERFACESANINHADAS 317 CONSIDERAÇÕESFINAISSOBREASINTERFACES 318
Capítulo 9 Pacotes 321 ASPECTOSBÁSICOSDOSPACOTES 321
Definindo um pacote 322 Encontrando pacotes e CLASSPATH 323 Exemplo breve de pacote 323 PACOTESEOACESSOAMEMBROS 325
Exemplo de acesso a pacote 326 Entendendo os membros protegidos 328 IMPORTANDOPACOTES 330
Importando pacotes Java padrão 331 IMPORTAÇÃOESTÁTICA 335 EXERCÍCIOS 338 Capítulo 10 Tratamento de exceções 341 HIERARQUIADEEXCEÇÕES 342 FUNDAMENTOSDOTRATAMENTODEEXCEÇÕES 342
Usando try e catch 343 Exemplo de exceção simples 343 CONSEQUÊNCIASDEUMAEXCEÇÃONÃOCAPTURADA 346
EXCEÇÕESPERMITEMQUEVOCÊTRATEERROSNORMALMENTE 347
USANDOVÁRIASCLÁUSULASCATCH 349 CAPTURANDOEXCEÇÕESDESUBCLASSES 350 BLOCOS try PODEMSERANINHADOS 351 LANÇANDOUMAEXCEÇÃO 353
Relançando uma exceção 354 EXAMEMAISDETALHADODE Throwable 355
USANDO finally 357
USANDO throws 359
EXCEÇÕESINTERNASDALINGUAGEM JAVA 360 NOVOSRECURSOSDEEXCEÇÕESADICIONADOSPELO JDK7 363 CRIANDOSUBCLASSESDEEXCEÇÕES 364 EXERCÍCIOS 371
Capítulo 11 Usando I/O 376 I/O JAVAÉBASEADOEMFLUXOS 377
FLUXOSDEBYTESEFLUXOSDECARACTERES 377
CLASSESDEFLUXOSDEBYTES 377
CLASSESDEFLUXOSDECARACTERES 378 FLUXOSPREDEFINIDOS 379 USANDOOSFLUXOSDEBYTES 380
Lendo a entrada do console 381 Gravando a saída no console 382 LENDOEGRAVANDOARQUIVOSUSANDOFLUXOSDEBYTES 383
Obtendo entradas de um arquivo 384 Gravando em um arquivo 387 FECHANDOAUTOMATICAMENTEUMARQUIVO 389
LENDOEGRAVANDODADOSBINÁRIOS 392 ARQUIVOSDEACESSOALEATÓRIO 397 USANDOOSFLUXOSBASEADOSEMCARACTERESDALINGUAGEM JAVA 400 Entrada do console com o uso de fluxos de caracteres 400 Saída no console com o uso de fluxos de caracteres 404 I/O DEARQUIVOCOMOUSODEFLUXOSDECARACTERES 405
Usando um FileWriter 405 Usando um FileReader 406 File 408 Obtendo as propriedades de um arquivo 408 Obtendo uma listagem de diretório 410 Usando FilenameFilter 411 A alternativa listFiles( ) 412 Vários métodos utilitários de File 412 USANDOOSENCAPSULADORESDETIPOSDALINGUAGEM JAVA
PARACONVERTERSTRINGSNUMÉRICOS 414
EXERCÍCIOS 423
Capítulo 12 Programação com várias threads 428 FUNDAMENTOSDOUSODEVÁRIASTHREADS 428 A CLASSE Thread EAINTERFACE Runnable 429 CRIANDOUMATHREAD 430 Algumas melhorias simples 433 CRIANDOVÁRIASTHREADS 438
DETERMINANDOQUANDOUMATHREADTERMINA 440
PRIORIDADESDASTHREADS 443
SINCRONIZAÇÃO 444
USANDOMÉTODOSSINCRONIZADOS 445 A INSTRUÇÃO synchronized 448 COMUNICAÇÃOENTRETHREADSCOMOUSODE notify( ), wait( ) E notifyAll( ) 451 Exemplo que usa wait( ) e notify( ) 451 SUSPENDENDO, RETOMANDOEENCERRANDOTHREADS 457
Capítulo 13 Enumerações, autoboxing e anotações 467 ENUMERAÇÕES 467
Fundamentos da enumeração 468 ASENUMERAÇÕES JAVASÃOTIPOSDECLASSE 471 MÉTODOS values( ) E valueOf( ) 471 CONSTRUTORES, MÉTODOS, VARIÁVEISDEINSTÂNCIAEENUMERAÇÕES 472
Duas restrições importantes 474 ENUMERAÇÕESHERDAM Enum 474
AUTOBOXING 482
Encapsuladores de tipos 482 Fundamentos do autoboxing 484 Autoboxing e os métodos 485 Autoboxing/unboxing ocorre em expressões 486 Advertência 488 ANOTAÇÕES (METADADOS) 489
Criando e usando uma anotação 489 Anotações internas 490 EXERCÍCIOS 492
Capítulo 14 Tipos genéricos 496 FUNDAMENTOSDOSTIPOSGENÉRICOS 497 Exemplo simples de genérico 497 Genéricos só funcionam com objetos 501 Tipos genéricos diferem de acordo com seus argumentos de tipo 501 Classe genérica com dois parâmetros de tipo 501 A forma geral de uma classe genérica 503 TIPOSLIMITADOS 504
USANDOARGUMENTOSCURINGAS 507
CURINGASLIMITADOS 510 MÉTODOSGENÉRICOS 513 CONSTRUTORESGENÉRICOS 515 HIERARQUIASDECLASSESGENÉRICAS 516
INTERFACESGENÉRICAS 519
TIPOSBRUTOSECÓDIGOLEGADO 526
INFERÊNCIADETIPOSCOMOOPERADORLOSANGO 529
ERASURE 531
ERROSDEAMBIGUIDADE 531 ALGUMASRESTRIÇÕESDOSGENÉRICOS 532 Parâmetros de tipos não podem ser instanciados 532 Restrições aos membros estáticos 533 Restrições aos arrays genéricos 533
Restrições a exceções genéricas 534 EXERCÍCIOS 534
Capítulo 15 Applets e as outras palavras-chave Java 539 ASPECTOSBÁSICOSDOSAPPLETS 539
ESQUELETODEAPPLETCOMPLETO 543
INICIALIZAÇÃOEENCERRAMENTODOAPPLET 544
ASPECTO-CHAVEDAARQUITETURADEUMAPPLET 544
SOLICITANDOATUALIZAÇÃO 545 USANDOAJANELADESTATUS 550 PASSANDOPARÂMETROSPARAAPPLETS 551 ASOUTRASPALAVRAS-CHAVE JAVA 553
Modificador volatile 554 Modificador transient 554 instanceof 554 strictfp 554 assert 555 Métodos nativos 555 EXERCÍCIOS 557 Capítulo 16 Introdução ao projeto orientado a objetos 559 UMSOFTWAREELEGANTEEPORQUEISSOIMPORTA 560
Propriedades de um software elegante 561 MÉTODOSELEGANTES 563
Convenções de nomenclatura 563 Coesão dos métodos 564 Objetos bem-formados 566 Documentação interna 567 Documentação externa 568 CLASSESELEGANTES 571
A coesão das classes e o padrão Expert 571 Evitando duplicação 573 Interface completa 575 Projete pensando em mudanças 576 Lei de Demeter 579 HERANÇAVERSUSDELEGAÇÃO 581 Diagramas de classes UML 581 Possibilidade de reutilização do código 584 O relacionamento É-um 585 Comportamento semelhante 587 Polimorfismo 590
Custos da herança 590 PADRÕESDEPROJETO 593
Padrão Adapter 594 Padrão Observer 597 EXERCÍCIOS 602
PARTE II INTRODUÇÃO À PROGRAMAÇÃO DE GUIs COM SWING 607 Capítulo 17 Aspectos básicos de Swing 609 ORIGENSEFILOSOFIADEPROJETODE SWING 610
COMPONENTESECONTÊINERES 612
Componentes 612 Contêineres 613 Painéis do contêiner de nível superior 613 GERENCIADORESDELEIAUTE 614 PRIMEIROPROGRAMA SWINGSIMPLES 615 Primeiro exemplo de Swing linha a linha 617 TRATAMENTODEEVENTOS 621
Eventos 621 Fontes de eventos 621 Ouvintes de eventos 622 Classes de eventos e interfaces de ouvintes 622 Classes adaptadoras 624 USANDOUMBOTÃODEAÇÃO 625 INTRODUÇÃOAO JTextField 633
USECLASSESINTERNASANÔNIMASPARATRATAREVENTOS 645
EXERCÍCIOS 646
Capítulo 18 Examinando os controles de Swing 649 JLabel E ImageIcon 650
OSBOTÕESDE SWING 653
Tratando eventos de ação 654 Tratando eventos de item 654 JButton 655 JToggleButton 658 Caixas de seleção 660 Botões de rádio 662 JTextField 665 JScrollPane 675 JList 682 JComboBox 686
ÁRVORES 689 JTable 693 UMAEXPLICAÇÃORÁPIDADOSMODELOS 696
EXERCÍCIOS 697
Capítulo 19 Trabalhando com menus 700 ASPECTOSBÁSICOSDOSMENUS 700
UMAVISÃOGERALDE JMenuBar, JMenu E JMenuItem 702
JMenuBar 702 JMenu 703 JMenuItem 704 CRIEUMMENUPRINCIPAL 704
ADICIONEMNEMÔNICOSEACELERADORESAOSITENSDEMENU 709
ADICIONEIMAGENSEDICASDEFERRAMENTASAOSITENSDEMENU 712
USE JRadioButtonMenuItem E JCheckBoxMenuItem 720
EXERCÍCIOS 722
Capítulo 20 Caixas de diálogo 725 JOptionPane 726 showMessageDialog( ) 728 showConfirmDialog( ) 732 showInputDialog( ) 736 showOptionDialog( ) 741 JDialog 746 CRIEUMACAIXADEDIÁLOGONÃOMODAL 750
SELECIONEARQUIVOSCOM JFileChooser 751
EXERCÍCIOS 762 Capítulo 21 Threads, applets e geração de componentes 766 O USODEVÁRIASTHREADSEM SWING 766 USE Timer 773 CRIEAPPLETS SWING 779
Um applet Swing simples 780 GERANDOCOMPONENTES 787
Fundamentos da geração de componentes 787 O contexto gráfico 788 Calcule a área de desenho 789 Solicite a geração do componente 789 Um exemplo de geração de componente 789 EXERCÍCIOS 795
PARTE III EXAMINANDO A BIBLIOTECA DE APIs JAVA 797 Capítulo 22 Manipulação de strings 799 ASPECTOSBÁSICOSDOSSTRINGS 799 OSCONSTRUTORESDE STRING 800 TRÊSRECURSOSDALINGUAGEMRELACIONADOSASTRINGS 802
Literais de strings 803 Concatenação de strings 803 Concatenação de strings com outros tipos de dados 803 Sobrepondo toString( ) 804 O MÉTODO length( ) 809 OBTENDOOSCARACTERESDEUMSTRING 809 charAt( ) 810 getChars( ) 810 toCharArray( ) 811 COMPARAÇÃODESTRINGS 812 equals( ) e equalsIgnoreCase( ) 812 equals( ) versus == 813 regionMatches( ) 814 startsWith( ) e endsWith( ) 814 compareTo( ) e compareToIgnoreCase( ) 815 USANDO indexOf( ) E lastIndexOf( ) 817
OBTENDOUMSTRINGMODIFICADO 819
substring( ) 819 replace( ) 820
trim( ) 821
ALTERANDOACAIXADOSCARACTERESDEUMSTRING 822 StringBuffer E StringBuilder 825 EXERCÍCIOS 825
Capítulo 23 Examinando o pacote java.lang 828 ENCAPSULADORESDETIPOSPRIMITIVOS 829
Number 829 Double e Float 830 Byte, Short, Integer e Long 831 Character 834 Boolean 837 O autoboxing e os encapsuladores de tipos 837 A CLASSE Math 838
A CLASSE Process 842
A CLASSE ProcessBuilder 842
A CLASSE Runtime 844
Usando currentTimeMillis( ) para marcar o tempo de execução do programa 847 Usando arraycopy( ) 848 Obtendo valores de propriedades 849 Redirecionando fluxos de I/O padrão 849 A CLASSE Object 851
A CLASSE Class 851
A CLASSE Enum 853 CLASSESRELACIONADASATHREADSEAINTERFACE Runnable 853 OUTRASCLASSES 854 ASINTERFACESDE java.lang 854 A interface Comparable 855 A interface Appendable 857 A interface Iterable 857 A interface Readable 858 A interface CharSequence 858 A interface AutoCloseable 859 EXERCÍCIOS 860 Capítulo 24 Examinando o pacote java.util 862 A CLASSE Locale 864
TRABALHANDOCOMDATAEHORA 867
Date 867 Calendar e GregorianCalendar 868 FORMATANDOASAÍDACOM Formatter 873
Os construtores de Formatter 873 Aspectos básicos da formatação 874 Formatando strings e caracteres 877 Formatando números 877 Formatando data e hora 878 Os especificadores %n e %% 880 Especificando uma largura de campo mínima 880 Especificando precisão 881 Usando os flags de formatação 882 A opção de uso de maiúsculas 884 Usando um índice de argumento 885 Formatação para um local diferente 886 Fechando um Formatter 887 A FORMATAÇÃOEOMÉTODO printf( ) 890
A CLASSE Scanner 892
Os construtores de Scanner 892 Aspectos básicos da varredura 892 Alguns exemplos com Scanner 894
Mais alguns recursos de Scanner 899 A CLASSE Random 900
USE Observable E Observer 901
ASCLASSES Timer E TimerTask 905
CLASSESEINTERFACESUTILITÁRIASVARIADAS 907
EXERCÍCIOS 908
Capítulo 25 Usando as estruturas de dados
do Collections Framework 911
VISÃOGERALDASESTRUTURASDEDADOS 912
Pilhas e filas 912 Listas encadeadas 913 Árvores 914 Tabelas hash 915 Selecionando uma estrutura de dados 915 VISÃOGERALDASCOLEÇÕES 916
ASINTERFACESDECOLEÇÕES 917 A interface Collection 918 A interface List 920 A interface Set 920 A interface SortedSet 920 A interface NavigableSet 922 A interface Queue 922 A interface Deque 924 ASCLASSESDECOLEÇÕES 926 A classe ArrayList 927 A classe LinkedList 930 A classe HashSet 934 A classe TreeSet 936 A classe LinkedHashSet 938 A classe ArrayDeque 939 A classe PriorityQueue 941 ACESSANDOUMACOLEÇÃOCOMUMITERADOR 942
Usando um iterador 942 A alternativa aos iteradores com o uso de for-each 946 TRABALHANDOCOMMAPAS 946 As interfaces de mapas 946 A interface Map 947 A interface SortedMap 947 A interface NavigableMap 948 A interface Map.Entry 949 As classes de mapas 951
A classe HashMap 952 A classe TreeMap 953 A classe LinkedHashMap 955 COMPARADORES 956 OSALGORITMOSDECOLEÇÕES 959 A CLASSE Arrays 962
ASCLASSESEINTERFACESLEGADAS 963 A interface Enumeration 963 Vector 963 Stack 963 Dictionary 963 Hashtable 963 Properties 964 EXERCÍCIOS 964
Capítulo 26 Redes com java.net 967 ASPECTOSBÁSICOSDEREDES 967 ASCLASSESEINTERFACESDEREDES 968 A CLASSE InetAddress 969 A CLASSE Socket 971 A CLASSE URL 975 A CLASSE URLConnection 977 A CLASSE HttpURLConnection 982 DATAGRAMAS 984 DatagramSocket 985 DatagramPacket 985 Um exemplo de datagrama 986 EXERCÍCIOS 989 Capítulo 27 Os utilitários de concorrência 991 OSPACOTESDA API DECONCORRÊNCIA 992
java.util.concurrent 992 java.util.concurrent.atomic 993 java.util.concurrent.locks 993 USANDOOBJETOSDESINCRONIZAÇÃO 994
Semaphore 994 CountDownLatch 997 CyclicBarrier 1000 Exchanger 1002 Phaser 1005 USANDOUMEXECUTOR 1012
USANDO Callable E Future 1015 A ENUMERAÇÃO TimeUnit 1018
ASCOLEÇÕESDECONCORRÊNCIA 1020
BLOQUEIOS 1020
OPERAÇÕESATÔMICAS 1023
PROGRAMAÇÃOPARALELACOMO FRAMEWORK FORK/JOIN 1024
ASPRINCIPAISCLASSESDO FRAMEWORK FORK/JOIN 1025 ForkJoinTask<V> 1025 RecursiveAction 1026 RecursiveTask<V> 1026 ForkJoinPool 1027 A ESTRATÉGIADEDIVIDIRECONQUISTAR 1028
Um primeiro exemplo simples do Framework Fork/Join 1029 Entendendo o impacto do nível de paralelismo 1031 Um exemplo que usa RecursiveTask<V> 1034 Executando uma tarefa de forma assíncrona 1036 OSUTILITÁRIOSDECONCORRÊNCIAVERSUSAABORDAGEMTRADICIONAL JAVA 1037 EXERCÍCIOS 1038
Apêndice A Usando comentários de documentação
da linguagem Java 1041 TAGSDE javadoc 1041 FORMAGERALDEUMCOMENTÁRIODEDOCUMENTAÇÃO 1045
O QUE javadoc GERA 1046
EXEMPLOQUEUSACOMENTÁRIOSDEDOCUMENTAÇÃO 1046
Apêndice B Introdução às expressões regulares 1049 A CLASSE Pattern 1049
A CLASSE Matcher 1050
ASPECTOSBÁSICOSDASINTAXEDASEXPRESSÕESREGULARES 1050 DEMONSTRANDOACORRESPONDÊNCIADEPADRÕES 1051 USANDOOCARACTERECURINGAEQUANTIFICADORES 1053 TRABALHANDOCOMCLASSESDECARACTERES 1055
USANDO replaceAll( ) 1055
A CONEXÃOCOMACLASSE String 1056
ASSUNTOSAEXPLORAR 1056
Apêndice C Respostas de exercícios selecionados 1057
A Parte I deste livro descreve os elementos que compõem a linguagem de progra-mação Java e as técnicas que seu uso requer. O Capítulo 1 começa apresentando vários conceitos básicos de programação, a história e a filosofia de projeto de Java e uma visão geral de alguns recursos importantes da linguagem. Os demais capítulos enfocam aspectos específicos de Java, capítulo a capítulo. A Parte I termina com a introdução a um aspecto importante de uma programação bem--sucedida em Java: o projeto orientado a objetos.
A linguagem Java
PRINCIPAIS HABILIDADES E CONCEITOS
䊏 Conhecer os componentes básicos do computador
䊏 Entender os bits, os bytes e o sistema de numeração binário
䊏 Conhecer as duas formas de um programa
䊏 Saber a história e a filosofia de Java
䊏 Entender os princípios básicos da programação orientada a objetos
䊏 Criar, compilar e executar um programa Java simples
䊏 Usar variáveis
䊏 Usar as instruções de controle if e for
䊏 Criar blocos de código
䊏 Entender como as instruções são posicionadas, recuadas e finalizadas
䊏 Saber as palavras-chave Java
䊏 Entender as regras dos identificadores Java
No intervalo de apenas algumas décadas, a programação deixou de ser uma disciplina obscura, praticada por poucos, para se tornar parte integrante do mundo moderno, praticada por muitos. A razão desse desenvolvimento é fácil de entender. Se o mundo moderno pudesse ser caracterizado por uma palavra, ela seria tecnologia. O que dá apoio a grande parte dessa tecnologia é o computador, e o que torna um computador útil são os programas que ele executa. Logo, em muitos aspectos, é a programação que torna possível o nosso mundo tecnológico. Ela é importante assim.
A finalidade deste livro é ensinar os fundamentos da programação usando a linguagem Java. Como disciplina, a programação é bem extensa. Além de envolver muitas habilidades, conceitos e técnicas, há várias especializações, como as que envolvem análise numérica, teoria da informação, rede e controle de dispositivos. Também há muitos ambientes de computação diferentes em que os programas são executados. No entanto, seja qual for o caso, dominar os fundamentos da programa-ção é necessário. O que você aprenderá neste curso formará a base de seus estudos.
1
Fundamentos da
programação Java
Este capítulo começa definindo vários termos-chave, examinando o conceito dos bits, dos bytes e do sistema de numeração binário e os componentes básicos do computador. Embora isso seja território familiar para muitos leitores, é um modo de assegurar que todos comecem com o conhecimento necessário. Em seguida, introdu-zimos a linguagem Java apresentando sua história, filosofia de design e vários de seus atributos mais importantes.
O capítulo discute então vários recursos básicos de Java. Uma das coisas mais difíceis quando aprendemos a programar é o fato de nenhum elemento de uma gem de computador existir isoladamente. Em vez disso, os componentes da lingua-gem estão relacionados e trabalham em conjunto. Nesse ponto, Java não é exceção. É difícil discutir um aspecto de Java sem envolver outros aspectos implicitamente. Para ajudar a resolver esse problema, este capítulo fornece uma breve visão geral de vários recursos Java, inclusive a forma geral de um programa Java, algumas instruções de controle básicas, uma amostra dos tipos de dados e os operadores. Ele não entra em muitos detalhes, concentrando-se nos conceitos gerais comuns a qualquer programa Java. Muitos desses recursos serão examinados com mais detalhes posteriormente no livro, mas essa introdução o ajudará a ver como partes essenciais de Java “se encai-xam”, e também permitirá que você comece a criar e executar programas Java.
ASPECTOS BÁSICOS DA COMPUTAÇÃO
Se você está estudando programação, é muito provável que já tenha pelo menos um conhecimento geral sobre computação. No entanto, as pessoas não têm necessariamente o mesmo conhecimento, ou esse conhecimento pode ser impreciso. Por isso, antes de introduzirmos a linguagem Java, uma visão geral de diversos conceitos básicos da com-putação será apresentada. No processo, vários termos-chave serão definidos.
Os componentes de hardware de um computador
Como o computador é que acabará executando os programas que você criar, é útil en-tender de uma maneira geral o que as partes de um computador fazem. Todos os com-putadores são compostos por um grupo de componentes que funcionam em conjunto para formar o computador em sua totalidade. Embora seja verdade que a forma exata do computador tenha evoluído com o tempo, todos os computadores ainda comparti-lham certos recursos-chave. Por exemplo, os mesmos elementos básicos contidos em um computador de mesa também são encontrados em um smartphone.
Para ser útil, um computador deve conter, no mínimo, o seguinte:
䊏 Uma Unidade Central de Processamento (CPU, Central Processing Unit)
䊏 Memória
䊏 Dispositivos de entrada/saída
Examinemos cada um desses itens, um por vez.
A CPU fornece os recursos computacionais primários do computador. Ela faz isso executando as instruções que compõem um programa. Todas as CPUs são proje-tadas para entender um conjunto de instruções específico. O conjunto de instruções define os diversos tipos de operações que a CPU pode executar. Por exemplo, a maio-ria das CPUs dá suporte a instruções que executam operações aritméticas básicas, carregam dados da e armazenam dados na memória, fazem comparações lógicas e
alteram o fluxo do programa, para citar apenas algumas. Além de poder acessar a memória, grande parte das CPUs contém um número limitado de registradores que fornecem armazenamento de dados rápido e de curto prazo.
As instruções que uma CPU processa, que costumam ser chamadas de
instru-ções de máquina, ou código de máquina, executam operainstru-ções muito pequenas. Por
exemplo, uma instrução pode mover um valor de um registrador para outro, mover um valor de um registrador para a memória ou comparar o conteúdo de dois registradores. Em geral, o conjunto de instruções de um tipo de CPU difere do de outro tipo. Por isso, normalmente um conjunto de instruções projetado para um tipo de CPU não pode ser usado em CPUs de outro tipo. Há famílias de CPUs com compatibilidade regressi-va, mas geralmente CPUs não relacionadas diferem em seus conjuntos de instruções.
As instruções de máquina não estão em uma forma que possa ser facilmente lida por uma pessoa. Elas são codificadas para uso do computador. É possível, no entanto, representar código de máquina em uma forma legível para humanos usan-do representações mnemônicas das instruções. Isso se chama linguagem simbólica (também conhecida como “linguagem de montagem” ou “linguagem assembly”). Por exemplo, a representação mnemônica de uma instrução que move dados de um lo-cal para outro poderia se chamar MOV. A instrução de comparação de dois valores poderia se chamar CMP. Uma linguagem simbólica é convertida por um programa chamado montador em uma forma que o computador pode executar. No entanto, pou-cas pessoas escrevem em linguagem simbólica hoje porque, geralmente, linguagens como Java fornecem uma alternativa bem melhor.
A memória do computador é usada para armazenar instruções (na forma de código de máquina) e dados. Seu objetivo principal é manter informações somente durante a execução de um programa. Não é para armazenamento de longo prazo. A memória é endereçável, ou seja, a CPU pode acessar um local específico na memória, dado seu endereço. Geralmente ela é chamada de RAM, que significa Random Access Memory.
Quando a CPU executa um programa, ela faz isso acessando uma instrução na memória e então executando a operação especificada por essa instrução. Em seguida, ela obtém a próxima instrução e a executa, e assim por diante. Por padrão, as instruções são obtidas em locais sequenciais da memória. No entanto, algumas instruções podem alterar esse fluxo, fazendo a execução “saltar” para um local di-ferente na memória.
Atualmente, há uma ampla variedade de dispositivos de entrada/saída (I/O, input/output), como teclados, monitores, o mouse, telas sensíveis ao toque, entrada de voz e saída de som. Todos têm a mesma função: dar ao computador uma maneira de receber ou transmitir informações. Com frequência, os dispositivos de I/O (imput/ output, ou entrada/saída) permitem que os humanos interajam com o computador. Contudo, em alguns casos, o computador usa o I/O para se comunicar com outro dispositivo, como um dispositivo de armazenamento, um adaptador de rede ou até mesmo uma interface de controle robótico.
Além dos três componentes básicos do computador que acabamos de descre-ver, muitos computadores também incluem dispositivos de armazenamento, como unidades de disco, DVDs e unidades flash. E muitos computadores estão em rede, via Internet ou uma rede local. Para dar suporte à rede, o computador precisa de um adaptador de rede.
Bits, bytes e binário
Nos dias de hoje, é raro encontrar alguém que não tenha ouvido falar nos termos
bits, bytes e binário. Eles fazem parte do vocabulário cotidiano. No entanto, já que
descrevem alguns dos aspectos mais básicos da computação, é importante que sejam formalmente definidos.
O sistema de numeração binário
No nível mais baixo, os computadores trabalham com 1s e 0s. Como resultado, um sistema de numeração baseado em 1s e 0s é necessário. Esse sistema de numeração se chama binário. O sistema binário funciona da mesma forma que nosso sistema de numeração decimal comum, exceto pelo significado da posição de cada dígito ser dife-rente. Como você sabe, no sistema decimal, conforme nos movemos da direita para a esquerda, a posição de cada dígito representa valores que são 10 vezes maiores do que o dígito anterior. Logo, o sistema decimal é baseado em potências de 10, com o dígito da extrema direita sendo a posição unitária, à sua esquerda ficando a posição decimal, depois a posição da centena e assim por diante. Por exemplo, o número 423 significa quatrocentos e vinte e três, porque há quatro centenas, 2 dezenas e 3 unidades.
No sistema binário, o processo funciona da mesma maneira, exceto pelo fato de, ao nos movermos para a esquerda, a posição de cada dígito aumentar segundo um fator igual a 2. Portanto, a posição do primeiro dígito binário (o da extrema direita) representa 1. À sua esquerda é a posição do 2 e depois a posição do 4, seguida pela posição do 8, etc. Ou seja, as oito primeiras posições dos dígitos binários representam os valores a seguir:
128 64 32 16 8 4 2 1
Por exemplo, o valor binário 1010 é o valor decimal 10. Por quê? Porque não tem 1, tem um 2, não tem 4 e tem um 8. Logo, 0 + 2 + 0 + 8 é igual a 10. Outro exemplo: o valor binário 1101 é 13 em decimal porque tem 1, não tem 2, tem um 4 e um 8. Logo, 1 + 0 + 4 + 8 é igual a 13. Como podemos ver, para fazer a conversão de binário para decimal, só temos que somar os valores representados pelos dígitos 1.
Bits e bytes
No computador, um dígito binário é representado individualmente por um bit. Um bit pode estar ativado ou desativado. Um bit ativado é igual a 1 e um bit desativado é igual a 0. Os bits ficam organizados em grupos. O mais comum é o byte. Normalmen-te um byNormalmen-te é composto por 8 bits. Ou seja, ele pode representar os valores de 0 a 255. Outra unidade organizacional é a palavra. Normalmente, a palavra é dimensio-nada para ser compatível com uma arquitetura de CPU específica. Por exemplo, um computador de 32 bits costuma usar uma palavra de 32 bits (4 bytes).
Por conveniência, muitas vezes os números binários são mostrados agrupados em unidades de 4 (ou às vezes de 8) dígitos – por exemplo, 1011 1001. Isso facilita a visualização dos dígitos. No entanto, temos que entender que esses agrupamentos visuais não têm relação com o valor que está sendo representado.
O sistema operacional
Os componentes de hardware do computador são gerenciados e disponibilizados pelo
computador. Os sistemas operacionais são um dos principais tópicos da ciência da computação e não é possível descrevê-los em detalhes aqui. Felizmente, uma visão geral breve é suficiente para o que pretendemos.
Um sistema operacional serve a duas funções básicas. Em primeiro lugar, fornece um nível básico de funcionalidade que outros programas usarão para acessar os recur-sos do computador. Por exemplo, para salvar informações em uma unidade de disco, você usará um serviço fornecido pelo sistema operacional. Em segundo lugar, o siste-ma operacional controla a execução de outros prograsiste-mas. Por exemplo, ele fornece es-paço na memória para o armazenamento do programa enquanto este estiver sendo exe-cutado, agenda tempo da CPU para sua execução e supervisiona o seu uso dos recursos. Vários sistemas operacionais são comuns, como Windows, Unix, Linux, Mac OS, iOS e Android. Como regra geral, um programa deve ser projetado para execu-ção em (tendo como destino) um sistema operacional específico. Por exemplo, um programa destinado ao Windows não pode ser executado no Unix, a menos que seja especificamente adaptado.
Verificação do progresso
1. A CPU executa instruções de _________. 2. Como é 27 em binário?
3. Que programa supervisiona a operação do computador?
O PROGRAMA
A base da programação é o programa. Já que este livro é sobre programação, faz sentido definirmos formalmente esse termo. Aqui está uma definição bem genérica: um programa é composto por uma sequência de instruções que pode ser executada por um computador. No entanto, o termo programa pode significar coisas diferentes, dependendo de seu contexto, porque um programa pode ter duas formas básicas. Uma é legível para humanos, e a outra, para máquinas.
Quando você escrever um programa, estará criando um arquivo de texto con-tendo seu código-fonte. Essa é a forma do programa legível para humanos. É a forma que normalmente os programadores consideram ser “o programa”. No entanto, não é a forma realmente executada pelo computador. Em vez disso, o código-fonte de um programa deve ser convertido em instruções que o computador possa executar. É o cha-mado código-objeto. É difícil (quase impossível) para os humanos lerem um arquivo de código-objeto. É por isso que os programadores trabalham com o código-fonte de seus programas, convertendo-o em código-objeto apenas quando chega a hora de executá-lo.
Um programa é convertido de código-fonte para código-objeto por um
compi-lador. Em alguns casos, o compilador gera instruções de máquina reais que são
exe-cutadas diretamente pela CPU do computador. (Normalmente é assim que funciona Respostas:
1. máquina 2. 11011
um compilador para a programação em linguagens como C++, por exemplo.) Um ponto que devemos entender sobre o código-objeto é que ele é projetado para um tipo específico de CPU. Como explicado anteriormente, as instruções de máquina de um tipo de CPU não costumam funcionar com outro tipo de CPU.
Pode parecer estranho o fato de que, em alguns casos, as instruções do código-ob-jeto produzidas por um compilador não sejam destinadas a uma CPU real! Em vez disso, devem ser executadas por uma máquina virtual. Uma máquina virtual é um programa que emula uma CPU em software. Assim, cria o que é, essencialmente, uma CPU em lógica em vez de em hardware. Como tal, ela define seu próprio conjunto de instruções, o qual é capaz de executar. Normalmente o processo de execução dessas instruções é chamado de interpretação, e às vezes a máquina virtual é chamada de interpretador. Como você verá em breve, Java usa uma máquina virtual e há vantagens significativas nessa abordagem.
Independentemente de seu código-fonte ser compilado para código de máquina diretamente executável ou para código a ser executado por uma máquina virtual, o processo de conversão do código-fonte em código-objeto via compilador é o mesmo.
LINGUAGENS DE PROGRAMAÇÃO
Quem define os elementos específicos do código-fonte de um programa é a lingua-gem de programação que está sendo usada. Há duas categorias básicas de linguagens: a de baixo nível e a de alto nível. A linguagem de baixo nível tem uma ligação direta com o conjunto de instruções da CPU. A linguagem simbólica é um exemplo de lin-guagem de baixo nível. Como explicado antes, há uma correspondência de um para um entre cada instrução de código simbólico e uma instrução de máquina. Isso torna a criação de código simbólico uma tarefa tediosa.
Atualmente, grande parte da programação é feita com o uso de uma linguagem de alto nível. (Por exemplo, Java é uma linguagem de alto nível.) As linguagens de alto nível permitem a criação de programas de maneira mais rápida, fácil e confiável. Uma linguagem de alto nível define estruturas que ajudam a organizar, estruturar e controlar a lógica do programa. Cada estrutura da linguagem de alto nível é converti-da em muitas instruções de máquina.
Há muitas linguagens de programação de alto nível, mas quase todas definem três elementos básicos:
䊏 palavras-chave
䊏 operadores
䊏 pontuação
Esses elementos devem ser combinados de acordo com as regras de sintaxe definidas pela linguagem. As regras de sintaxe especificam com bastante precisão o que cons-titui o uso válido de um elemento do programa. Para ser compilado, o código-fonte deve aderir a essas regras.
Em uma definição geral, as palavras-chave definem os blocos de construção da linguagem. Elas são usadas para especificar as estruturas de alto nível suportadas pela linguagem. Por exemplo, as palavras-chave são usadas para controlar o fluxo de exe-cução, definir vários tipos de dados e fornecer opções e mecanismos que permitam o gerenciamento da execução de um programa.
Os operadores são usados por expressões e uma das mais comuns é a expressão aritmética. Por exemplo, quase todas as linguagens usam + para especificar adição. A pontuação abrange os elementos da linguagem que são usados para separar um elemento de outro, agrupar instruções, evitar ambiguidade ou até mesmo tornar mais clara a sintaxe da linguagem.
Embora muitas linguagens de programação tenham sido inventadas, só algumas passaram a ser amplamente usadas. Entre elas estão FORTRAN, COBOL, Pascal, vários dialetos do BASIC, C, C++ e, é claro, Java. Felizmente, depois que você apren-der uma linguagem de programação, será muito mais fácil aprenapren-der outra. Portanto, o tempo que investir no aprendizado de Java o beneficiará não só agora como no futuro.
Verificação do progresso
1. A forma de um programa legível para humanos se chama ________. 2. A forma executável de um programa se chama _______.
3. O que são regras de sintaxe?
Pergunte ao especialista
P
Ouvi programadores usarem a expressão “escrever código”. O que significa?R
Com frequência, programadores profissionais chamam o ato de programar (isto é,criar código-fonte) de “escrever código”. Outra expressão que você deve ouvir é “codificar um programa”, que também se refere à criação de código-fonte. Na verdade, é comum ouvirmos um excelente programador ser chamado de um “ótimo codificador”.
A LINGUAGEM JAVA
Este livro usa a linguagem Java para ensinar os fundamentos da programação. Embora outras linguagens de programação também pudessem ser usadas para esse fim, Java foi selecionada principalmente por duas razões. Em primeiro lugar, é uma das lingua-gens de computador mais usadas no mundo. Portanto, de um ponto de vista prático, é uma ótima linguagem para se aprender. Em segundo lugar, seus recursos são projeta-dos e implementaprojeta-dos de tal maneira que é fácil demonstrar as bases da programação.
Mas também há uma terceira razão. Java representa muito do que caracteriza a programação moderna. Conhecer Java dá uma ideia do que os programadores profis-sionais pensam sobre a tarefa de programar. É uma das linguagens que definem nossa época.
Java faz parte do progressivo processo histórico de evolução das linguagens de computador. Como tal, é uma mistura dos melhores elementos de sua rica herança combinados com os conceitos inovadores inspirados por seu lugar exclusivo na his-Respostas:
1. código-fonte 2. código-objeto
tória da programação. Enquanto o resto deste livro descreve os aspectos práticos da linguagem Java, aqui examinaremos as razões de sua criação, as forças que a molda-ram e o legado que ela herdou.
Origem da linguagem Java
Java foi concebida por James Gosling e outras pessoas da Sun Microsystems em 1991. Inicialmente, a linguagem se chamava “Oak”, mas foi renomeada como “Java” em 1995. Ainda que Java tenha se tornado inexoravelmente vinculada ao ambiente online, a Internet não foi o ímpeto original! Em vez disso, a principal motivação foi a necessidade de uma linguagem independente de plataforma que pudesse ser usada na criação de softwares para serem embutidos em vários dispositivos eletrônicos dos consumidores, como fornos de micro-ondas e controles remotos. Como era de se esperar, muitos tipos de CPUs diferentes são usados como controladores. O proble-ma era que, na época, a proble-maioria das linguagens de computador era projetada para ser compilada para código de máquina de um tipo específico de CPU. Por exemplo, considere C++, outra linguagem que também foi muito popular na época (e ainda é).
Embora fosse possível compilar um programa C++ para quase todo tipo de CPU, era preciso um compilador C++ completo destinado a essa CPU. Isso ocorre porque normalmente o C++ é compilado para instruções de máquina que são executadas direta-mente pela CPU e cada CPU requeria um conjunto de instruções de máquina diferente. O problema, no entanto, é que criar compiladores é caro e demorado. Em uma tentati-va de encontrar uma solução melhor, Gosling e outros trabalharam em uma linguagem com portabilidade entre plataformas que pudesse produzir código para ser executado em várias CPUs com ambientes diferentes. Esse esforço acabou levando à criação de Java.
Mais ou menos na época em que os detalhes de Java estavam sendo esboçados, surgiu um segundo fator muito importante que desempenharia papel crucial no fu-turo da linguagem. É claro que essa segunda força foi a World Wide Web. Se a Web não estivesse se formando quase ao mesmo tempo em que Java estava sendo imple-mentada, talvez ela continuasse sendo uma linguagem útil, mas obscura, para a pro-gramação de utensílios eletrônicos. No entanto, com o surgimento da Web, Java foi impulsionada para a dianteira do design das linguagens de computador, porque a Web também precisava de programas portáveis. Por quê? Porque a Internet é frequentada por vários tipos de computadores, usando diferentes tipos de CPUs e sistemas opera-cionais. Algum meio de permitir que esse variado grupo de computadores executasse o mesmo programa era altamente desejado.
Perto de 1993, ficou óbvio para os membros da equipe de projeto de Java que, com frequência, os problemas de portabilidade encontrados na criação de código para controladores embutidos também são encontrados quando tentamos criar códi-go para a Internet. Essa percepção fez com que o foco de Java mudasse dos utensí-lios eletrônicos domésticos para a programação na Internet. Assim, embora a fagulha inicial tenha sido gerada pelo desejo por uma linguagem de programação indepen-dente da arquitetura, foi a Internet que acabou levando ao sucesso em larga escala de Java. É útil mencionar que Java está diretamente relacionada a duas linguagens mais antigas: C e C++. Ela herda sua sintaxe da linguagem C, e seu modelo de ob-jetos é adaptado de C++. O relacionamento de Java com C e C++ é importante: na época em que Java foi criada, muitos programadores conheciam a sintaxe C/C++,
o que facilitou para um programador C/C++ aprender Java e, da mesma forma, um programador Java aprender C/C++. Além disso, os projetistas não “reinventaram a roda”. Eles conseguiram adaptar, refinar e enriquecer um paradigma de programação já altamente bem-sucedido.
Devido às semelhanças entre Java e C++, principalmente seu suporte à progra-mação orientada a objetos, é tentador pensar em Java simplesmente como a “versão de C++ para a Internet”. No entanto, isso seria um erro. Java tem algumas diferenças significativas. Embora tenha sido influenciada por C++, não é uma versão melhorada dessa linguagem. Por exemplo, ela não é compatível com versões anteriores ou futu-ras de C++. Além do mais, Java não foi projetada para substituir C++, mas sim para resolver um determinado conjunto de problemas, e C++ para resolver um conjunto de problemas diferente. Elas ainda coexistirão por muitos anos.
Verificação do progresso
1. Java é útil para a Internet porque pode produzir programas _____. 2. Java é descendente direta de quais linguagens?
Contribuição da linguagem Java para a Internet
A Internet ajudou a impulsionar Java para a dianteira da programação; por sua vez, Java teve um efeito profundo sobre a Internet. Além de simplificar a programação geral na Web, ela inovou com um tipo de programa de rede chamado applet que, na época, mudou a maneira de o mundo online pensar em conteúdo. Java também resol-veu alguns dos problemas mais complicados associados à Internet: portabilidade e segurança. Examinemos mais detalhadamente cada um deles.
Applets Java
Um applet é um tipo especial de programa Java que é projetado para ser transmitido pela Internet e executado automaticamente por um navegador Web compatível com Java. Além disso, ele é baixado sob demanda. Se o usuário clicar em um link que contém um applet, este será automaticamente baixado e executado no navegador. Os applets são projetados como programas pequenos. Normalmente, são usados para exibir dados fornecidos pelo servidor, tratar entradas do usuário ou fornecer funções simples, como uma calculadora de empréstimos, que é executada local-mente em vez de no servidor. Basicalocal-mente, os applets permitem que uma funcio-nalidade seja movida do servidor para o cliente. Sua criação mudou a programação na Internet porque expandiu o universo de objetos que podem se mover livremente no ciberespaço.
Mesmo sendo tão desejáveis, os applets também enfrentaram problemas sérios nas áreas de segurança e portabilidade. É claro que um programa que é baixado e exe-cutado automaticamente no computador cliente deve ser impedido de causar danos. Respostas:
1. portáveis 2. C e C++.
Ele também deve poder ser executado em vários ambientes diferentes e em sistemas operacionais distintos. Como você verá, Java resolveu esses problemas de uma ma-neira eficaz e elegante. Examinemos os dois problemas com mais detalhes.
Segurança
Como você deve saber, sempre que baixamos um programa “normal”, estamos nos arris-cando, porque o código baixado pode conter um vírus, cavalo de Troia ou outro código danoso. A parte mais importante do problema é o fato de que um código malicioso pode causar dano, já que ganhou acesso não autorizado a recursos do sistema. Por exemplo, um vírus pode coletar informações privadas, como números de cartão de crédito, saldos de conta bancária e senhas, pesquisando o conteúdo do sistema local de arquivos do computador. Para Java permitir que o applet fosse baixado e executado com segurança no computador cliente, era necessário impedir que ele iniciasse esse tipo de ataque.
A linguagem conseguiu fornecer essa proteção confinando o applet ao ambiente de execução Java e não permitindo que ele acesse outras partes do computador. (Você verá como isso é feito em breve.) Poder baixar applets com a certeza de que nenhum dano será causado e de que a segurança não será violada é um dos recursos mais im-portantes de Java.
Portabilidade
A portabilidade é um aspecto importante da Internet, porque há muitos tipos de computadores e sistemas operacionais diferentes conectados a ela. Se fosse para um programa Java ser executado em praticamente qualquer computador conectado à Internet, teria que haver alguma maneira de permitir que esse programa fosse executado em diferentes sistemas. Por exemplo, no caso de um applet, o mesmo applet tem que poder ser baixado e executado pela grande variedade de diferentes CPUs, sistemas operacionais e navegadores. Não é prático haver diferentes versões do applet para computadores distintos. O mesmo código deve funcionar em todos os computadores. Portanto, algum meio de gerar código executável portável era ne-cessário. Felizmente, o mesmo mecanismo que ajuda a manter a segurança também ajuda a gerar portabilidade.
O segredo da linguagem Java: o bytecode
O segredo que permite que Java resolva os problemas de segurança e portabilidade que acabamos de descrever é a saída do compilador Java não ser código de máquina diretamente executável. Em vez disso, é bytecode. O bytecode é um conjunto de ins-truções altamente otimizado projetado para ser executado pela Máquina Virtual Java (JVM, Java Virtual Machine). Na verdade, a JVM original foi projetada como um
interpretador de bytecode. O fato de o programa Java ser executado pela JVM ajuda a
resolver os principais problemas de portabilidade e segurança associados a programas baseados na Web. Vejamos por quê.
Converter um programa Java em bytecode facilita muito a execução de um pro-grama em uma grande variedade de ambientes, porque só a JVM tem que ser imple-mentada para cada plataforma. Uma vez que a JVM estiver presente em um determi-nado sistema, qualquer programa Java poderá ser executado nele. Embora os detalhes da JVM sejam diferentes de uma plataforma para outra, todas interpretam o mesmo
bytecode Java. Se um programa Java fosse compilado para código nativo, deveriam existir diferentes versões do mesmo programa para cada tipo de CPU conectada à In-ternet. É claro que essa não é uma solução viável. Logo, a execução de bytecode pela JVM é a maneira mais fácil de criar programas realmente portáveis.
O fato de um programa Java ser executado pela JVM também ajuda a torná-lo seguro. Já que a JVM está no controle, ela pode reter o programa e impedi-lo de gerar efeitos colaterais fora do sistema. A segurança também é aumentada por certas restri-ções existentes na linguagem Java.
Quando um programa é executado por uma máquina virtual, geralmente ele é executado mais lentamente do que o mesmo programa sendo executado quando com-pilado para código de máquina. No entanto, em Java, a diferença entre os dois não é tão grande. Já que o bytecode foi altamente otimizado, seu uso permite que a JVM execute programas de maneira muito mais rápida do que o esperado. Além disso, é possível usar a compilação dinâmica de bytecode para código de máquina visando a melhoria do desempenho, o que pode ser feito com o uso de um compilador
just-in--time (JIT) para bytecode.
Quando um compilador JIT faz parte da JVM, partes de bytecode selecionadas são compiladas em tempo real, fragmento a fragmento e sob demanda para código executável. É importante ressaltar que um compilador JIT não compila um programa Java inteiro para código executável de uma só vez. Em vez disso, um compilador JIT compila código quando necessário, durante a execução. Mas nem todas as se-quências de bytecode são compiladas – só as que se beneficiarão da compilação. Até mesmo quando a compilação dinâmica é aplicada ao bytecode, os recursos de porta-bilidade e segurança continuam aplicáveis, porque a JVM ainda está no comando do ambiente de execução.
Uma última coisa: a JVM faz parte do sistema Java de tempo de execução, que também é chamado de Java Runtime Environment (JRE).
A evolução de Java
Só algumas linguagens reformularam de maneira fundamental a essência básica da programação. Nesse grupo de elite, Java se destaca porque seu impacto foi rápido e difuso. Não é exagero dizer que o lançamento original de Java 1.0 pela Sun Microsys-tems, Inc., causou uma revolução na programação. Além de ter ajudado a transformar a Web em um ambiente altamente interativo, Java também definiu um novo padrão no projeto de linguagens de computador.
Com o passar dos anos, Java continuou a crescer, evoluir e se redefinir. Dife-rentemente de muitas outras linguagens, que são lentas na incorporação de novos recursos, Java com frequência está na dianteira do desenvolvimento das linguagens de computador. Uma razão para que isso ocorra é a cultura de inovação e mudança que foi criada ao seu redor. Como resultado, Java passou por várias atualizações – al-gumas relativamente pequenas, outras mais significativas.
Quando este texto foi escrito, a versão mais recente de Java se chamava Java SE 7, com Java Development Kit sendo chamado de JDK 7. O SE de Java SE 7 signifi-ca Standard Edition. Java SE 7 é a primeira grande versão de Java desde que a Sun Microsystems foi adquirida pela Oracle. Ela contém muitos recursos novos – vários deles serão apresentados no decorrer deste livro.