Escolar Documentos
Profissional Documentos
Cultura Documentos
Livro-Texto - Unidade II
Livro-Texto - Unidade II
Unidade II
3 PROGRAMAÇÃO ORIENTADA A OBJETOS
Anteriormente, nós conhecemos a tecnologia Java e vimos, de maneira bastante superficial, que
essa tecnologia é orientada a objetos. A partir de agora vamos abordar em mais detalhes como o
Java implementa os recursos que tornam o paradigma orientado a objetos o principal paradigma de
desenvolvimento de sistemas.
Lembrete
3.1 Sobrecarga
A sobrecarga pode ser feita com qualquer método, ou seja, podemos criar quantos métodos
queiramos em uma classe com o mesmo nome, desde que eles tenham uma lista de parâmetros que
seja diferente em quantidade, em tipo ou em quantidade e tipo. Quando sobrecarregamos um método,
estamos dizendo que todos os métodos sobrecarregados realizam a mesma tarefa, mas de maneiras
diferentes. Considere a seguinte classe:
59
Unidade II
Note que a classe da figura anterior define quatro versões do método soma(), cada uma com uma
lista de parâmetros diferentes. A primeira sobrecarga recebe dois int; a segunda três int; a terceira dois
double; e a quarta três float. Note que os nomes dos parâmetros não fazem a menor diferença, apenas
os seus tipos. Se na classe acima for criada uma nova sobrecarga, como mostrado na figura anterior, o
código apresenta erros e não pode ser compilado.
60
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
O próprio editor de código indica que há um erro na declaração dos métodos nas linhas 5 e 21.
Ao flutuar o mouse por cima do erro – flutuar significa mover o cursor sobre o erro e não clicar –,
o editor indica que o método soma(int, int) está duplicado, mesmo que os nomes dos parâmetros
sejam diferentes.
Observação
3.2 Herança
Um dos recursos mais importantes da orientação a objetos é a herança. Ela é um mecanismo que
permite que uma classe “herde” os atributos e métodos de uma outra classe. No jargão de programação,
chamamos a classe que herda de classe filha, enquanto chamamos a classe da qual a filha herda de
classe pai. Outros nomes para classe pai são superclasse e classe geral. A classe filha também pode ser
chamada de subclasse e classe especializada.
Considere a classe Pessoa, vista anteriormente. Ela é útil para armazenar os dados de uma pessoa
genérica. Agora considere que desejamos armazenar os dados de um aluno. Muitos dos elementos da
classe Aluno serão os mesmos da classe Pessoa.
Observação
Sempre que passar pela sua cabeça a sensação de que algo que você
está programando é igual a algo que você já programou, tenha certeza de
que há uma maneira melhor de realizar essa mesma tarefa. Em orientação
a objetos não se repete código. Sempre que um programador repete um
código, ele está errando.
Ao criar a classe Aluno, pode-se aproveitar o que já foi feito na classe Pessoa, herdando da classe
Pessoa. A partir daí a classe Aluno já possui todos os atributos e métodos da classe Pessoa. Ela só precisa
declarar atributos e métodos que são específicos de um aluno.
61
Unidade II
Na linha 3, a classe Aluno é declarada com a palavra reservada extends, que indica que a classe herda
da classe Pessoa. A partir daqui, a classe já possui todos os atributos e métodos da classe Pessoa. Note
que só foram declarados os atributos e métodos que pertencem apenas a um aluno.
Na linha 12, o método setRa() agora faz consistência do seu parâmetro, para ter certeza de que
ele não é um String vazio. Entretanto, não se pode escrever a comparação ra != “”, pois os operadores
lógicos não funcionam como se espera quando os operandos são objetos, apenas quando eles são de
tipos primitivos. Quando a comparação é feita com objetos, como é o caso de Strings, utilize o método
equals(), que retorna verdadeiro se o objeto que executa o método tem o mesmo conteúdo que o
objeto no parâmetro do método. Na linha 15, caso o parâmetro recebido pelo método não seja válido, o
método irá lançar uma exceção do tipo IllegalArgumentException com a mensagem de erro RA inválido.
Dessa forma, o método que tentou atribuir o RA inválido pode tratar a exceção e tentar obter um valor
válido para o RA.
Observação
A partir de agora, pode-se instanciar um objeto da classe Aluno, atribuir valores ao seu nome,
telefone e RA e executar o método apresente().
62
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
3.3 Sobrescrita
Note que o método apresente() apenas informa o nome e o telefone do aluno. Dessa forma, ele deve
ser modificado. Nós podemos sobrescrever, ou seja, modificar o método na classe filha para que ele se
comporte da maneira desejada. Essa é mais uma modalidade de polimorfismo.
Nas linhas 27 a 30 é definido o construtor da classe que recebe três parâmetros: nome, telefone e Ra.
Na linha 28 poderíamos ter feito a atribuição dos valores do nome e telefone diretamente usando os
métodos acessores dos atributos. Mas a classe Pessoa já realiza essa tarefa em um de seus construtores.
Nós podemos invocar diretamente tal construtor de dentro de nosso construtor, na primeira linha,
usando a palavra reservada super, que referencia a superclasse. Essa referência funciona de maneira
análoga à referência this, mas enquanto this referencia o próprio objeto, super referencia a superclasse.
63
Unidade II
3.4 Polimorfismo
O polimorfismo de classes é o aspecto mais importante da orientação a objetos. Com esse recurso,
quando bem utilizado, podemos criar soluções simples e eficientes para problemas que teriam soluções
grandes, trabalhosas e ineficientes se fosse utilizado apenas o paradigma estruturado de programação.
O polimorfismo de classes é um recurso que permite que um objeto de uma classe seja tratado como
se fosse de outra classe. Para que isso seja possível, ambas as classes devem estar na mesma estrutura
hierárquica, e, além disso, uma delas deve ser um ancestral da outra.
Considere o seguinte exemplo: uma loja de rua permite a entrada de qualquer pessoa por sua porta
principal. A loja não faz distinção se a pessoa que entra é um aluno, um professor, um funcionário,
um motorista ou qualquer outra especialização de pessoa. Por outro lado, uma escola possui catracas
que só permitem a entrada de alunos. Outros tipos de pessoas não têm a sua entrada permitida.
Em termos de orientação a objetos, a catraca da escola pode ser considerada como um método
que recebe apenas objetos da classe Aluno como parâmetro. Já a entrada da loja é um método que
recebe como parâmetro objetos da classe Pessoa. Como Aluno é uma subclasse de Pessoa, é uma
especialização, é um tipo de Pessoa, o Aluno também pode ser enviado como parâmetro para a loja
por polimorfismo.
64
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
65
Unidade II
Nas linhas 7 a 10 é definido o método catracaDaEscola(), que recebe como parâmetro um objeto
da classe Aluno.
Nas linhas 12 a 15 é definido o método entradaDaLoja(), que recebe como parâmetros um objeto da
classe Pessoa. Por polimorfismo, como Aluno é um tipo de Pessoa, ele também pode ser passado como
parâmetro para esse método.
Nas linhas 17 a 25 é feito o código de teste. Nas linhas 18 e 19 são instanciados objetos das classes
Aluno e Pessoa, respectivamente. Na linha 21 o aluno é passado para o método catracaDaEscola().
Na linha 22 a pessoa é passada para o método entradaDaLoja(). Já na linha 24 ocorre o polimorfismo:
o aluno é passado para o método entradaDaLoja(). Mesmo que esse método receba como parâmetro um
objeto da classe Pessoa, ele aceita o objeto aluno, pois ele é um tipo de Pessoa. Repare que na terceira
saída do programa o aluno Joaquim é tratado como uma pessoa, não como um aluno.
Lembrete
Agora que já abordamos os principais aspectos da orientação a objetos, podemos dar mais atenção
aos modificadores de acesso.
Observação
A orientação a objetos define quatro modificadores de acesso para os membros (atributos e métodos)
da classe, os quais são adotados pela linguagem Java. Eles são:
• Public (público): qualquer classe que tenha acesso à classe em que o membro está declarado terá
acesso ao membro.
66
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
• Protected (protegido): apenas a própria classe e suas subclasses têm acesso ao membro.
Em Java, o modificador protected também permite acesso ao membro por classes do mesmo
pacote, mesmo que não sejam subclasses.
• Padrão (ou pacote): membros definidos sem nenhuma palavra reservada são de acesso padrão
ou pacote, ou seja, a própria classe e qualquer classe do mesmo pacote têm acesso ao membro.
• Private (privado): apenas a própria classe na qual o membro é declarado tem acesso a ele.
É uma boa prática de programação definir todos os membros inicialmente com o modificador mais
restritivo (privado). Conforme a necessidade de acesso ao membro vai surgindo, o modificador de acesso
deve ser alterado gradativamente na direção do modificador público.
3.6 Escopo
Os membros de uma classe normalmente pertencem aos seus objetos. Por exemplo, o atributo nome
da classe Pessoa pertence aos objetos da classe Pessoa. Cada um dos objetos pode ter um valor diferente
para o atributo nome. Da mesma maneira, o método apresente() só pode ser chamado de um objeto. Isso
é chamado de escopo de objeto.
67
Unidade II
Um membro pode, por outro lado, pertencer à classe, não aos seus objetos, caracterizando o escopo
de classe. O escopo de classe é definido pela palavra reservada static. Um método de classe pode ser
chamado diretamente da sua classe, não sendo necessário instanciar nenhum objeto da classe. Os métodos
showMessageDialog(), showInputDialog() e showConfirmDialog() puderam ser chamados diretamente
da classe JOptionPane, sem a necessidade de instanciar um objeto da classe para executar esses métodos.
Da mesma forma, o método main() também é de classe, porque para executar um programa, a
máquina virtual não irá instanciar qualquer objeto, ela irá simplesmente executar o método da classe
em que ele foi declarada.
Um atributo de escopo de classe terá o mesmo valor para a classe e para todos os seus objetos. Se o
seu valor for modificado em qualquer um deles, o valor será modificado em todos.
Observação
O exemplo a seguir utiliza um atributo de classe para contar quantas vezes ele foi instanciado.
68
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
Nas linhas 7 a 9 é definido o construtor da classe. O construtor é executado toda vez que um objeto
da classe é instanciado, e, quando isso acontece, o atributo contador é incrementado.
Nas linhas 9 a 11 a classe Contador é instanciada cem vezes. Nas linhas seguintes ela é instanciada
mais duas vezes. O conteúdo do atributo contador é apresentado nas linhas 15 a 17.
Considere que estamos desenvolvendo um programa de desenho por computador. Esse programa
usa figuras geométricas, como o retângulo, o triângulo e o círculo. Uma das funcionalidades desse
programa é calcular a área de todas as figuras no desenho.
Para aproveitar o polimorfismo, vamos criar uma estrutura hierárquica de classes para modelar as
figuras geométricas do sistema. Assim, as classes Retangulo, Triangulo e Circulo serão todas subclasses
da classe FiguraGeometrica. A classe FiguraGeometrica irá definir o método calculaArea(), que será
69
Unidade II
sobrescrito por todas as subclasses. As sobrescritas do método, então, irão realizar o cálculo correto da
área de cada figura. Para que o código não fique muito extenso, não vamos encapsular os atributos.
Nas linhas 6 a 8 é definido o método calculaArea(), o qual existe apenas para permitir o polimorfismo.
Como não é possível calcular a área de uma figura geométrica genérica, o método retorna um valor
negativo para indicar que ele não deve ser usado. O mesmo ocorre com o método getNome(), entre as
linhas 7 e 9, que irá retornar o nome da figura geométrica.
70
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
As três subclasses sobrescrevem o método calculaArea() entre as linhas 7 e 9, cada uma com a
equação apropriada. Note que na classe Circulo, o cálculo é feito com a ajuda da classe Math, a qual
define uma constante com o valor de π (pi) e o método pow(), o qual realiza a potência de raio elevado
a 2. O método getNome(), entre as linhas 11 e 13, retorna o nome da figura geométrica apropriada.
71
Unidade II
As subclasses também definem seus construtores, os quais já fazem a atribuição de valores aos seus
atributos. A seguir, o programa de teste:
No método main(), entre as linhas 13 e 27, é feita a rotina de teste. Na linha 14 é declarado e
instanciado um vetor de três posições de FiguraGeometrica. Nas linhas 16 a 18, cada uma das posições
recebe um objeto de uma de cada das classes de figuras geométricas especializadas. Nesse ponto já
ocorre polimorfismo. Entre as linhas 22 e 24 é feito um laço for aprimorado para percorrer o vetor e
72
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
obter a sua representação em texto. Cada representação é anexada à variável mensagem, com o caracter
de escape \n, que representa uma quebra de linha. Na linha 26 é exibida a caixa de diálogo.
O programa acima realiza a sua tarefa, mas não muito bem. O problema está na classe FiguraGeometrica,
a qual define métodos que não pode implementar e, por isso, faz uma implementação propositalmente
errada. A orientação a objetos oferece uma alternativa: nós podemos declarar métodos abstratos, ou
seja, métodos sem implementação. Quando se criam métodos abstratos em uma classe, essa classe
também deve ser abstrata. Assim, podemos modificar a classe FiguraGeometrica da seguinte forma, e o
restante do programa pode permanecer inalterado.
Nas linhas 5 e 7 as declarações dos métodos são agora de métodos abstratos. Por isso, eles agora não
possuem implementação e são terminados com ponto-e-vírgula. A classe agora também deve ser abstrata.
Uma classe abstrata pode definir métodos e atributos concretos (não abstratos). Mas por conter
métodos sem implementação, uma classe abstrata não pode ser instanciada. Ela só pode ser usada com
polimorfismo, como foi feito no exemplo. Além disso, as classes que herdam de uma classe abstrata
devem implementar todos os seus métodos abstratos se quiserem ser classes concretas, caso contrário,
elas também serão abstratas. Isso é útil para garantir que as subclasses implementaram todos os métodos
que deveriam ser sobrescritos, caso eles fossem concretos, como na primeira versão deste exemplo.
Considere agora uma classe abstrata que só declara métodos abstratos, como no exemplo anterior.
Uma classe desse tipo pode ser mais bem modelada como uma interface. Uma interface é uma classe
abstrata que só define métodos abstratos. Uma classe que realize uma interface (não se usa o termo
herdar de uma interface) deve implementar todos os seus métodos. Assim, poderíamos ter:
73
Unidade II
Como não se pode herdar de uma interface, apenas realizá-la, as classes Retangulo, Triangulo e
Circulo devem ser alteradas, trocando a palavra reservada extends por implements:
4 INTERFACES GRÁFICAS
Há duas maneiras de criar interfaces gráficas usando Java. A primeira é escrevendo o código nós
mesmos. A segunda é usando um editor de interfaces gráficas. A abordagem manual costuma dar ao
programador muito mais controle sobre a interface que ele está criando, também costuma gerar código
mais enxuto e eficiente. Já a abordagem com auxílio de um editor de interfaces costuma permitir um
processo mais rápido de criação da interface.
Existem vários plug-ins que dão a funcionalidade de edição de interface gráfica ao Eclipse. Algumas
versões do Eclipse já vêm com editor de interfaces gráficas WindowBuilder. Caso a sua versão não
possua tal ferramenta, você pode instalá-la direto da loja de componentes do Eclipse.
Observação
Para instalar o WindowBuilder, clique no menu [Help] -> [Eclipse Marketplace...]. Será apresentada
uma janela semelhante à da figura a seguir:
74
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
Para criar uma interface gráfica, vamos usar o Window Builder. Clique com o botão direito em um
pacote, selecione new... e então other.
75
Unidade II
Expanda o grupo WindowBuilder, Swing Designer e escolha JFrame. Clique em Next. Dê o nome
TelaPessoa à sua classe e clique em Finish. Nesse ponto é apresentado o editor de código com a
classe TelaPessoa, mas dessa vez há duas abas novas, Source e Design.
76
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
Selecione a aba Design e maximize a janela de edição dando um duplo clique na aba TelaPessoa.
A sua IDE deve se parecer com a figura a seguir:
77
Unidade II
Clique na área da janela para fazer com que suas propriedades sejam exibidas. A seguir, modifique
seu gerenciador de layout para absolute layout.
78
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
Observação
79
Unidade II
Selecione agora um JTextiField e posicione-o na janela. Modifique seu tamanho para que fique
semelhante ao da figura a seguir. Mude também seu nome para textFieldNome.
80
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
Insira agora um JLabel com o texto “Telefone:” e um JTextField chamado textFieldTelefone, como
mostra a próxima figura:
81
Unidade II
Agora insira um JButton. Mude seu nome para btnApresenta e seu texto para “Apresenta”.
82
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
Agora vamos associar uma ação ao botão btnApresente. Dê um duplo clique no botão. O editor irá
criar o código associado à ação de clique e o levará ao código, como mostra a figura a seguir:
83
Unidade II
Esse é o código que cria e configura o botão btnApresente. Nas linhas 65 a 68 é criada uma
instância de uma classe anônima que realiza a interface ActionListener. Essa interface define o método
actionPerformed(), que é o método que é executado quando o botão for clicado. É nesse método que
vamos criar a nossa ação, como mostrado na figura a seguir:
Na linha 68 é chamado o método showMessageDialog(), dessa vez com a janela representada pelo
objeto instanciado da classe TelaPessoa (TelaPessoa.this). Quando a caixa de mensagem for exibida,
ela será centralizada na janela do aplicativo. Além disso, o usuário não será capaz de retornar à janela
sem que tenha fechado antes a caixa de diálogo. A seguir a mensagem é formatada, buscando as
informações digitadas pelo usuário nos objetos textFieldNome e textiFieldTelefone. O texto é recuperado
com o método getText().
84
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
Resumo
85
Unidade II
Exercícios
Questão 1. (TJ-PA 2020) Na programação orientada a objetos, a herança é uma técnica de abstração
que permite categorizar as classes de objetos sob certos critérios, especificando-se as características
dessas classes. As classes que são vinculadas por meio de relacionamentos de herança formam uma
hierarquia de herança. Na linguagem de programação Java, o relacionamento de herança é definido
pela palavra-chave:
A) static.
B) extends.
C) public.
D) new.
E) this.
Análise da questão
Um dos recursos mais importantes da orientação a objetos é a herança. Ela é um mecanismo que
permite que uma classe herde os atributos e métodos de uma outra classe. No jargão de programação,
chamamos a classe que herda de classe filha, enquanto chamamos a classe da qual a filha herda de
classe pai. Outros nomes para classe pai são superclasse e classe geral. A classe filha também pode ser
chamada de subclasse e classe especializada. Ao se criar uma classe filha, pode-se aproveitar o que já foi
feito na classe pai herdando da classe pai todos os atributos. A partir daí, a classe filha já possui todos
os atributos e métodos da classe pai. Ela só precisa declarar os atributos e métodos que são específicos
da classe filha. Assim, a classe filha é declarada com a palavra reservada extends, que indica que a classe
filha herda da classe pai todos os atributos e métodos da classe pai.
Questão 2. (Ibade 2019) Os modificadores de acesso são padrões de visibilidade de acessos às classes,
atributos e métodos. Esses modificadores são palavras-chave reservadas pelo Java, ou seja, palavras
reservadas não podem ser usadas como nome de métodos, classes ou atributos. Os modificadores de
acesso são classificados conforme as descrições a seguir:
(1) Indica que método ou variável só podem ser acessados de dentro da classe que os criou.
Uma classe que herde de uma superclasse com atributos declarados de acordo com esse modificador só
poderá ter acesso a eles através dos métodos públicos da própria superclasse, caso contrário, não haverá
acesso a estes atributos.
86
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS
(2) Indica que o método ou a variável assim declarada possa ser acessada somente dentro do pacote
em que está contida através de uma subclasse.
(3) Indica que a classe, método ou variável assim declarada possa ser acessada em qualquer lugar e
a qualquer momento da execução do programa.
Os modificadores de acesso descritos como (1), (2) e (3) são denominados, respectivamente:
Análise da questão
(1) Indica que método ou variável só podem ser acessados de dentro da classe que os criou. Uma
classe que herde de uma superclasse com atributos declarados de acordo com esse modificador só
poderá ter acesso a eles através dos métodos públicos da própria superclasse, caso contrário, não haverá
acesso a estes atributos. Private: classe.
(2) Indica que o método ou a variável assim declarada possa ser acessada somente dentro do pacote
em que está contida através de uma subclasse. Protected: classe, subclasse e pacote.
(3) Indica que a classe, método ou variável assim declarada possa ser acessada em qualquer lugar e
a qualquer momento da execução do programa. Public: acesso global.
87