• Nenhum resultado encontrado

SLIDES - AULA 5 - HERANÇA

N/A
N/A
Protected

Academic year: 2021

Share "SLIDES - AULA 5 - HERANÇA"

Copied!
110
0
0

Texto

(1)

HERANÇA

Cleyton Caetano de Souza IFPB – Campus Monteiro

(2)

Agenda

• Herança – Classes Concretas – Classes Abstratas • Polimorfismo • Object • Sobrescrita de métodos • Super • Instanciação de subclasses • Interface – Comparable

(3)

Sistema Acadêmico

• Vamos imaginar o funcionamento de um

Sistema Acadêmico que controla o cadastro de alunos, professores e funcionários.

• Quais seriam as classes desse sistema? • Como podemos modelar essas classes?

(4)
(5)
(6)
(7)

Qual classe poderíamos pensar que possui

todos esses atributos?

(8)
(9)
(10)

Por que Professor, Aluno e Diretor, possuem

os mesmos atributos que Pessoa?

(11)

Por que Professor, Aluno e Diretor, possuem

os mesmos atributos que Pessoa?

(12)
(13)

Como podemos representar isso usando Java?

(14)

Herança

• Por meio da herança podemos fazer com que as classes filhas herdem características

(atributos) e comportamentos (métodos) de uma classe mãe!

(15)

Herança: Graficamente

Ár

vor

e de Her

anç

a

(16)
(17)

Herança: Sintaxe

• Eclipse! • Roteiro

– Criar as classes Pessoa, Aluno, Professor e Diretor – Fazer Aluno, Professor e Diretor subclasses de

Pessoa

– Observar os efeitos de ser uma subclasse

• Herança de características • Herança de comportamento

(18)

extends

• A palavra reservada extends (estende, em

português) serve para declarar que uma classe herda de uma outra classe.

– Herda o quê?

• Atributos (características) • Métodos (comportamentos)

(19)

Herança

• A classe mãe é chamada de superclasse

• A classe herdeira/filha é chamada de

subclasse

• Quando uma classe herda de outra, diz-se

– a subclasse herda da superclasse – a subclasse estende a superclasse

(20)

Herança

• Conceitualmente, pode-se dizer que herança é um relacionamento do tipo “é um”

– A classe professor herda da classe pessoa significa que professor é uma pessoa, pois possui todas os atributos e métodos que a classe pessoa possuir

• O professor possui todas as características que uma pessoa possui

• O professor é capaz de fazer tudo que uma pessoa faz

(21)

Há alguma outra relação de herança que

podemos estabelecer entre essas classes?

(22)

Há alguma outra relação de herança que

podemos estabelecer entre essas classes?

(23)
(24)

O que essas duas classes têm em comum?

(25)

Herança

• As Classes Professor e Diretor compartilham um atributo com o mesmo nome e significado porque há uma relação entre elas.

– Tanto Professor quanto Diretor são Funcionários

• Também pode-se dizer que Diretor e Professor são tipos de Funcionários

– Graficamente, como estabelecemos essa relação de herança?

(26)
(27)

Herança

• No momento, nosso Sistema Acadêmico

possui 5 classes: Pessoa, Funcionário, Aluno, Professor e Diretor.

• Entretanto, originalmente, eu só pretendia que houvesse 3 classes: Aluno, Professor e

(28)

Herança

• Há como impedir que os objetos das classes Pessoa e Funcionário sejam utilizadas?

– Precisamos dessas Superclasses para usufruir dos benefícios da Herança, mas queremos impedir

que os programadores instanciem esses objetos e se concentrem em utilizar as Subclasses

– Há uma maneira simples de impedir que uma classe possa ser instanciada?

(29)

Classes Abstratas

Uma Classe Abstrata é uma Classe que não pode

ser instanciada

– O compilador não permitirá que se instancie uma classe abstrata

– Ela serve puramente para ser utilizada na herança

• Uma classe abstrata “praticamente” não tem utilidade, valor ou razão de existir, a menos que ela seja estendida

– Há uma pequena exceção aqui, que são as classes abstratas com métodos e atributos estáticos

(30)
(31)

Classes Abstratas

• Classes que não são abstratas são chamadas de Classes Concretas

• Somente uma classe abstrata pode conter

Métodos Abstratos

(32)

Métodos Abstratos

• Um Classe Abstrata é uma Classe que deve ser estendida; um Método Abstrato é um método que

