Introdução —

Esta é a primeira aula publicada no YouTube do meu Curso de Java: uma despretenciosa introdução à programação usando essa linguagem madura, robusta e amplamente difundida pelas suas excepcionais características. O objetivo principal é desenvolver essas aulas de uma maneira bem humorada, mas sem descuidar do provimento de uma formação sólida e extensa da variada tecnologia Java.

Aqui no Ponto G++, além do link para a vídeo-aula, você encontrará extenso material de apoio para cada lição e links para matéria correlata aos assuntos tratados, possibilitando-lhe aprofundar-se ainda mais nos estudos. Há também um link para acessar todo o código-fonte apresentado nas aulas, disponível no GitHub.

Tudo o que aprendi foi por esforço próprio, de forma auto-didática, ao longo de muitos anos de dedicação ao estudo. Agora que estou aposentado, disponho do tempo e dos recursos para compartilhar tudo que aprendi, de uma forma muito altruísta.

Desejo-lhe boa sorte nos estudos. Esteja certo de que o seu sucesso será minha maior recompensa.

Programa da aula:

Por que Java?

Se quiser conhecer a história e o desenvolvimento da linguagem Java desde sua criação até os dias atuais, consulte este artigo, publicado aqui mesmo no Ponto G++. Mas, antes de mais nada, acho que a melhor maneira para se ter uma ideia geral da linguagem de programação Java, é analisar as diretrizes que nortearam o seu projeto, conforme está definido no clássico The Java Language Environment, nas palavras do seu principal criador, James Gosling. Nesta tradução, você vai observar que deixei os termos técnicos de uso corriqueiro na sua forma original, em inglês. Adotarei essa metodologia de forma consistente, ao longo destas aulas.

"Os requisitos do projeto da linguagem de programação Java foram estabelecidos com base na natureza dos ambientes de computação nos quais os programas são executados.

O enorme crescimento da Internet e da World-Wide Web nos levou a uma forma inteiramente nova de enxergar o desenvolvimento e distribuição de programas. Para conviver no mundo do comércio eletrônico e da distribuição, a tecnologia Java precisava ser capaz de desenvolver aplicativos seguros, de alta performance, e extremamente robustos, sobre múltiplas plataformas em redes distribuídas.

A operação sobre múltiplas plataformas em redes heterogêneas invalida os esquemas tradicionais de distribuição binária, release, upgrade, patch, etc. Para sobreviver nessa selva, a linguagem de programação Java precisava ser neutra à arquitetura, transportável, e dinamicamente adaptável.

O sistema que emergiu para ir de encontro a essas necessidades é simples, de forma que pode ser programado com facilidade pela maioria dos desenvolvedores; familiar, para que os desenvolvedores atuais possam aprender a linguagem de programação Java sem sacrifício; orientada a objeto, para tirar proveito das metodologias modernas para desenvolvimento de programas e se ajustar com os aplicativos distribuídos num ambiente cliente-servidor; multithreaded, para alta performance nos aplicativos que precisem executar atividades de múltipla concorrência, tais como multimídia; e interpretada, para maximizar sua capacidade dinâmica e de portabilidade."

Nestes poucos parágrafos estão condensados os conceitos fundamentais da linguagem de programação Java, responsáveis pelo seu tremendo sucesso nas décadas seguintes à sua criação. Estes conceitos podem ser assim resumidos:

  • Simples;
  • Orientada a Objeto;
  • Computação Distribuída;
  • Execução encadeada (multithreading);
  • Dinâmica;
  • Indiferente à arquitetura do hardware;
  • Transportável;
  • Alta performance;
  • Robusta;
  • Segura.

Vamos examiná-los com um pouco mais de profundidade.

Simples – Simplicidade aqui não significa trivialidade, mas a característica de Java incorporar uma sintaxe moderna, parecida com a de outras linguagens largamente usadas, principalmente C e C++. Isso a torna familiar para os desenvolvedores, que podem atingir um elevado nível de produtividade num lapso de tempo muito curto.

Orientada a Objeto – Este é o último estágio de desenvolvimento das linguagens de programação, implementado para possibilitar o projeto de programas grandes e complexos, no qual é normal trabalharem grandes equipes simultaneamente. Neste sistema, o programa é desenvolvido em torno dos “objetos” que manipula, ao invés das ações que executa, diferentemente da técnica procedural anterior. Como veremos mais adiante, os conceitos-chave da Orientação a Objetos (OO) são o encapsulamento, que permite esconder e proteger dados e métodos de forma a facilitar o desenvolvimento compartilhado do programa, e a herança, que possibilita o reaproveitamento do código.

