Programação Orientada a Objetos - JAVA

Programação Orientada a Objetos - JAVA

(Parte 1 de 12)

Programação Orientada a Objetos: Uma Abordagem com Java

Ivan Luiz Marques Ricarte 2001

Sumário

1.1 Classes3
1.2 Objetos4
1.3 Herança6
1.4 Polimorfismo6

1 Fundamentos da programação orientada a objetos 3

2.1 Tipos primitivos8
2.2 Identificadores10
2.3 Expressões1
2.3.1 Expressões retornando valores numéricos1
2.3.2 Expressões retornando valores booleanos12
2.3.3 Outros tipos de expressões13
2.3.4 Controle do fluxo de execução13
2.3.5 Comentários15
2.4 Operações sobre objetos16
2.4.1 Arranjos18
2.4.2 Strings19
2.5 Classes em Java20
2.5.1 Pacotes20
2.5.2 Definição de classes em Java21
2.5.3 O método main24
2.5.4 Visibilidade da classe e seus membros25
2.5.5 Classes derivadas25
2.5.6 Classes abstratas e finais27
2.5.7 Interfaces28
2.6 Exceções29
2.6.1 Tratamento de exceções30
2.6.2 Erros e exceções de runtime31
2.6.3 Propagando exceções32
2.6.4 Definindo e gerando exceções32
2.7 O ambiente de Java3
2.7.1 Ferramentas do Java SDK34
2.7.2 Geração de código portátil34

2 Princípios da programação na linguagem Java 8 1

2.7.3 Desenvolvimento de aplicações35

Programação orientada a objetos com Java Sumário

3.1 Funcionalidades básicas37
3.2 Entrada e saída38
3.2.1 Transferência de texto39
3.2.2 Transferência de bytes40
3.2.3 Manipulação de arquivos41
3.2.4 Serialização42
3.3 Framework de coleções43
3.4 Extensões padronizadas45

3 Uso das classes da API padrão de Java 37

4.1 Apresentação gráfica46
4.2 Interfaces gráficas com usuários47
4.2.1 Eventos da interface gráfica47
4.2.2 Componentes gráficos50
4.2.3 Containers54
4.2.4 Janelas5
4.2.5 Gerenciadores de layout57
4.3 Desenvolvimento de applets65
4.3.1 Criação de applet6
4.3.2 Execução de applets67
4.3.3 Passagem de parâmetros68
4.3.4 Contexto de execução69

4 Desenvolvimento de aplicações gráficas 46

5.1 Programação cliente-servidor72
5.1.1 Conceitos preliminares73
5.1.2 Aplicações TCP/IP75
5.1.3 Aplicações UDP79
5.1.4 Aplicações HTTP81
5.2 Acesso a bancos de dados83
5.2.1 Bancos de dados relacionais84
5.2.2 SQL85
5.2.3 JDBC87
5.3 Servlets90
5.3.1 Ciclo de vida de um servlet91
5.3.2 Fundamentos da API de servlets92
5.4 Programação com objetos distribuídos94
5.4.1 Arquiteturas de objetos distribuídos94
5.4.2 Java RMI96
5.4.3 Java IDL113

5 Desenvolvimento de aplicações distribuídas 72 A Palavras chaves de Java 117

Capítulo 1

Fundamentos da programação orientada a objetos

Neste capítulo são apresentados os conceitos básicos que permeiam o uso das técnicas de orientação a objetos na programação, sempre utilizando a linguagem Java como motivador.

Objetos são instâncias de classes, que determinam qual informação um objeto contém e como ele pode manipulá-la.

Um dos grandes diferenciais da programação orientada a objetos em relação a outros paradigmas de programação que também permitem a definição de estruturas e operações sobre essas estruturas está no conceito de herança, mecanismo através do qual definições existentes podem ser facilmente estendidas. Juntamente com a herança deve ser enfatizada a importância do polimorfismo, que permite selecionar funcionalidades que um programa irá utilizar de forma dinâmica, durante sua execução.

1.1 Classes