deve ser sobrescrito.

– Um Método Abstrato é um método sem corpo

• A analogia é que alguns comportamentos

(métodos) são específicos demais para serem definidos na superclasse

– Ele é definido como Abstrato para que seja implementado numa subclasse

Somente uma Classe Abstrata pode conter

(33)
(34)

Métodos Abstratos

• Qual a forma de um animal?

– Animal é uma classe genérica demais para ser concreta!

• Qual o som que um animal faz?

– falar() é um método específico demais para ser implemento na classe Animal, pois cada Animal fala de uma forma diferente.

• O cão fala de uma forma (“Au. Au.”)

(35)
(36)

The road so far...

• Herança

– Evita duplicidade de código

– Permite que classes herdem características e comportamentos

• Favorece a reusabilidade

– Definem uma organização hierárquica entre as classes

• Classes Abstratas

– Classes que não podem ser instanciadas

– Permitem estabelecer a obrigatoriedade da existência de um certo comportamento nas subclasses

(37)

Herança

(38)

Herança

(39)

Herança

(40)

Herança

(41)

Herança

(42)

Herança

(43)

Herança

(44)

Herança

(45)

Herança

(46)

Herança

(47)

Polimorfismo

• Para entender o que é polimorfismo e como funciona, temos que examinar a maneira

como normalmente instanciamos um objeto. Quadrado quadrado = new Quadrado();

Declaramos a referência para um objeto de um certo tipo.

Através dessa referência, podemos invocar todos os métodos do objeto que instanciamos.

Instanciamos um objeto, do

tipo da referência, simplesmente, chamando seu construtor.

(48)

Polimorfismo

• Por Java ser uma linguagem tipada, é muito importante que a referência e o objeto

instanciados sejam do mesmo tipo.

Quadrado quadrado = new Quadrado();

• Pois, uma referência para um objeto quadrado não pode NUNCA apontar um objeto animal.

(49)

Polimorfismo

• O polimorfismo flexibiliza um pouco isso.

• Com o polimorfismo, a referência e o objeto instanciados podem ser diferentes

• Desde que o tipo de referência seja superclasse do objeto que está sendo instanciado.

Forma forma = new Quadrado();

Declaramos a referência para um objeto da

superclasse

Instanciamos um objeto de uma das subclasses

(50)

Polimorfismo

• O polimorfismo flexibiliza um pouco isso.

• Com o polimorfismo, a referência e o objeto instanciados podem ser diferentes

• Desde que o tipo de referência seja superclasse do objeto que está sendo instanciado.

Forma forma = new Quadrado();

Essa variável “forma” pode ser utilizada para referenciar objetos de qualquer subclasse de Forma.

(51)

Polimorfismo

Forma forma = new Quadrado(); forma = new Triangulo();

(52)

Polimorfismo

Forma[] formas = new Forma[3] formas[0] = new Quadrado();

formas[1] = new Triangulo(); formas[2] = new Circulo();

(53)

Polimorfismo

• Argumentos e Retornos Polimórficos

– O Polimorfismo permite que um objeto de uma subclasse seja utilizado como um objeto da

superclasse

– Isso também é válido para os parâmetros de entrada de e o retorno de um método

(54)

Polimorfismo

1) Pergunta: Que tipos de objetos podem ser

passados como parâmetros para esse método?

public static void dobrarTamanho(Forma forma)

2) Pergunta: Que tipos de objetos podem ser

retornados por esse método?

(55)

Polimorfismo

1) Pergunta: Que tipos de objetos podem ser

passados como parâmetros para esse método?

public static void dobrarTamanho(Forma forma) Resposta: qualquer objeto que herde da classe

Forma

2) Pergunta: Que tipos de objetos podem ser

retornados por esse método?

public Forma espelhar()

Resposta: qualquer objeto que herde da classe

(56)

Polimorfismo

Forma forma = new Quadrado();

Que métodos podem ser invocados utilizando

(57)

Polimorfismo

Forma forma = new Quadrado();

Que métodos podem ser invocados utilizando

essa variável de referência?

Resposta: Apenas os métodos

disponíveis na declaração da superclasse.

(58)

Polimorfismo

Forma forma = new Quadrado();

Sendo Forma uma classe Abstrata o que acontece quando eu chamo o método desenhar usando essa variável de referência?

(59)

Polimorfismo

Forma forma = new Quadrado();

