• Nenhum resultado encontrado

Introdução à Programação Orientada a Objetos em Java

N/A
N/A
Protected

Academic year: 2023

Share "Introdução à Programação Orientada a Objetos em Java"

Copied!
243
0
0

Texto

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.

Figura 1.1 Paradigmas.
Figura 1.1 Paradigmas.

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.

Figura 1.2 Diagrama de classes UML: classe Conta.
Figura 1.2 Diagrama de classes UML: classe Conta.

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.

Figura 2.4 Exemplo da execução da classe ExemploIf.
Figura 2.4 Exemplo da execução da classe ExemploIf.

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.

Tabela 2.2 Palavras reservadas em Java.
Tabela 2.2 Palavras reservadas em Java.

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.

Figura 3.1 Gerenciamento de obras de arte de um museu.
Figura 3.1 Gerenciamento de obras de arte de um museu.

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.

Figura 5.1 Principais interfaces do framework de coleções Java.
Figura 5.1 Principais interfaces do framework de coleções Java.

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.

Figura 5.2 Listas – hierarquia de classes e interfaces.
Figura 5.2 Listas – hierarquia de classes e interfaces.

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 headSet(T element) – retorna um subconjunto dos elementos menor que o elemento passado como argumento para o método; SortedSet tailSet(T element) – retorna um subconjunto dos elementos maior que o elemento passado como argumento para o método. NavigableSet descendenteSet() – retorna um conjunto onde a ordem é invertida em comparação ao conjunto original;.

Figura 5.5 Execução da classe Museu.
Figura 5.5 Execução da classe Museu.

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.

Figura 5.6 Filas – hierarquia de classes e interfaces.
Figura 5.6 Filas – hierarquia de classes e interfaces.

Mapas

Entry firstEntry() – retorna o mapa chave/valor associado à menor chave no mapa, ou nulo, se o mapa estiver vazio;. Entry floorEntry(key K) – retorna o mapa chave/valor associado à maior chave que é menor ou igual à chave passada como argumento, ou nulo, se a chave não for encontrada no mapa; . Entry lastEntry() – retorna o mapa chave/valor associado à maior chave no mapa ou nulo se o mapa estiver vazio.

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.

Figura 6.1 Hierarquia de componentes gráficos presentes na biblioteca AWT.
Figura 6.1 Hierarquia de componentes gráficos presentes na biblioteca AWT.

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.

Figura 6.11 Hierarquia de componentes gráficos presentes na biblioteca Swing.
Figura 6.11 Hierarquia de componentes gráficos presentes na biblioteca Swing.

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.

Tabela 7.1 Saída da execução da classe ListaObrasDeArte.
Tabela 7.1 Saída da execução da classe ListaObrasDeArte.

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.

Imagem

Figura 1.1 Paradigmas.
Figura 1.2 Diagrama de classes UML: classe Conta.
Figura 1.5 Identidade de objetos: objeto inacessível.
Figura 1.8 Diagrama de classes UML: Hierarquia de classes.
+7

Referências

Documentos relacionados

Neste trabalho é proposto o desenvolvimento e implementação de um sistema computacional orientado a objetos na linguagem Java que é capaz de fazer o