• Nenhum resultado encontrado

Herança de Classes

N/A
N/A
Protected

Academic year: 2021

Share "Herança de Classes"

Copied!
39
0
0

Texto

(1)

Java e Orientação a Objetos

Uso de Herança de Classes

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma Java

Programação Orientada a Objetos em Java

Herança de Classes

(2)

Herança de Classes

conta1 numero = “1020-7”

agencia = “025-2”

saldo = 1500,00 valorTaxa = 23,00 limiteCheque = 500,00

emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite()

Herança de Classes

Representando as

contas Poupança

(3)

Herança de Classes

conta1 numero = “1020-7”

agencia = “025-2”

saldo = 1500,00 valorTaxa = 23,00 limiteCheque = 500,00 taxaRendimento = 0

emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite() aplicarRendimento()

conta2 numero = “2140-8”

agencia = “353-0”

saldo = 2000,00 valorTaxa = 0 limiteCheque = 0 taxaRendimento = 1,5%

emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite() aplicarRendimento()

Herança de Classes

(4)

Herança de Classes

conta1 numero = “1020-7”

agencia = “025-2”

saldo = 1500,00 valorTaxa = 23,00 limiteCheque = 500,00

emitirExtrato() emitirSaldo() aplicarTaxa() alterarLimite()

conta2 numero = “2140-8”

agencia = “353-0”

saldo = 2000,00

taxaRendimento = 1,5%

emitirExtrato() emitirSaldo() aplicarRendimento()

Herança de Classes

? ? ???

(5)

Definindo a Herança

Definindo a Herança

(6)

Definindo a Herança

? ?

Definindo a Herança

(7)

O QUE É HERANÇA?

O QUE É HERANÇA?

n Herança é um mecanismo que permite a uma classe herdar todo o

comportamento e os atributos de outra classe.

n Uma classe que herda de outra classe é chamada subclasse e a classe que fornece a herança é chamada

superclasse.

(8)

O QUE É HERANÇA?

n A classe A é a superclasse de B

n A classe B é uma subclasse de A

n A classe B é a superclasse de C, D e E

n As classes C, D e E são subclasses de B

HERANÇA

n As superclasses definem atributos e métodos genéricos que são herdados pelas classes derivadas.

n Um método herdado de uma superclasse pode ser redefinido pela classe derivada, mantendo o mesmo nome mas agindo de forma diferente.

n Normalmente os atributos de um objeto só

podem ser consultados ou modificados através

dos seus métodos ( accessor methods).

(9)

HERANÇA EM JAVA

n Java adota o modelo de árvore

n A classe Object é a raiz da hierarquia de classes à qual todas as classes existentes pertencem;

n Quando não declaramos que uma classe estende outra, ela, implicitamente, estende Object

HERANÇA EM JAVA

n Uma classe Java estende apenas uma outra classe (herança simples ou única)

n Para criar uma sub-classe, usamos a

palavra reservada extends

(10)

HERANÇA EM JAVA

class ContaCorrente extends ContaBancaria {

....

}

class ContaPoupanca extends ContaBancaria {

....

}

Exemplo do uso de herança

Vamos fazer o exercício

Aula_Herança.pdf disponível no site, o qual terá todos os detalhes

da implementação da herança de

classes em java.

(11)

HERANÇA EM JAVA

n Como os métodos são organizados em uma hierarquia de classes:

HERANÇA EM JAVA

Anulação - Sobreposição – Sobrescrita ou “overriding”

n Funcionamento quando uma subclasse

define um método que possui o mesmo

nome, tipo de retorno e argumentos que

um método definido em uma superclasse.

(12)

HERANÇA EM JAVA

EXEMPLO DE HERANÇA

EM JAVA

(13)

SOBRECARGA E ANULAÇÃO

n Sobrecarga de Métodos (overloading)

• Definir mais de um método com mesmo nome mas com assinaturas (parâmetros) diferentes.

n Anulação de Métodos (overriding)

• Definir um novo método com mesmo nome e assinatura de outro de uma superclasse.

n Métodos final não podem ser sobrepostos.

EXEMPLO DE SOBRECARGA E

ANULAÇÃO

(14)

THIS e SUPER