Sendo Forma uma classe Abstrata o que acontece quando eu chamo o método desenhar usando essa variável de referência?

Resposta: os métodos que são chamados usando

essa variável de referência SEMPRE são os métodos presentes no objeto instanciado!

(60)

A classe Object

• Em Java todas as Classes que já existem e todas que você vai criar vão herdar POR PADRÃO da classe Object

• Object é a superclasse de todas as classes em Java

– Herdar da classe Object significa que elas vão ter os mesmo métodos e atributos que a classe

(61)

Object

• Isso faz sentido?

Object string = new String(“algo”);

Object lista = new ArrayList<String>(); Object array = new int[2];

(62)

Object

• Isso faz sentido?

Object string = new String(“algo”);

Object lista = new ArrayList<String>(); Object array = new int[2];

Object integer = Integer.parseInt(“-1”);

• Sim!

– A Classe Object representa o topo da hierarquia de classes em Java

– Uma variável de referência do tipo Object pode fazer referência a um objeto de qualquer tipo.

(63)

Object

Object string = new String(“algo”);

Object lista = new ArrayList<String>(); Object array = new int[2];

Object integer = Integer.parseInt(“-1”);

Que métodos podem ser invocados utilizando

(64)
(65)

Documentação

• Para mais informações sobre a Classe Object, acesse

http://docs.oracle.com/javase/6/docs/api/java/lang /Object.html

(66)

Object

Object obj = “qualquer coisa”;

Existe alguma forma de chamar os métodos da classe String usando essa referência?

(67)

Object

Object obj = “qualquer coisa”;

Existe alguma forma de chamar os métodos da classe String usando essa referência?

Resposta: Não! A não ser que

passemos a referência do objeto para uma referência do tipo String

(68)

Object

Object obj = “qualquer coisa”; String str = (String) obj;

Com essa referência podemos chamar os métodos da classe String!

(69)

Object

Object obj = “qualquer coisa”; String str = (String) obj;

O que aconteceria se obj

guardasse uma referência para um tipo de objeto diferente de String?

(70)

Object

Object obj = new Date(); String str = (String) obj;

O que acontece quando obj

guarda uma referência um tipo de objeto diferente de String?

(71)

Object

Object obj = new Date(); String str = (String) obj;

O que acontece quando obj

guarda uma referência um tipo de objeto diferente de String?

Resposta: Ocorreria um erro de

casting e seria lançada uma ClassCastException!

(72)

Object

• Seria lançada uma ClassCastException

– Exceção que é lançada sempre ocorre um erro de

casting com classes

• Casting é a conversão de tipos, lembra?

int x = (int) 2.3;

• Ao realizar o casting com objetos, como garantir que esse erro não acontecerá?

(73)

Object

• Seria lançada uma ClassCastException

– Exceção que é lançada sempre ocorre um erro de

casting com classes

• Casting é a conversão de tipos, lembra?

int x = (int) 2.3;

• Ao realizar o casting com objetos, como garantir que esse erro não acontecerá?

– getClass – instanceof

(74)

Casting de Classes

(75)

Sobrescrita de Métodos

• A herança também permite criar novas classes a partir de classes já existentes,

adicionando e alterando propriedades e

(76)

Sobrescrita de Métodos

A classe abstrata Personagem define a obrigatoriedade das classes filhas implementarem o método atacar. Todo personagem deve possuir o método atacar!

O Pistoleiro É um personagem, logo, ele deve implementar o método atacar. Além disso, o pistoleiro possui um método novo (que outros personagens não possuem) chamado

atirar!

O Sniper também É um personagem, mas ele também é um Pistoleiro. Ele também possui um método atacar (que ele herdou de Pistoleiro). A diferença é que o Sniper “atira” de uma forma diferente. Ele mira, antes de atirar, usando o seu método mirar!

(77)
(78)

Testando

E se eu quisesse que o Sniper atirasse da mesma forma que o Pistoleiro, mas mirando antes?

(79)

Uma possível solução...

Uma solução seria escrever o mesmo código nos dois métodos, mas isso não é bom. Por quê?

(80)

Uma possível solução...

Resposta: Código Duplicado. Além disso, se eu fosse

mudar o a forma como o Pistoleiro atira para “Pow! Pow!”, com o projeto dessa forma, eu teria que mudar nas duas classes para garantir que o Sniper atire igual ao Pistoleiro.

