APRESENTAÇÃO
Lista de Códigos
Primeiras palavras
Neste contexto, este livro foi escrito com o objetivo de fornecer uma introdução à linguagem Java, destacando como os principais conceitos do paradigma orientado a objetos foram definidos nesta linguagem. Supõe-se, portanto, que o leitor já tenha algum conhecimento do paradigma orientado a objetos, e que embora esta unidade apresente uma discussão dos principais conceitos deste paradigma, este livro não deve ser considerado um material de referência sobre o paradigma.
Problematizando o tema
É inegável que a orientação a objetos é o paradigma de programação mais utilizado atualmente, e Java é uma das mais populares entre as linguagens de programação que adotam esse paradigma. Este livro foi escrito para ser utilizado como material de apoio à disciplina Programação Orientada a Objetos II do curso de Bacharelado em Sistemas de Informação da Universidade Federal de São Carlos.
Paradigmas de programação
Vale ressaltar que esta história não inclui linguagens de programação modernas (criadas a partir de 2000), pois estas geralmente suportam múltiplos paradigmas. Assim como diferentes grupos de engenharia de software propõem diferentes metodologias, diferentes linguagens de programação propõem diferentes paradigmas de programação.
Afinal de contas, o que significa ser orientado a objetos?
A Figura 1.6 ilustra o envio de uma mensagem ao objeto da classe Account com uma solicitação para executar o método getBalance(). Por exemplo, considere a Figura 1.12, que ilustra uma associação em que uma equipe é composta por um ou mais atletas.
Considerações finais
Estudos complementares
Primeiras palavras
Problematizando o tema
O que é Java?
Consiste na linguagem de programação Java, na Java Virtual Machine (Seção 2.3.2) e em diversas Interfaces de Programação de Aplicativos (APIs). Isso, por sua vez, traduz o código intermediário compilado (bytecode) na linguagem de máquina específica da plataforma na qual o programa e a Java Virtual Machine serão executados.
Tipos primitivos & classes Wrappers
Por enquanto, todas as outras linhas onde há declaração de classe e método são irrelevantes. A partir da versão 1.54, a linguagem Java possui um recurso chamado autoboxing, que executa essa tarefa automaticamente em detrimento da legibilidade (Figura 2.3).
Controle de fluxo
O código 2.5 ilustra um programa Java que usa a instrução do.while e pede ao usuário para inserir um número inteiro n. O código 2.7 ilustra um programa Java que utiliza a instrução break para encerrar um loop for.
Orientação a objetos em Java: conceitos básicos
Atributos e métodos em Java devem ser declarados dentro do corpo da classe (a parte entre { e colchetes. Os métodos não podem ser criados dentro de outros métodos, nem fora da classe à qual pertencem.
Considerações finais
O valor do atributo deve ser definido no momento da declaração (ou no construtor da classe), pois nenhuma atribuição é permitida em nenhum outro momento. Ao permitir que o valor da propriedade final seja definido no construtor, introduz um maior grau de flexibilidade na definição de constantes para objetos de uma classe, pois podem depender de parâmetros passados ao construtor. Como no caso das constantes, a definição do valor (ou seja, a criação do objeto) também deve ser especificada no momento da declaração.
Estudos complementares
Primeiras palavras
Problematizando o tema
Arrays
Acessar elementos de um array além do último índice permitido — por exemplo, b[9] — produz um erro ou exceção em tempo de execução (Seção 3.10). O código 3.3 introduz o método sum(int.. valor), que retorna a soma dos valores inteiros passados como parâmetro.
Pacotes
Como o asterisk importa todos os subpacotes, o uso de memória será alto e provavelmente não usaremos todas as classes de todos os pacotes importados. O pacote java.lang contém as classes que constituem os recursos básicos da linguagem necessários para executar qualquer programa Java. Throwable, Error e Exception – são classes que permitem a definição e manipulação de situações de erro e condições de execução inesperadas (seção 3.10), como OutOfMemoryError, ArithmeticException (ex. divisão inteira por zero) e ArrayIndexOutOfBoundsException (acesso ao elemento do array a última posição ou antes da primeira posição).
Associação, Composição e Agregação
Se encontrada, a variável de referência apontará para este objeto String existente e um novo objeto não será criado na memória. Em outras palavras, eles podem ser alterados, e um novo objeto não será criado a cada alteração, mas o valor do objeto será realmente alterado. A implementação das relações de agregação e composição é, para muitos, bastante semelhante à implementação da relação sindical.
Herança
Para tanto, utiliza-se a palavra reservada extends seguida do nome da superclasse na definição da classe derivada. Como exemplo do mecanismo de herança em Java, esta seção apresenta a implementação da classe ContaChequeEspecial (Figura 1.7), que é uma subclasse da classe Conta (Código 2.10). É importante ressaltar que como o atributo balance da classe Conta foi definido com o modificador protected, ele pode ser acessado pela classe ContaChequeEspecial.
Classes abstratas
A classe Museum representa museus e, portanto, armazena uma coleção de obras de arte (instâncias das subclasses Artwork) que estão na coleção do museu. Dessa forma, as obras agregadas ao acervo do museu serão instâncias de classes concretas (Pintura e Escultura) – subclasses de Obra de Arte. Como você pode ver, este método chama o método print() dos objetos que representam a arte – instâncias das classes Paint e Sculpt.
Interfaces
Conforme discutido anteriormente, as classes concretas que implementam uma interface devem implementar todos os métodos declarados nela. Em seguida, verifica se os três lados são iguais (desde que seja um triângulo equilátero).
Polimorfismo paramétrico
A segunda instrução add (linhas 7 e 8) é responsável por adicionar uma string a uma lista de instâncias da classe String. O terceiro comando de adição (linhas 10 e 11) é responsável por adicionar um número inteiro a uma lista de instâncias da classe Object. O segundo comando de adição (linhas 13 e 14) é responsável por adicionar um número inteiro a uma lista de instâncias da classe String.
Exceções
Uma exceção contém pelo menos uma string que a descreve, que pode ser obtida chamando o método getMessage(), mas que pode conter outras informações. Para gerar uma exceção durante a execução de um método, um objeto dessa classe deve ser criado e, através do comando throw, propagado para os métodos anteriores na pilha de execução (Código 3.16, linhas 10-15). O mesmo comando throw pode ser usado para passar uma exceção após ela ter sido capturada — por exemplo, após tratar parcialmente a exceção (Código 3.16, linhas 17–26).
Considerações finais
Estudos complementares
Primeiras palavras
Problematizando o tema
Assim como outros pacotes da linguagem Java, a parte de controle de entrada e saída de dados é orientada a objetos e utiliza os conceitos discutidos nas unidades anteriores: interfaces, classes abstratas, polimorfismo, etc. pela classe InputStreame e suas classes derivadas. Os fluxos em Java são unidirecionais, ou seja, você pode ler um fluxo de entrada (por exemplo, InputStream), mas não pode escrever nele.
Manipulação de arquivos
O método seek(long pos), que seleciona a posição relativa ao início do arquivo para a próxima operação de leitura ou gravação; Nas linhas 21 a 25, o ponteiro de leitura/escrita é colocado no início do arquivo (posição 0) e os dados são lidos na ordem em que foram escritos anteriormente; Nas linhas 31 a 33, o ponteiro de leitura/escrita é colocado no final do arquivo e um valor booleano (true) é escrito.
Leitura e escrita sequencial de bytes
A classe ByteArrayInputStream possibilita a leitura de valores originados de um array de bytes, permitindo que um pool de memória seja tratado como um fluxo de dados de entrada. A classe PipedInputStream fornece funcionalidade para ler um canal de bytes cuja origem está associada a um objeto PipedOutputStream. O código 4.6 mostra um programa que usa as classes Scanner e PrintStream para ler no teclado e escrever o que é lido em um arquivo de saída.
Leitura e escrita sequencial de caracteres
Ou seja, um arquivo lido (método readLine() – linhas 21 e 24) é lido através da associação de instâncias das classes FileInputStream e InputStreamReader (linhas 17-18) e seu conteúdo é impresso (linha 23). Ou seja, um arquivo de entrada é lido (através do método readLine()) e seu conteúdo é gravado (através do método write()) em um arquivo de saída. Desta forma é possível ler/escrever vários bytes em um único acesso ao dispositivo de entrada/saída.
Considerações finais
Estudos complementares
Primeiras palavras
Problematizando o tema
Framework de coleções
Além da estrutura de coleção Java, outro exemplo bem conhecido é a C++ Standard Template Library (JOSUTTIS, 2012). Iterável – interface que especifica que uma coleção de seus elementos pode ser alcançada através de uma estrutura for aprimorada (Seção 3.3.1). Fila – representa uma coleção ordenada de objetos, assim como uma lista, mas a semântica de uso é um pouco diferente.
Listas
Como pode ser visto no construtor da classe, a classe ArrayList foi usada como implementação da interface List. Como pode ser visto neste método, são criadas quatro instâncias de objetos – uma instância da classe Person (José) e três instâncias da classe Car (Ferrari, Audi e Porsche). Logo em seguida, as três instâncias da classe Carro são adicionadas, através da chamada do método addCarro(), à lista de carros que o objeto José possui.
Ordenação
Outro ponto importante é que o critério de classificação é totalmente aberto, definido pelo designer/programador da classe. Existe um método sort() na classe Collections que leva, além da List, um Comparator que define um critério de ordenação específico. Portanto, o método printCarros(), mostrado no Código 5.4, foi ligeiramente modificado para imprimir os carros em ordem alfabética.
Conjuntos
SortedSet
Filas
A classe PriorityQueue representa filas de prioridade e implementa a interface Queue para que os elementos sejam inseridos de acordo com a ordem natural dos elementos. No caso da classe PriorityQueue, o cabeçalho da fila é o menor elemento, de acordo com os critérios de ordenação especificados. A Figura 5.7 mostra os estados da fila de prioridade de acordo com a execução do método main() do Código 5.7.
Mapas
Entry
Algoritmos
Considerações finais
Estudos complementares
Primeiras palavras
Problematizando o tema
AWT – Abstract Windowing Toolkit
A classe Label, uma subclasse da classe Component, permite desenhar uma string (rótulo) em um campo não editável. Eventos gráficos genéricos são especializados de acordo com o tipo de evento que está sendo considerado - por exemplo, pressionar um botão do mouse gera um objeto da classe MouseEvent. O quadro está associado a uma instância de uma classe manipuladora de eventos – classWindowHandler, que é uma subclasse da classe adaptadora rajava.awt.event.WindowAdapter.
Swing
A Figura 6.16 mostra um exemplo de quadro simples composto por dois rótulos (objetos JLabel), uma área de texto (objeto JTextArea) e um campo de texto (objeto JTextField). A área de texto foi anexada a uma instância de uma classe manipuladora de eventos — a classe KeyHandler, que é uma subclasse da classe do adaptador java.awt.event.KeyAdapter. Observe que a área de texto está associada a uma instância da classe Handler, que é responsável por manipular eventos de teclado nessa área de texto.
Considerações finais
O método KeyReleased() da interface KeyListener é responsável por tratar o evento que ocorre quando uma tecla é liberada, após ser pressionada, na área de texto. Finalmente, o método windowClosing() da interface WindowListener é responsável por tratar o evento click no botão Fechar Janela. No que diz respeito ao desenvolvimento de interfaces gráficas de usuário, esta atividade é bastante facilitada se o desenvolvedor utilizar um IDE que ofereça suporte completo.
Estudos complementares
Para concluir a discussão desta unidade, é importante observar que a linguagem Java não requer o uso de um IDE. Todos os comandos necessários para o desenvolvimento podem ser feitos em um terminal de comando. A próxima unidade apresenta conceitos relacionados às operações de acesso e manipulação de bancos de dados na linguagem de programação Java.
Primeiras palavras
Problematizando o tema
Modelo de dados relacional
- JDBC
O driver JDBC consiste em um componente de software que permite que uma aplicação Java interaja com um banco de dados. Para conectar-se a bancos de dados individuais, o JDBC requer drivers para cada SGBD (PostgreSQL, MySQL, etc.). Depois que o driver for carregado, o aplicativo Java poderá estabelecer uma conexão com o sistema de gerenciamento de banco de dados.
Mapeamento objeto-relacional
No caso do mecanismo de persistência do sistema de gerenciamento de arte, a classe ObjectDTO torna-se a raiz da hierarquia de objetos que podem ser persistidos no banco de dados. Como a classe ArtWork é abstrata, ela não pode ter instâncias; conseqüentemente, apenas instâncias de suas subclasses podem persistir em um banco de dados. A classe GenericJDBCDAO (Código 7.7) implementa parcialmente a interface IGenericDAO usando a API JDBC discutida anteriormente nesta unidade como uma estratégia de persistência de dados.