A definição de classes e seus inter-relacionamentos é o principal resultado da etapa de projeto de software. Em geral, esse resultado é expresso em termos de alguma linguagem de modelagem, tal como UML.

Uma classe é um gabarito para a definição de objetos. Através da definição de uma classe, descreve-se que propriedades — ou atributos — o objeto terá.

Além da especificação de atributos, a definição de uma classe descreve também qual o comportamento de objetos da classe, ou seja, que funcionalidades podem ser aplicadas a objetos da classe. Essas funcionalidades são descritas através de métodos. Um método nada mais é que o equivalente a um procedimento ou função, com a restrição que ele manipula apenas suas variáveis locais e os atributos que foram definidos para a classe.

Uma vez que estejam definidas quais serão as classes que irão compor uma aplicação, assim como qual deve ser sua estrutura interna e comportamento, é possível criar essas classes em Java.

Na Unified Modeling Language (UML), a representação para uma classe no diagrama de classes é tipicamente expressa na forma gráfica, como mostrado na Figura 1.1.

Como se observa nessa figura, a especificação de uma classe é composta por três regiões: o nome da classe, o conjunto de atributos da classe e o conjunto de métodos da classe.

Programação orientada a objetos com Java 1.2. Objetos

NomeClasse visibilidade nomeAtributo : tipo = valor default visibilidade nomeAtributo : tipo = valor default ...

visibilidade nomeMétodo(listaArgumentos) : tipoRetorno visibilidade nomeMétodo(listaArgumentos) : tipoRetorno ...

Figura 1.1: Uma classe em UML.

O nome da classe é um identificador para a classe, que permite referenciá-la posteriormente — por exemplo, no momento da criação de um objeto.

O conjunto de atributos descreve as propriedades da classe. Cada atributo é identificado por um nome e tem um tipo associado. Em uma linguagem de programação orientada a objetos pura, o tipo é o nome de uma classe. Na prática, a maior parte das linguagens de programação orientada a objetos oferecem um grupo de tipos primitivos, como inteiro, real e caráter, que podem ser usados na descrição de atributos. O atributo pode ainda ter um valor_default opcional, que especifica um valor inicial para o atributo.

Os métodos definem as funcionalidades da classe, ou seja, o que será possível fazer com objetos dessa classe. Cada método é especificado por uma assinatura, composta por um identificador para o método (o nome do método), o tipo para o valor de retorno e sua lista de argumentos, sendo cada argumento identificado por seu tipo e nome.

Através do mecanismo de sobrecarga (overloading), dois métodos de uma classe podem ter o mesmo nome, desde que suas assinaturas sejam diferentes. Tal situação não gera conflito pois o compilador é capaz de detectar qual método deve ser escolhido a partir da análise dos tipos dos argumentos do método. Nesse caso, diz-se que ocorre a ligação prematura (early binding) para o método correto.

O modificador de visibilidade pode estar presente tanto para atributos como para métodos. Em princípio, três categorias de visibilidade podem ser definidas:

público, denotado em UML pelo símbolo +: nesse caso, o atributo ou método de um objeto dessa classe pode ser acessado por qualquer outro objeto (visibilidade externa total); privativo, denotado em UML pelo símbolo -: nesse caso, o atributo ou método de um objeto dessa classe não pode ser acessado por nenhum outro objeto (nenhuma visibilidade externa); protegido, denotado em UML pelo símbolo #: nesse caso, o atributo ou método de um objeto dessa classe poderá ser acessado apenas por objetos de classes que sejam derivadas dessa através do mecanismo de herança (ver Seção 1.3).

1.2 Objetos

Objetos são instâncias de classes. É através deles que (praticamente) todo o processamento ocorre em sistemas implementados com linguagens de programação orientadas a objetos. O uso racional de

Programação orientada a objetos com Java 1.2. Objetos objetos, obedecendo aos princípios associados à sua definição conforme estabelecido no paradigma de desenvolvimento orientado a objetos, é chave para o desenvolvimento de sistemas complexos e eficientes.

Um objeto é um elemento que representa, no domínio da solução, alguma entidade (abstrata ou concreta) do domínio de interesse do problema sob análise. Objetos similares são agrupados em classes.

