Você está na página 1de 29

TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS

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.

O aspecto mais importante da orientação a objetos é o polimorfismo. O termo polimorfismo origina-se


do grego e significa muitas formas (poli = muitas; morphos = formas). As principais manifestações
desse recurso são a sobrecarga, a sobrescrita e o polimorfismo de objetos.

Lembrete

Toda linguagem orientada a objetos é, em primeiro lugar, uma


linguagem estruturada. Uma linguagem estruturada é uma linguagem que
não permite desvios incondicionais (o GOTO do Basic, por exemplo), ela
permite apenas desvios condicionais (if, for, while e do-while).

3.1 Sobrecarga

A sobrecarga de métodos já foi vista anteriormente, quando abordamos os métodos construtores


de uma classe. Naquela ocasião, apenas dissemos que uma classe pode apresentar mais de um método
construtor, desde que estes tenham uma lista de parâmetros diferentes.

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

Figura 49 – Sobrecarga de métodos

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.

Figura 50 – Exemplo de uma sobrecarga inválida

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

Ao flutuar o mouse sobre um erro no código, pode ser apresentada


uma solução automática para o erro. Cuidado! Apenas execute a solução
automática se você entende o que ela está fazendo. Caso não saiba o que
o editor está fazendo, a situação pode até piorar. Isso ocorre porque a
solução automática realiza alguma mudança no código para que ele possa
ser compilado, mas a mudança pode não ser a que você espera. Nesse caso,
encontrar o erro pode ser ainda mais difícil, pois você já não terá mais uma
indicação visual.

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

Figura 51 – Classe Aluno que especializa a classe Pessoa

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

É uma boa prática de programação lançar uma exceção quando alguma


rotina de validação de dados não for bem-sucedida. Modifique a classe
Pessoa para que ela se comporte dessa maneira.

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.

Figura 52 – Exemplo de sobrescrita

O método apresente() na linha 21 possui exatamente a mesma assinatura do método herdado da


superclasse, ou seja, ele possui o mesmo nome, os mesmos parâmetros e o mesmo tipo de retorno. Isso
caracteriza uma sobrescrita do método. Note também que, na linha 23, não podemos mais acessar
diretamente os atributos nome e telefone, pois ambos são privados na classe Pessoa. Por isso, fazemos
o acesso por meio de seus métodos acessores.

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

O programa da figura a seguir ilustra a instanciação e o uso de um objeto da classe Aluno:

Figura 53 – Instanciando a classe Aluno

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

Figura 54 – Exemplo de polimorfismo de classes

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

O polimorfismo está presente na maioria das melhores práticas de


programação orientada a objetos. Por exemplo, quase todos os padrões
de Projeto são aplicações muito inteligentes do polimorfismo para resolver
problemas frequentes em programação orientada a objetos. Quanto
maior for seu domínio sobre esse conceito, melhor será seu desempenho
como desenvolvedor.

3.5 Modificadores de acesso

Agora que já abordamos os principais aspectos da orientação a objetos, podemos dar mais atenção
aos modificadores de acesso.

Observação

Utilizamos os modificadores de acesso private e public para encapsular


atributos, ou seja, protegemos os atributos tornando-os inacessíveis,
permitindo o acesso a eles por métodos acessores públicos que fazem a
consistência de dados.

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.

Figura 55 – Exemplo de modificadores de acesso

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

Um método de escopo de objeto é executado em um objeto. Por isso,


ele terá acesso a qualquer método e qualquer atributo da classe, sejam eles
de qualquer um dos dois escopos. Por outro lado, um método de escopo de
classe, quando executado, não tem acesso a qualquer objeto, pois ele
só “conhece” a sua classe. Por isso, ele não consegue acessar membros
que sejam de escopo de objeto, ele só pode acessar membros de classe
como ele próprio.

O exemplo a seguir utiliza um atributo de classe para contar quantas vezes ele foi instanciado.

Figura 56 – Exemplo de classe que conta as suas instâncias

Na linha 5 é declarado o atributo contador de escopo de classe, com o valor inicial 0.

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 11 a 13 é definido um método acessor para o atributo contador.