n Usados quando for necessário referenciar explicitamente a instância (this) ou a

superclasse (super).

CONTROLE DE ACESSO:

‘PROTECTED’

n Java permite declararmos um membro

(método ou atributo) que, embora não seja acessível por outras classes, é herdado por suas sub-classes

n Para isso usamos o modificador de

controle de acesso protected

(15)

RESUMO DE VISIBILIDADE

n Resumindo:

private: membros que são vistos só pela própria classe e não são herdados por nenhuma outra

public: membros são vistos e herdados por qualquer classe

protected: membros que são vistos pelas classes do pacote e herdados por qualquer outra classe

package: membros que são vistos e herdados pelas classes do pacote

ESPECIALIZAÇÃO X EXTENSÃO

n Uma classe pode herdar de outra para especializá-la redefinindo métodos, sem ampliar sua interface.

n Uma classe pode herdar de outra para estendê-la declarando novos métodos e, dessa forma, ampliando sua interface.

n As duas coisas podem acontecer

simultaneamente

(16)

Java e Orientação a Objetos

Herança

método toString()

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma Java

Programação Orientada a Objetos em Java

A classe Object

n O Java possui uma hierarquia de classes a qual toda sua API (biblioteca de classes) está estruturada, em uma grande herança.

n A classe “pai de todas”, de onde, por

default, todas as demais classes herdam dela chama-se Object.

n Ela possui alguns métodos “prontos” que

podem ser então utilizados pelas demais

classes, ou serem sobreescritos.

(17)

A classe Object

n boolean equals (Object X): compara dois objetos se são iguais, ou seja, se o objeto que está chamando o método é igual ao objeto X passado por parâmetro;

n Class getClass(): retorna a classe do objeto chamador do método;

n String toString(): retorna uma string representando o objeto que o chama.

O método toString()

n Particularmente, estamos interessados no método toString() no qual podemos formatar uma saída dos dados de um determinado objeto, ou seja, formatar um objeto da forma como desejarmos, para por exemplo, mostra-lo na tela.

n Como o próprio nome do método diz, essa saída necessariamente será uma string!

n Como mencionamos que há uma herança de nossa classe com a classe Object, não precisamos, nesse caso, usarmos o comando extends, pois ela já existe!

n Logo, é só começar a usar!

(18)

Exemplo do uso de toString()