Computação Distribuída – Na sua forma mais genérica, a computação distribuída pode ser entendida como qualquer processamento que envolva múltiplos computadores, remotos em relação uns aos outros, em que cada um tem um papel na computação de um problema ou processamento de informação.

Execução Encadeada (Multithreading) – Java é a primeira linguagem de programação a incluir explicitamente o conceito de Threads na própria linguagem. Há uma excelente definição de multithreading na Wikipédia:

"Linha ou Encadeamento de execução (em inglês: Thread), é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrencialmente. O suporte à thread é fornecido pelo próprio sistema operacional, no caso da linha de execução ao nível do núcleo (em inglês: Kernel-Level Thread (KLT)), ou implementada através da biblioteca de uma determinada linguagem, no caso de uma User-Level Thread (ULT)."

Se você já escreveu algum programa em Java então já fez um programa multithreaded. Todo programa em Java possui pelo menos uma thread: a thread main. Além dessa, a máquina virtual mantém algumas outras que realizam tarefas como coleta de lixo ou finalização de objetos. Algumas classes disponíveis na API de Java também utilizam threads em suas implementações. Como exemplo, podemos citar as classes de Java Swing ou as classes da implementação de RMI (Remote Method Invocation). Em Java é possível lançar várias linhas de execução do mesmo programa. Chamamos a isso de Threads ou Multithreading. A diferença com os processos e programas acima é que Java é interpretada. Quem cuida dos vários Threads de um programa é o próprio interpretador Java. Algumas vantagens em relação aos processos:

  1. O chaveamento entre as threads é mais rápido que o chaveamento entre processos;
  2. A troca de mensagens entre as threads também é mais eficiente.

Dinâmica – Não confundir esta característica ora apresentada com a tipagem da linguagem, que em Java é estática. O termo "dinâmica", é aqui empregado com relação à linkagem do código-executável. Em linguagens como C e C++, todo o código tem que ser compilado para que possa ser executado na forma de um programa. Em Java, as classes são compiladas a medida em que são necessárias. Se uma classe não é necessária durante a fase de execução, ela sequer será compilada num bytecode. Essa característica vem a calhar, especialmente na programação em redes, onde não sabemos de antemão qual código será executado. Um programa em execução pode carregar classes do sistema de arquivos ou de um servidor remoto. Isso também torna teoricamente possível que um programa Java altere seu próprio código durante a execução, como se de certa forma implementasse inteligência artificial. Seria mais realístico imaginar, contudo, que um programa Java gera o código antes da execução e, então, o executa. Com algum mecanismo de feedback, o código gerado pode ir melhorando com o tempo.

Indiferente à arquitetura do hardware – A grande pretensão da linguagem de programação Java sempre foi, sem dúvida, a neutralidade à arquitetura de hardware – daí o famoso slogan da Sun: “write once, run anywhere” (“escreva uma vez, execute em qualquer lugar”). Para conseguir isso, a técnica foi usar uma máquina virtual interpretada como camada intermediária entre o aplicativo e o sistema operacional, produzindo programas que rodavam mais lentamente do que seus equivalentes compilados integralmente, na forma tradicional, usando um compilador C++, por exemplo. Isso trouxe para Java a má reputação de produzir programas lentos. Mas desde há muito tempo que a Máquina Virtual Java produz programas que rodam muito mais rápido. O compilador just-in-time (JIT), compila o bytecode Java em código nativo quando o programa é executado, e mantém o código compilado para usar sempre que necessário. Máquinas Virtuais mais sofisticadas usam até mesmo a dynamic recompilation, na qual a Máquina Virtual pode, após analisar o comportamento do programa em execução, recompilá-lo seletivamente e otimizar suas partes críticas. Essas duas técnicas permitem que o programa tire proveito da velocidade do código nativo, sem sacrificar sua portabilidade.

Transportável – A portabilidade é tecnicamente uma meta difícil de atingir, e o sucesso de Java em conseguir isso é, de certa forma, matéria de controvérsia. Embora seja possível, de fato, escrever programas que se comportem de forma consistente através de muitas plataformas hospedeiras, uma grande variedade delas contendo pequenos erros ou inconsistências, levou alguns a parodiarem jocosamente o slogan mencionado acima com a versão: “write once, debug everywhere” – acho que nem precisa de tradução. :)

Alta Performance – No seu paper, Gosling afirma que a performance sempre esteve em mira durante o desenvolvimento de Java. Segundo ele:

