Prévia do material em texto
59 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: 60 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 61 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. 62 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(). 63 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. 64 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 classesdevem 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. 65 TÓPICOS ESPECIAIS DE PROGRAMAÇÃO ORIENTADA A OBJETOS Figura 54 – Exemplo de polimorfismo de classes 66 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. 67 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. 68 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. 69 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á 70 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. 71 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 raioelevado a 2. O método getNome(), entre as linhas 11 e 13, retorna o nome da figura geométrica apropriada. 72 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 73 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 74 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: 75 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. 76 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. 77 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: 78 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. 79 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. 80 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. 81 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: 82 Unidade II Figura 71 – Inserindo os componentes para o telefone Agora insira um JButton. Mude seu nome para btnApresenta e seu texto para “Apresenta”. 83 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 84 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 85 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. 86 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. 87 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.