class Produto {

int

codigo;

String

nome;

String

fornecedor;

float

preco;

public String toString() //temos que respeitar a

{ assinatura do método

String

str=""; //criamos uma string auxiliar vazia;

//seguimos montando a string, concatenando os dados desejados.

str

=

str

+ "Nome: " +

nome;

str

=

str

+ " Codigo: " +

codigo;

str

=

str

+ " Preço: " +

preco;

return

str; //ao final, devemos retornar a string }

Exemplo do uso de toString()

class Produto {

int

codigo;

String

nome;

String

fornecedor;

float

preco;

public String toString() {

String

str="";

str

=

str

+ "Nome: " +

nome;

str

=

str

+ " Código: " +

codigo;

str

=

str

+ " Preço: " +

preco;

return

str;

}

A saída será:

Nome: Farinha Código: 10 Preço: 7.80

Não usamos o fornecedor, por escolha.

Você não é obrigado a utilizar todos os atributos

(19)

Exemplo do uso de toString()

class Produto {

int

codigo;

String

nome;

String

fornecedor;

float

preco;

public String toString() {

String

str="";

str

=

str

+ "Nome: " +

nome;

str

=

str

+ "\nCódigo: " +

codigo;

str

=

str

+ "\nPreço: " +

preco;

return

str;

}

Podemos colocar o \n para termos uma saída melhor:

Nome: Farinha Código: 10 Preço: 7.80

O método toString()

n Para usarmos o método na hora que desejarmos os dados do objeto, como por exemplo, mostra-lo na tela, fica ainda mais fácil!

Produto prod1 = new Produto(10, “Farinha”, 7.80);

System.out.println(“Dados do objeto\n: ” + prod1);

n Repare que só estamos utilizando o objeto direto, sem

invocar o método toString(). O que ocorre é que o

método toString() é invocado automaticamente e vai

produzir aquela saída que formatamos dentro dele.

(20)

O método toString()

n Toda vez que você precisar mostrar os dados de um objeto numa classe, USE O MÉTODO toString()

n É a maneira mais correta e profissional de se fazer a saída de um objeto!

Java e Orientação a Objetos

Polimorfismo

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma Java

Programação Orientada a

Objetos em Java

(21)

POLIMORFISMO

n Polimorfismo – as definições clássicas (e confusas) de polimorfismo são:

A - “Capacidade que uma operação [método]

assumir mais de uma implementação em classes diferentes”

e

B - “Capacidade de um determinado atributo referenciar objetos de diferentes tipos,

assumindo assim várias formas”

POLIMORFISMO

n A situação “A” significa que se

considerarmos uma hierarquia de classes, as diferentes subclasses podem redefinir um determinado método da classe pai (ou base).

n A situação “B” significa que podemos ter

um atributo (ou variável) definido como do

tipo base, mas referenciando objetos das

subclasses.

(22)

POLIMORFISMO

n A importância do polimorfismo está no fato de que, em determinadas circunstâncias, podemos ter um atributo (ou variável) do tipo base referenciando objetos das

classes derivadas [B] e executaremos um método definido na classe base porém redefinido nas subclasses [A].

POLIMORFISMO

n É a capacidade de um objeto tomar várias formas

n A capacidade polimórfica decorre

diretamente do mecanismo de herança

n Ao estendermos ou especializarmos uma

classe, não perdemos compatibilidade

com a superclasse

(23)

POLIMORFISMO

n Exemplo

• Veículo é uma superclasse

n Automóvel é subclasse de veículo

• class Veiculo{...}

• class Automovel extends Veiculo {...}

n Sempre que precisarmos de um Veículo, podemos usar um Automóvel, ou um

Caminhão, ou Ônibus em seu lugar

Exemplo de Polimorfismo

Sobreescritos

(override)

(24)

Exemplo de Polimorfismo

n Atendente, Gerente e Estoquista herdam de Funcionario.

n O método calcularSalarioLiquido () será sobrescrito, ou seja, cada tipo de Funcionário possui o seu próprio método de calcular o seu salário liquido (para cada tipo tem sua regra diferente)

POLIMORFISMO

classe Gerente extends Funcionario { ... }

classe Atendente extends Funcionario { ... }

classe Estoquista extends Funcionario

{ ... }

(25)

Exemplo de Polimorfismo

Quem define qual instância teremos é o CONSTRUTOR!

“devolve um Atendente” = new Atendente();

“devolve um Gerente” = new Gerente();

“devolve um Estoquista” = new Estoquista();

Exemplo de Polimorfismo

Logo, para mantermos a coerência computacional e das regras de tipos de dados:

Atendente a1 = new Atendente();

Gerente g1 = new Gerente();

Estoquista e1 = new Estoquista();

(26)

Exemplo de Polimorfismo

n Observe que teríamos que criar uma

variável para cada “tipo” de objeto, para cada classe derivada;

n O conceito de polimorfismo modifica (e facilita) a implementação, possibilitando declararmos uma variável da classe base e esta poderá receber um

objeto de qualquer uma de suas classes derivadas;

Exemplo de Polimorfismo

Funcionario func;

func = new Atendente();

// a partir de agora, func tem um Atendente e funciona como tal

func = new Gerente();

// a partir de agora, func tem um Gerente e funciona como tal

func = new Estoquista();

// a partir de agora, func tem um Estoquista e funciona como tal

(27)

POLIMORFISMO

n Exemplo:

public class Funcionario { }

public class Gerente extends Funcionario {

String departamento;

}

Funcionario f = new Gerente(); (OK)

f.departamento = “Financeiro”; (ERRADO)

POLIMORFISMO

n Polimorfismo é o nome formal para o fato de que, quando precisamos de um objeto de determinado tipo, podemos usar uma versão mais especializada dele.

n Esse fato pode ser bem entendido

analisando-se a árvore de hierarquia de

classes.

(28)

Exemplo de Polimorfismo

O polimorfismo garante a sobreescrita dos métodos:

Funcionario func;

func = new Atendente();

func.calcularSalarioLiquido();

// como o método foi sobreposto, apesar de func ser Funcionario, é o cálculo de Atendente que será executado >>é a instância que manda!

func = new Gerente();

func.calcularSalarioLiquido();

// aqui é o cálculo doGerente que é disparado;

func = new Estoquista();

func.calcularSalarioLiquido();

//

o mesmo ocorre aqui comEstoquista.

Acesso a membros específicos

n Porém, quando o método é específico da subclasse (e não sobreescrito), o

polimorfismo não garante o acesso:

n

Exemplo:

public class Funcionario { }

public class Gerente extends Funcionario {

String departamento;

public void aplicarLucros(int percentual){

...

} //específico de gerente }

(29)

Acesso a membros específicos

Funcionario func = new Gerente();

func.calcularSalarioLiquido(); (OK, pois foi sobreescrito )

func.mostrarDados(); (OK, pois tem na superclasse e foi herdado ) func.aplicarLucros(20); (ERRADO, não há na superclasse!)

O polimorfismo não acessa, apesar de termos uma instância de Gerente

O processo de Casting

n Como resolvermos esse impasse?

n Devemos fazer o “casting” de objetos!

n DEFINIÇÃO:

Casting é a transformação de uma determinada

variável com valor / referência de tipo menos

específico (subclasse) para uma variável de tipo

mais específico (superclasse) e vice-versa.

(30)

O processo de casting

String departamento;

calcularSalarioLiquido() aplicarLucros()

func .

Funcionario func = new Gerente();

calcularSalarioLiquido()

mostrarDados()

Interface de Funcionario

Interface de Gerente

Com o casting, precisamos acessar a instância de Gerente presente na variável func.

O processo de casting

String departamento;

calcularSalarioLiquido()

mostrarDados()

aplicarLucros()

func .

Funcionario func = new Gerente();

func.calcularSalarioLiquido(); //Ok!

func.aplicarLucros(20); //NÃO!

((Gerente) func).aplicarLucros(20);

// APLICOU O CASTING!

Interface de Gerente

(31)

O OPERADOR instanceof

String departamento;

calcularSalarioLiquido() contarAtendimentos()

func .

calcularSalarioLiquido()

mostrarDados()

Interface de Funcionario

Interface de Atendente

Mas e se a instância em func não for Gerente e sim outra, como Atendente?

Funcionario func = new Atendente();

...

((Gerente) func).aplicarLucros(20);

// ERRADO, pois não há instância de Gerente em func

OPERADOR ‘instanceof’

n Utilizado para saber o real tipo do objeto usado.

Funcionario func = new Gerente();

if (func instanceof Gerente) //ok!

((Gerente) func).aplicarLucros(20);

Funcionario func = new Atendente();

if (func instanceof Gerente) // Não entra!

((Gerente) func).aplicarLucros(20);

// Evita o acesso indevido!

(32)

Java e Orientação a Objetos

Classes Abstratas

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma Java

Programação Orientada a Objetos em Java

CLASSES ABSTRATAS

n Ao criarmos uma classe para ser estendida, às vezes, codificamos alguns métodos para os quais não sabemos dar uma implementação, ou seja, um método que só subclasses saberão implementar.

n Uma classe deste tipo não pode ser

instanciada pois sua funcionalidade está

incompleta. Tal classe é dita abstrata.

(33)

CLASSES ABSTRATAS EM JAVA

n Java suporta o conceito de classes abstratas: podemos declarar uma classe abstrata usando o modificador abstract.

n Métodos podem ser declarados abstratos para que suas implementações sejam adiadas para as subclasses. Da mesma forma, usamos o modificador abstract e omitimos a implementação desse método.

CLASSES ABSTRATAS

EM JAVA

(34)

CLASSES ABSTRATAS EM JAVA

n Observe que o método

calcularSalarioLiquido() não deverá (ou não terá) implementação na classe Funcionário;

n A regra depende de cada tipo, ou seja, somente quando tivermos Gerente, Atendente ou Estoquista é que implementaremos o cálculo para cada um.

CLASSES ABSTRATAS EM JAVA

n Se deixarmos o método

calcularSalarioLiquido() sem

implementação (sem corpo) na classe

Funcionário, dará erro de compilação (não pode haver método “incompleto”);

n Esse é um dos motivos de usarmos a

classe Abstrata!

(35)

CLASSES ABSTRATAS EM JAVA

public abstract class Funcionario {

public abstract float calcularSalarioLiquido();

}

public class Gerente extends Funcionario {

public calcularSalarioLiquido() {

...

} }

Método sem corpo

Um método abstrato é obrigado a ser implementado na

subclasse

Interfaces

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma Java

Programação Orientada a

Objetos em Java

(36)

INTERFACES

n Java não permite herança múltipla com herança de código

n Java implementa o conceito de interface

n É possível herdar múltiplas interfaces

n Em Java, uma classe estende uma outra classe e implementa zero ou mais

interfaces

n Para implementar uma interface em uma classe, usamos a palavra implements

INTERFACES

(37)

INTERFACES

n Uma vez que uma interface não possui implementação, devemos notar que:

• seus campos devem ser públicos, estáticos e constantes

• seus métodos devem ser públicos e abstratos n Como esses qualificadores são fixos, não

precisamos declara-los (note o exemplo anterior)

Classe Abstrata x INTERFACES

n Quando devo usar uma classe abstrata?

Quando devo usar uma Interface? Devo usar as duas?

n Na verdade, uma Classe Abstrata sem qualquer implementação, tem o aspecto parecido com uma Interface.

n Mas ambas possuem várias diferenças e

similaridades entre si.

(38)

INTERFACES

Ø Uma interface não é considerada uma Classe e sim uma Entidade.

Ø Não possui implementação, apenas assinatura, ou seja, apenas a definição dos seus métodos sem o corpo.

Ø Todos os métodos são abstratos.

Ø Seus métodos são implicitamente Públicos e Abstratos.

Ø Não há como fazer uma instância de uma Interface e nem como criar um Construtor.

Ø Funcionam como um tipo de "contrato", onde são especificados os atributos, métodos e funções que as classes que implementem essa interface são obrigadas a implementar.

Classe Abstrata

Ø As classes abstratas devem conter pelo menos um método abstrato, que não tem corpo.

Ø É um tipo especial de classe que não há como criar instâncias dela.

Ø É usada apenas para ser herdada, funciona como uma super classe.

Ø Uma grande vantagem é que força a hierarquia para todas as sub-classes.

Ø É um tipo de contrato que faz com que as

sub-classes contemplem as mesmas

hierarquias e/ou padrões.

(39)

Classe Abstrata x INTERFACES

n Quando nos criamos uma Interface, nós estamos basicamente criando um set de métodos sem qualquer implementação que deve ser herdado por outras classes já implementadas. A vantagem é que desta forma consegue-se prover um caminho para uma classe ser parte de duas classes: uma herdada hierarquicamente e outra da Interface.

n Quando nos criamos uma Classe Abstrata, nós estamos criando uma classe base que pode ter um ou mais métodos completos, mas pelo menos um ou mais destes métodos tem que criados incompletos (sem corpo), isto caracteriza uma Classe Abstrata.

Classe Abstrata x INTERFACES

n Vale lembrar que, se todos os método da Classe abstrata forem sem corpo, ela se torna uma Interface.

n O propósito de uma Classe Abstrata é

prover uma base de definições de como

um set de Classes Derivadas irão

trabalhar e então permitir os

programadores de preencher as

implementações nas Classes derivadas.

Referências

Documentos relacionados

Reescreva as duas orações subordinadas adjetivas sublinhadas, fazendo uso da expressão “a qual”, de acordo com a norma-padrão. Além disso, identifique, respectivamente, as

indiscriminadamente, membros privados só podem ser acessados pela própria classe, e membros de pacote são acessados por classes declaradas no mesmo pacote da classe. Conceitos

fulica in the city of Salvador, describing aspects of live cycle of the specie with rate growth, size, time of recruitment, age (life time) and reproductive period, characterize

Como objetivo mais específico, pretendeu-se identificar as singularidades encontradas pelo Assistente Social quando chamado a intervir num modelo transdisciplinar;

• 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,

3 - Poderão se inscrever no presente processo seletivo todos docentes que queiram concorrer a ter contrato celebrado com a rede estadual de educação a partir de 2021,

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