"(...) a plataforma Java alcança uma performance superior adotando um esquema no qual o interpretador pode rodar a plena velocidade sem precisar verificar o ambiente de execução. O garbage collector automático é executado numa thread de baixa prioridade em background, assegurando uma alta probabilidade de que a memória esteja disponível quando solicitada, o que leva a melhorar a performance. Aplicativos que requeiram grande uso de CPU podem ser projetados de tal forma que as seções de computação intensiva possam ser reescritas em código nativo da máquina como requerido e interfaceadas com a plataforma Java. Em geral, os usuários percebem que os aplicativos interativos respondem rapidamente a despeito de serem interpretados."

Na prática, todavia, há diferenças. Encontramos na Wikipedia um interessante comparativo entre a performance de Java e a de outras linguagens também muito utilizadas atualmente, o qual transcrevo a seguir.

"A comparação objetiva da performance de um programa Java com um equivalente escrito em outra linguagem, como C++, requer que um benchmark seja inteiramente construído com muito cuidado para comparar programas expressando algorítimos escritos de uma maneira tão idêntica quanto seja tecnicamente possível. A plataforma-alvo do bytecode Java é a plataforma Java, e o bytecode pode ser interpretado ou compilado em código nativo de máquina pela JVM. Outros compiladores têm como alvo, quase sempre, uma plataforma de hardware ou software específica, produzindo um código de máquina que ficará virtualmente imutável durante sua execução. Cenários muito diferentes e difíceis de comparar emergem dessas duas abordagens distintas: compilações estáticas contra compilações dinâmicas e recompilações, além da disponibilidade de informação precisa sobre o ambiente de execução, entre outras variáveis. Java é compilada, quase sempre, just-in-time (JIT) em tempo de execução pela JVM, mas também pode ser compilada ahead-of-time (AOT), tal como C++. Quando é compilada just-in-time, sua performance, em pequenos benchmarks é geralmente:
  • mais lenta do que linguagens compiladas similares como C ou C++,
  • idêntica a outras linguagens compiladas just-in-time, como C#,
  • muito mais rápida do que linguagens sem compilador de código nativo (JIT ou AOT), tais como Perl, Ruby, PHP e Python.

Robusta – James Gosling afirma que “a linguagem de programação Java foi projetada para criar programas altamente confiáveis, efetua uma extensiva verificação em tempo de compilação, seguida por um segundo nível de verificação durante a execução e suas características induzem bons hábitos de programação.” Ademais, analisando o desenvolvimento consistente da tecnologia Java ao longo dessas quase duas décadas passadas desde sua criação, podemos confirmar sua evolução constante, incorporando sempre o que há de mais moderno na tecnologia das linguagens de programação.

Segura – De acordo com a Oracle, “a tecnologia de segurança de Java inclui um vasto conjunto de APIs, ferramentas e implementações dos mais usados algorítimos de segurança, mecanismos e protocolos. As APIs de segurança de Java se espalham por uma larga área, incluindo criptografia, infraestrutura para chaves públicas, comunicação segura, autenticação e controle de acesso. A tecnologia Java fornece ao desenvolvedor um abrangente framework de segurança para elaborar aplicativos, bem como dá ao usuário e ao administrador um conjunto de ferramentas para gerenciar seguramente os aplicativos.” A Wikipedia, contudo, faz críticas à vulnerabilidade do gerenciador de segurança da plataforma Java aos malwares, especialmente em plugins para navegadores Web que executem applets baixados de sites públicos, informalmente conhecidos como “Java in the browser”. O esforço da Oracle para eliminar essas vulnerabilidades, aliás, teria sido responsável pelo atraso no lançamento de Java 8.

Diferenciação entre JVM, JRE e JDK

No "fantástico mundo de Java" é comum nos depararmos com um cipoal de siglas, a maioria delas começando com a letra "J". Logo de cara, ao iniciarmos nosso estudo dessa linguagem de programação, somos apresentados às três mais importantes dessas siglas: JVM, JRE e JDK.

A representação gráfica na figura a seguir dá uma ideia geral da sua integração:

jvm_jre_jdk

JVM

A sigla JVM significa "Java Virtual Machine", ou seja, a Máquina Virtual Java, que, como o próprio nome já indica, é uma "máquina" abstrata, cuja finalidade é prover o ambiente no qual o bytecode possa ser executado. Podemos conceber a JVM como o motor fundamental do ambiente de execução dos programas Java, cumprindo as seguintes tarefas:

  • Carregar o código do programa.
  • Verificar a consistência do código.
  • Executar o código.
  • Implementar o ambiente em tempo de execução.

