Java #2 - Prática e Operações

Logo do Java por Freepik em www.flaticon.com

Olá pessoas ... e bots.

Embora na primeira parte desse tutorial tenha focado apenas em conceitos, é preciso ter um pouco de prática para fixar os conteúdos e entendê-los corretamente.
Vale ressaltar que as linguagens de programação são feitas à partir do inglês (como quase tudo em TI), portanto todos os códigos exibidos terão comentários em inglês, apenas com explicação das partes mais relevantes em português apoś os códigos – portanto você pode perder parte do conteúdo se não souber inglês de antemão.
Para praticar programação é preciso ter ferramentas adequadas, então não poderia começar sem citar a ferramenta que considero a mais adequada para iniciantes.
Ícone por Ideone em Twitter

Ideone

Estamos em 2020, quem hoje em dia vai encher o computador de tralha só para praticar uma linguagem de programação?
Um certo meme que circulou bastante ano passado dizia que "problemas modernos exigem soluções modernas", vou além: tempos modernos exigem ferramentas modernas. Justamente por isso recomendo essa IDE online perfeita para softwares simples - especialmente para treinar programação - que é compatível com uma extensa lista de linguagens de programação, permite uso sem nenhum cadastro (embora você possa se cadastrar para manter as coisas mais organizadas) e torna tão fácil compartilhar código-fonte quanto é compartilhar um documento no Google Drive.

Então, caso não queira passar por todo o processo de instalar o JDK em seu computador e também um editor/IDE para Java, comece a usar uma ferramenta do século 21 para estudar:
Ícone por oNline Web Fonts

TI Livre

Este tutorial de Java faz parte do meu projeto TI Livre, que tem o objetivo de ensinar um pouco do que sei a outras pessoas - porém aproveitando os recursos Google Suite para oferecer uma maior variedade de formatos, tornando esse conteúdo mais acessível.
Cada parte do tutorial, incluindo essa, será publicada junto com uma apresentação de slides - ambos com o conteúdo de um capítulo da apostila online. Entretanto mais formatos podem ser adicionados no futuro.
Sendo um projeto Livre, você pode usar e compartilhar à vontade, só lembre de dar créditos quando o fizer.

Mão na massa

Vamos começar com um exemplo do conteúdo já abordado, o qual você também pode ver o código pelo Github Gist ou ver em funcionamento pelo Ideone e até testar modificações que quiser fazer.
Ver no Github Gist
Ver no Ideone

Esse exemplo será explicado passo a passo nos tópicos desta parte, não se preocupe se não entendeu tudo de cara.

Pacotes, classes e objetos

Começando pelo começo do exemplo, logo na primeira linha pode-se notar o uso de um recursos importante do Java: pacotes. Como já havia sido dito anteriormente, o pacote é um grupo de unidades de código (como classes) com identificação exclusiva, grosso modo equivale a uma pasta num serviço de armazenamento online (ou em seu computador), enquanto o conteúdo do pacote equivale aos arquivos contidos numa pasta – ou subpastas.
A instrução import permite acessar um item dentro de um pacote (como é o caso o exemplo) ou o pacote inteiro (o que não é recomendável, por razões de desempenho). No caso informamos ao compilador Java que iremos acessar a classe Arrays contida no pacote utils, que por sua vez está contido no pacote java; utilizando vírgulas para separar cada parte do caminho. Como a classe Arrays é uma extensão da linguagem (não faz parte das funcionalidades essenciais do Java), é obrigatório importar ela em todo arquivo onde for usada.

A próxima coisa a ser notada é a declaração de classe na terceira linha: public class Main. Começando pelo fim da linha, é fácil notar vendo o código que as chaves, “{“ na terceira linha e “}” na última, delimitam um bloco de código – o bloco de código da classe.
Main é o nome da classe em si, um nome normalmente usado para exemplos simples de programação (como é o caso) por ser comum chamar o arquivo principal de um projeto de Main – e em Java o arquivo que define uma classe deve ter o mesmo nome dela. A palavra-chave class indica o tipo de unidade de código que estamos declarando: uma classe. Já palavra-chave public será bem explicada na próxima parte, por hora é suficiente saber ela que permite que qualquer classe ou objeto acesse um recurso – incluindo a própria plataforma Java.