Há alguma forma de no método atirar do Sniper eu chamar o método atirar do Pistoleiro?

(81)

super

• Utilizando a palavra reservada super é possível referenciar métodos e atributos da

(82)
(83)

Tópicos Avançados

• Instanciação de subclasses • Herança múltipla

(84)

O que acontece quando eu instancio

um objeto Sniper?

1 2 3 4

Qual será a saída desse Programa?

(85)

O que acontece quando eu instancio

um objeto Sniper?

1 2 3 4 5

(86)

O que acontece quando eu instancio

um objeto Sniper?

• Ao instanciar um objeto de uma Classe que estende outra Classe, todos os construtores são chamados em cadeia, começando do

construtor da classe mais alta na árvore de herança.

– Onde está a chamada ao construtor da superclasse?

(87)

Construtores sendo chamados em

cadeia

• Onde está a chamada ao construtor da superclasse?

A chamada ao construtor da superclasse está

“escondida”

A chamada ao construtor da superclasse deve sempre

ser a primeira linha do construtor da subclasse!

Para explicitar a chamada ao construtor da superclasse, basta utilizar a

palavra reservada super

Caso a superclasse não possua o construtor default, a subclasse deve explicitamente chamar o construtor

com parâmetros utilizando a apalavra reservada super.

(88)

Eclipse

• Roteiro

– Implemente o código das classes Personagem,

Pistoleiro e Sniper, inclusive com os construtores e métodos apresentados

– Adicione à classe Personagem um atributo chamado nome que deve ser inicializado via construtor e um método dizerNome

– Observe o efeito disso nas classes Pistoleiro e Sniper.

(89)

Construtores sendo chamados em

cadeia

• Por que isso acontece?

– Imagine que o construtor da classe Sniper precisa utilizar um dos atributos que Sniper herdou de Pistoleiro e que esse atributo é inicializado no construtor da classe Pistoleiro.

– Se os construtores não fossem chamados em

cadeia seria necessário duplicar código para que o Sniper possuísse essa propriedade inicializada da mesma forma.

(90)

O problema do diamante

• Java não permite herança múltipla

– The Diamond Problem

• O problema do diamante é uma ambiguidade que

surge quando as classes B e C herdam e sobrescrevem um método x da classe A e a classe D herda de B e C • Quando é chamado o

método x utilizando uma instância da classe D que versão é chamada? A

versão que foi sobrescrita pela classe B ou a versão sobrescrita pela classe C

(91)

Interface

• Interface é um recurso da orientação a objeto utilizado em Java que define ações que devem ser obrigatoriamente executadas, mas que

cada classe pode executar de forma diferente.

– Basicamente, é um tipo de classe especial,

chamada interface, que só possui métodos que devem ser implementados por outras classes

• Esses métodos funcionam como métodos abstratos, mas não são abstratos

(92)

Interface (Código)

Significa que a interface será visível fora do pacote.

Palavra reservada para definir que esse código é o de uma interface e não o de uma classe.

Nome da interface.

Lista de métodos que devem obrigatoriamente ser implementados pelas classes concretas que implementarem essa interface

(93)

Interface

• Quando uma classe concreta implementa uma interface, ela, OBRIGATORIAMENTE, deve

implementar os métodos definidos na interface!

(94)

Classe implementando Interface

Classe concreta.

Essa classe concreta implementa a interface Voador. Logo, ela, OBRIGATORIAMENTE, deve possuir os métodos dessa interface implementados!

Método da

interface sendo implementado na classe concreta!.

(95)

Interface

• Por meio do uso de interfaces, é possível

“simular” uma herança múltipla porque uma classe pode implementar diversas interfaces

(96)

Interface

• A implementação de Interfaces não é

considerada herança, logo, uma classe pode implementar múltiplas interfaces e ainda

(97)

Polimorfismo

• Dessa forma eu posso instanciar um objeto do tipo Pato de diversas formas agora:

Pato pato = new Pato();

Animal animal = new Pato();

Voador voador = new Voador();

(98)

Interface Comparable

• A API de coleções em Java possui algumas coleções que são ordenadas.

– Ex. SortedList, TreeSet e TreeMap.

• Que critério essas coleções utilizam para ordenar os objetos?

(99)

Interface Comparable

• A API de coleções em Java possui algumas coleções que são ordenadas.

– Ex. SortedList, TreeSet e TreeMap.

• Que critério essas coleções utilizam para ordenar os objetos?