JRE

JRE, por sua vez, é abreviatura de "Java Runtime Environment", que podemos traduzir como Ambiente de Execução Java. Sendo fisicamente a implementação da JVM, é ele que contém o conjunto de bibliotecas e demais arquivos que serão usados pela JVM durante a execução do programa Java.

JDK

O JDK é a sigla de "Java Development Kit", ou seja, o kit para desenvolvimento de programas Java. Como podemos observar na figura acima, contém, além do JRE/JVM, ferramentas para desenvolvimento, incluindo, entre outras, um compilador. Atualmente, ele é apresentado em três versões:

  • Java MEJava Mobile Edition: Kit de desenvolvimento para aplicações de dispositivos portáteis, tais como celulares, por exemplo.
  • Java SEJava Standard Edition: Utilizado para desenvolvimento Desktop e Cliente/Servidor.
  • Java EEJava Enterprise Edition: Desenvolvimento de aplicativos de uso corporativo. Esclarecendo um pouco melhor: as aplicações Web atuais possuem regras de negócio bem complicadas. Além dessas regras, conhecidas como requisitos funcionais, existem outros requisitos a serem atingidos através da infraestrutura do aplicativo, tais como persistência em banco de dados, transação, acesso remoto, web services, gerenciamento de threads, gerenciamento de conexões HTTP, cache de objetos, gerenciamento da sessão Web, balanceamento de carga e outros mais, chamados requisitos não-funcionais. É exatamente para dar suporte à implementação desses requisitos que foi desenvolvida a Java EE, que consiste de uma série de especificações bem detalhadas, dando uma receita de como deve ser implementado um software que execute cada um desses serviços de infraestrutura.

Qual versão do JDK instalar?

Para estudar a linguagem de programação Java, portanto, a primeira coisa que precisaremos providenciar é a instalação do JDK no nosso computador.

Para um aprendizado básico da linguagem, vamos utilizar a versão SE de Java 8, disponibilizada pela Oracle, que você encontra neste repositório. Abaixo, estão os links de tutoriais com um passo-a-passo para sua instalação nos principais sistemas operacionais em uso atualmente.

O que é um IDE?

Segundo a Wikipédia um "IDE, do inglês Integrated Development Environment ou Ambiente Integrado de Desenvolvimento, é um programa de computador que reúne características e ferramentas de apoio ao desenvolvimento de software com o objetivo de agilizar este processo."

Geralmente os IDE facilitam a técnica de RAD (de Rapid Application Development, ou "Desenvolvimento Rápido de Aplicativos"), que visa a maior produtividade dos desenvolvedores.

O IDE Eclipse

Este fantástico IDE é hoje o mais utilizado no mundo todo para desenvolvimento em Java, embora suporte também outras linguagens tais como C/C++, PHP e Python, entre outras, mediante a instalação de plugins (módulos de extensão). Hoje em dia, também é muito usada para desenvolvimento de programas para a plataforma Android.

Tendo em vista a sua enorme utilização pela indústria de software, além da sua inquestionável flexibilidade e seus recursos avançados para desenvolvimento, será este o IDE que iremos utilizar na maior parte do Curso de Java do Ponto G++. Não poderia, contudo, deixar de mencionar dois outros IDEs excelentes para desenvolvimento Java: o NetBeans, distribuído pela própria Oracle, e o IntelliJIDEA, este último a única versão comercial (paga) dos três, embora exista uma versão open-source muito boa, mantida pela comunidade.

Instalação

Como o IDE Eclipse é desenvolvido em Java, sua instalação, em qualquer plataforma, é a coisa mais simples que existe. Basta baixar o programa do seu site oficial, conforme a sua plataforma (Windows/Linux/Mac OS X), descompactar o arquivo e iniciar o executável. Crie um atalho para a pasta descompactada a fim de facilitar a utilização do programa e mãos à obra...

eclipse_download

Não vou abordar aqui detalhes da utilização do IDE Eclipse, pois isso foge ao escopo deste curso. Considerando, contudo, a amplitude da sua utilização, qualquer dúvida poderá ser virtualmente esclarecida na Internet ou na própria documentação oficial. Sugiro que você dedique parte do seu tempo ao estudo do programa, para alcançar o máximo de produtividade.

Irá constatar que este IDE possui realmente recursos extraordinários para facilitar sua vida de desenvolvedor Java, explicando o porquê do seu tremendo sucesso.

java-logo


comments powered by Disqus