Figura 57 – Programa que testa a classe Contador

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.

3.7 Classes abstratas e interfaces

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.

Figura 58 – A superclasse FiguraGeometrica

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

Figura 59 – As subclasses Retangulo, Triangulo e Círculo

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:

Figura 60 – Programa de teste das áreas das figuras geométricas

Entre as linhas 7 e 11 o método formataFigura() recebe como parâmetro um objeto da classe


FiguraGeometrica e de qualquer uma de suas especializações. Na linha 9 é feita a formatação de um
String, com o nome da figura e sua área.

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.

Figura 61 – Classe abstrata

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:

Figura 62 – A interface FiguraGeometrica

73
Unidade II

Na linha 3 estamos declarando uma interface, não mais uma classe.

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:

Figura 63 – Classe Retangulo, que realiza uma interface

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

Outras IDEs também apresentam ferramentas para a criação de interfaces


gráficas, como o NetBeans, que sempre contou com tal funcionalidade.

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

Figura 64– Loja de componentes do Eclipse

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

Figura 65 – Seleção do assistente de criação de janelas

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

Figura 66 – Editor de interfaces gráficas do WindowBuilder no modo código

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

Figura 67 – Editor de interfaces gráficas do WindowBuilder no modo desenho

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

Figura 68 – Mudando o gerenciador de layout

Observação

O uso de gerenciadores de layout é bastante recomendado para tornar


suas interfaces gráficas mais profissionais e mais amigáveis para o usuário.

Na palheta de componentes, selecione JLabel e coloque-o na janela. Selecione a propriedade text e


digite o texto “Nome:”. Tecle enter para confirmar.

79
Unidade II

Figura 69 – Inserindo um rótulo na janela

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

Figura 70 – Inserindo um JTextField

Insira agora um JLabel com o texto “Telefone:” e um JTextField chamado textFieldTelefone, como
mostra a próxima figura:

81
Unidade II

Figura 71 – Inserindo os componentes para o telefone

Agora insira um JButton. Mude seu nome para btnApresenta e seu texto para “Apresenta”.

82
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Figura 72 – Inserindo um JButton

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:

Figura 73 – O código de criação do JButton

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:

Figura 74 – Código executado quando o botão é pressionado

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().

Figura 75 – Saída gerada pelo programa com interface gráfica

84
TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Resumo

Iniciamos discutindo os aspectos mais importantes do paradigma de


programação orientada a objetos. O primeiro é a sobrecarga de métodos.
Com ela, criamos mais de um método com o mesmo nome, mas com uma
lista de parâmetros diferentes. A sobrecarga significa que uma mesma ação
pode ser realizada de maneiras diferentes.

Na sequência vimos o recurso da herança, com o qual podemos criar


novas classes reaproveitando classes existentes. As classes filhas herdam os
atributos e métodos da classe pai. Quando uma classe filha precisa modificar
um método herdado de uma classe pai, ela pode sobrescrever tal método,
criando um método em sua própria classe com a mesma assinatura do
método da superclasse, mas com a nova implementação.

Com o polimorfismo podemos tratar um objeto de uma classe como se


fosse de outra classe, desde que a segunda seja um ancestral da primeira.

Os modificadores de acesso controlam como os membros de uma classe são


acessíveis de fora dela. Recomenda-se que os membros de uma classe
sejam sempre declarados com os modificadores mais restritivos possíveis.

O escopo define se um membro pertence à classe ou aos seus objetos.


Um membro de objeto é o escopo padrão e ele só existe nos objetos. Um membro
de classe pode ser acessado diretamente da classe, não necessitando da
existência de objetos da classe.

Finalmente, vimos brevemente como usar o WindowBuilder para criar


interfaces gráficas no Eclipse.

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.

Resposta correta: alternativa B.

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:

A) protected, public e static.

B) dynamic, private e protected.

C) public, static e dynamic.

D) private, protected e public.

E) static, dynamic e private.

Resposta correta: alternativa D.

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

Você também pode gostar