– Na verdade, o critério quem deve definir é o programador!

– Acontece que essas coleções só suportam objetos que implementem a interface Comparable

• Algumas classes que usamos (como String e os

(100)

Interface Comparable

• Se eu quero usar uma dessas coleções

ordenadas com uma das minhas classes, eu devo fazer elas

implementarem a

Interface Comparable e OBRIGATORIAMENTE implementar nelas o método compareTo

• Como criar uma lista ordenada por Idade de objetos do tipo Pessoa?

(101)

Roteiro

• 1º Passo – Pessoa deve implementar a interface Comparable

(102)

Roteiro

• 2º Passo – Isso vai obrigar que Pessoa implemente o método compareTo

O método compareTo deve retornar 1 se o objeto que o chamar for maior que o passado como parâmetro, 0 se forem iguais ou -1 se o objeto for menor que o parâmetro.

(103)

Roteiro

• 2º Passo – Isso vai obrigar que Pessoa implemente o método compareTo

O método compareTo deve retornar 1 se o objeto que o chamar for maior que o passado como parâmetro, 0 se forem iguais ou -1 se o objeto for menor que o

parâmetro.

Lembrando que esse conceito de maior, menor ou igual se refere ao atributo que estou usando para comparar os objetos!

(104)

Roteiro

• 3º Passo – Implemente corretamente o

método compareTo para comparar os objetos de acordo com o critério que você deseja usar.

(105)

Roteiro

• 3º Passo – Método alternativo

Como a classe Integer já implementa a interface

Comparable, eu posso usar o método compareTo dela para retornar a comparação de pessoas por idade.

(106)

Roteiro

• 4º Passo – Crie uma coleção ordenada com sua classe!

(107)

Desafio

• E se eu quiser ordenar pessoas algumas vezes por idade e outras vezes por nome, como

faço?

– Utilize um Comparator, um objeto comparador cuja função é comparar objetos!

– Isso está fora do escopo desse curso, mas fica a menção para o caso de vocês algum dia

(108)

The road so far...

• Interfaces

– Interface define um “contrato” entre as classes

concretas que implementarem essa interface. Esse contrato exige que essas classes implementem os métodos presentes na interface.

– Como uma classe podem implementar diversas interfaces, o uso de interfaces favorece o baixo acoplamento (baixa dependência), que é uma coisa boa em programação.

(109)

Herança

• Vantagens

– Evita duplicação de código

– Permite comportamento especializado (sobrescrita) – Objetos da subclasse podem ser utilizados no lugar

dos objetos da superclasse (polimorfismo)

• Desvantagens

– Em geral, deve se privilegiar o uso de interfaces, pois a herança aumenta o acoplamento entre as classes

– Leitura Recomendada

http://www.javaworld.com/article/2073649/core-java/why-extends-is-evil.html

(110)

Próxima Aula

Referências

Documentos relacionados

Em síntese, é possível sugerir que: (i) há uma assimetria entre os efeitos acu- mulados nos períodos de alta e de baixa dos preços das commodities, com impac- tos mais intensos

• heran¸ca ´ e uma t´ ecnica para construir novas classes, chamadas de classes derivadas, a partir das j´ a existentes, ditas classes base • heran¸ca permite o re´ uso

Neste contexto, está à agricultura orgânica, que é um sistema de produção alternativo seguro e sustentável, baseado na interação dinâmica entre o solo, as plantas,

Destacam-se alguns elementos para o cumprimento dos princípios de humanização e da qualidade da atenção integral dessa Política, como a facilitação do acesso aos

Os métodos mais precisos para avaliação da função ovárica como são os doseamentos hormonais (FSH, estradiol, inibina B, HAM) e estudos ecográficos, são também

SEGUNDA TV DISPOSITIVO TV-EYE IN FROM ANT VCR TV IN FROM ANT OUT TO TV CH4 CH3 IN FROM ANT SATEL S-VIDEO PHONE JACK DIGITAL DIO R 2 1 R CH 4 Receptor de satélite TV a cabo

O sistema desenvolvido mostrou ser uma ferramenta importante para usuários de imagens NOAA, especialmente os que necessitam de uma grande série temporal com alta precisão

1º) Não havendo testamento (...), a) se o finado não deixar cônjuge, nem herdeiro descendente ou ascendente, nem colateral até o 4º grau, notoriamente conhecido (CC, art.