No paradigma de orientação a objetos, tudo pode ser potencialmente representado como um objeto. Sob o ponto de vista da programação orientada a objetos, um objeto não é muito diferente de uma variável normal. Por exemplo, quando define-se uma variável do tipo int em uma linguagem de programação como C ou Java, essa variável tem:um espaço em memória para registrar o seu estado (valor);um conjunto de operações que podem ser aplicadas a ela, através dos operadores definidos na linguagem que podem ser aplicados a valores inteiros.

Da mesma forma, quando se cria um objeto, esse objeto adquire um espaço em memória para armazenar seu estado (os valores de seu conjunto de atributos, definidos pela classe) e um conjunto de operações que podem ser aplicadas ao objeto (o conjunto de métodos definidos pela classe).

Um programa orientado a objetos é composto por um conjunto de objetos que interagem através de “trocas de mensagens”. Na prática, essa troca de mensagem traduz-se na aplicação de métodos a objetos.

As técnicas de programação orientada a objetos recomendam que a estrutura de um objeto e a implementação de seus métodos devem ser tão privativos como possível. Normalmente, os atributos de um objeto não devem ser visíveis externamente. Da mesma forma, de um método deve ser suficiente conhecer apenas sua especificação, sem necessidade de saber detalhes de como a funcionalidade que ele executa é implementada.

Encapsulação é o princípio de projeto pelo qual cada componente de um programa deve agregar toda a informação relevante para sua manipulação como uma unidade (uma cápsula). Aliado ao conceito de ocultamento de informação, é um poderoso mecanismo da programação orientada a objetos.

Ocultamento da informação é o princípio pelo qual cada componente deve manter oculta sob sua guarda uma decisão de projeto única. Para a utilização desse componente, apenas o mínimo necessário para sua operação deve ser revelado (tornado público).

Na orientação a objetos, o uso da encapsulação e ocultamento da informação recomenda que a representação do estado de um objeto deve ser mantida oculta. Cada objeto deve ser manipulado exclusivamente através dos métodos públicos do objeto, dos quais apenas a assinatura deve ser revelada. O conjunto de assinaturas dos métodos públicos da classe constitui sua interface operacional.

Dessa forma, detalhes internos sobre a operação do objeto não são conhecidos, permitindo que o usuário do objeto trabalhe em um nível mais alto de abstração, sem preocupação com os detalhes internos da classe. Essa facilidade permite simplificar a construção de programas com funcionalidades complexas, tais como interfaces gráficas ou aplicações distribuídas.

Programação orientada a objetos com Java 1.3. Herança

1.3 Herança

O conceito de encapsular estrutura e comportamento em um tipo não é exclusivo da orientação a objetos; particularmente, a programação por tipos abstratos de dados segue esse mesmo conceito. O que torna a orientação a objetos única é o conceito de herança.

Herança é um mecanismo que permite que características comuns a diversas classes sejam fatoradas em uma classe base, ou superclasse. A partir de uma classe base, outras classes podem ser especificadas. Cada classe derivada ou subclasse apresenta as características (estrutura e métodos) da classe base e acrescenta a elas o que for definido de particularidade para ela. Há várias formas de relacionamentos em herança:

Extensão: a subclasse estende a superclasse, acrescentando novos membros (atributos e/ou métodos). A superclasse permanece inalterada, motivo pelo qual este tipo de relacionamento é normalmente referenciado como herança estrita.

Especificação: a superclasse especifica o que uma subclasse deve oferecer, mas não implementa nenhuma funcionalidade. Diz-se que apenas a interface (conjunto de especificação dos métodos públicos) da superclasse é herdada pela subclasse.

Combinação de extensão e especificação: a subclasse herda a interface e uma implementação padrão de (pelo menos alguns de) métodos da superclasse. A subclasse pode então redefinir métodos para especializar o comportamento em relação ao que é oferecido pela superclasse, ou ter que oferecer alguma implementação para métodos que a superclasse tenha declarado mas não implementado. Normalmente, este tipo de relacionamento é denominado herança polimórfica.

(Parte 1 de 12)

Comentários