O próximo ponto a se destacar vem nas linhas 9 e 19: métodos. Como foi citado antes, os métodos são as funcionalidades contidas em um objeto, entretanto também é possível declarar métodos em classes (através da palavra-chave static), permitindo o utilizar um valor ou funcionalidade sem criar um objeto à partir da classe - exatamente como o método de entrada do programa, main, é chamado pelo Java e como chamamos o método IntAverage no programa.
Após public e static, que serão melhor explicados posteriormente, temos as partes principais da declaração de um método: tipo de retorno, seu nome, seus parâmetros e seu bloco de código – que faz o ele funcionar. Juntos, o nome e os parâmetros de um método são chamados de assinatura: o que distingue um método de outros para o Java.
Tipo de retorno indica que tipo de dados um método/função irá retornar para quem o chama. Ele pode ser um tipo primitivo, o nome de uma classe (para retornar objetos) ou void - o qual indica que nenhum valor será retornado. Após o nome do método são declarados, entre parênteses, seus parâmetros – isto é, valores que devem ser passados para chamar o método (também entre parênteses). Como essas informações estão registradas no próprio código do programa em tempo de compilação, fica fácil encontrar erros ao declarar ou chamar métodos sem precisar sequer executar o programa – o próprio compilador avisa o que há de errado.
Um bom exemplo de quanto isso pode ser útil é o próprio método de entrada da aplicação: ele deve sempre permitir ser chamado por qualquer um (public), pertencer à classe do programa (static), não retornar nenhum valor (void), ter o nome main e receber como parâmetro um vetor de strings (String[]). Qualquer desvio disso gerará uma mensagem de erro no compilador, que apontará qual é o problema.

Embora isso possa passar batido no exemplo para iniciantes, é bom notar que estamos usando objetos no código de duas formas diferentes:
  • Tipo String
    Como ressaltado no tópico sobre tipos primitivos, String são objetos no Java – logo temos um vetor de objetos como parâmetro do método main
  • System.out
    Objeto da classe PrintStream que, por padrão, mostra no console o que for passado de parâmetro para método println()

Variáveis

Ambos os métodos do exemplo começam com uma declaração de variável, um ponto flutuante em IntAverage e um vetor de inteiros em main. Nos dois casos as variáveis são declaradas já recebendo um valor, com uma sintaxe mais elaborada para o vetor de inteiros – que economiza o tempo/esforço de declarar o vetor com um determinado tamanho e depois atribuir cada um dos valores. Como fica fácil de perceber, a sintaxe para declarar variáveis em funções/métodos no Java é: tipo nome [= valor];
Note que como é opcional dar valor às variáveis, essa parte da sintaxe foi colocada entre colchetes – um padrão bastante usado nas documentações técnicas de ferramentas e linguagens programação.

Operadores e conversões

Sendo a aplicação de exemplo usada neste capítulo feita para calcular média de valores, obviamente algumas operações seriam feitas para tudo funcionar. Quatro tipo de operações foram usadas no código:
  • Matemáticos
    • (+) soma
    • (-) subtração
    • (/) divisão
    • (--) decremento
  • (=) Atribuição
  • Comparativos
    • (>) maior que
  • (+) Concatenação de strings
Além dos listados, há um outro tipo importante para destacar: operadores lógicos. A seguir será feita uma referência dos tipos de operadores – com exceção do para concatenação (união) de strings, pois seu funcionamento já é bem explicado pelo exemplo.

Matemáticos

  • (+) Soma
  • (-) Subtração
  • (*) Multiplicação
  • (/) Divisão
  • (%) Módulo
    Resto da divisão
  • (++) Incremento
    Aumenta valor em 1
  • (--) Decremento
    Diminui valor em 1

Operadores de Atribuição

  • (=) Atribuição
  • (+=) Soma e Atribuição
  • (-=) Subtração e Atribuição
  • (*=) Multiplicação e Atribuição
  • (/=) Divisão e Atribuição
  • (%=) Módulo e Atribuição

Operadores Lógicos

  • (&&) E
  • (||) OU
  • (!) Negação

Operadores Comparativos

  • (==) Igual a
  • (!=) Diferente de
  • (<) Menor que
  • (>) Maior que
  • (<=) Menor ou igual
  • (>=) Maior ou igual

Com exceção da atribuição pura, os operadores de atribuição servem como uma forma rápida de escrever expressões matemáticas. A soma no exemplo seria assim somente com atribuição simples:
Result = Result + Numbers[Index];

Conversão de tipos

Na última linha de IntAverage, com a instrução return (nome auto-explicativo) podemos ver uma coisa bem interessante: conversão de tipo, passando o resultado da conta que a segue para inteiro – o exato tipo de retorno do método. Como destacado por comentário no código, a conversão de tipo (em inglês type casting) double para int já arredonda o resultado automaticamente.
Esse é um recurso importante do Java, pois além de permitir passar valores para outros tipos primitivos (quando o valor está dentro dos limites do tipo para o qual será convertido), também permite representar objetos de maneiras diferentes conforme necessário – outro ponto que será melhor abordado mais para a frente.

Documentação

Repare no formato de comentário de código antes do método IntAverage do exemplo. Mais que um comentário multiline (pode ocupar várias linhas), ele apresenta o formato utilizado pela ferramenta Javadoc para gerar documentação para projetos à partir do código-fonte – o que é especialmente útil ao desenvolver software para terceiros e/ou manutenção a longo prazo.
Cabe ressaltar que além de gerar documentação técnica de forma padronizada, comentários em formato Javadoc também são bastante usados por editores modernos e IDEs para dar dicas e sugestões ao programador enquanto ele edita o código do software, ajudando a economizar tempo e agilizar o desenvolvimento consideravelmente.

Comentários