5 Reuso de Classes. Desenvolvimento OO com Java. Vítor E. Silva Souza

Documentos relacionados
Capítulo 5 Reuso de Classes

Desenvolvimento OO com Java Herança, reescrita e polimorfismo

6 Polimorfismo. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

Herança; Sobrescrita, Sobrecarga e Polimorfismo; Classes abstratas e concretas (finais).

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

Programação por Objectos. Java

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

[Desenvolvimento OO com Java] Modificadores de acesso e atributos de classe

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Linguagem de Programação II Herança

Programação Java (nível intermediário) 4. Polimorfismo

POO29004 Programação Orientada a Objetos

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Herança e Propriedades

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Computação II - Java - Teste 1.2 Prof. Adriano Joaquim de Oliveira Cruz 2015/04/27

9 Exceções. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Aula 9 Herança. Prof. Jefersson Alex dos Santos

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Classes e Objetos. Sintaxe de classe em Java

Herança e Polimorfismo

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Desenvolvimento Web TCC Turma A-1

4 Conceito de Herança

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

Linguagens de Programação Aula 12

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Vejamos o seguinte exemplo public class Exemplo private int testada = 20; public void testapalavra(int testada) JOptionPane.showMessageDialog(null,"Pa

[Desenvolvimento OO com Java] Classes abstratas e interfaces

Linguagem de Programação III

Programação Orientada a Objetos Flávio de Oliveira Silva 144

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Linguagem de Programação. Diagrama de classes

extendsé usado para indicar herança em JAVA

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

COMPORTAMENTOS - Observações

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Orientação a Objetos - Herança

Classe Abstrata e Interface

POO29004 Programação Orientada a Objetos

Lição 11 Herança, polimorfismo e interfaces

Conceitos de Programação Orientada a Objetos

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Programação Orientada a Objetos JAVA - NETBEANS

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Introdução. Atributos em Java. Atributos. Acesso à atributos em Java. Atributo versus variável. Atributos, métodos e encapsulamento.

Linguagem de Programação IV Introdução

Programação Orientada a Objetos

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Interfaces POO. Prof. Marcio Delamaro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos

Linguagem de Programação II Implementação

Desenvolvimento OO com Java Classes abstratas e interfaces

Aula 7 POO 1 Herança. Profa. Elaine Faria UFU

Programação Orientada a Objetos

Suporte a programação orientada a objetos

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação Orientada a Objetos com Java. Prof. Júlio Machado

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Transcrição:

Desenvolvimento OO com Java 5 Reuso de Classes Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.br/ ~ vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Este obra foi licenciada sob uma Licença Creative Commons Atribuição 3.0 Não Adaptada.

Obje%vos da parte 5 Apresentar os conceitos de reu%lização de código em programação Java: Composição e herança; Sobrescrita de métodos; A classe java.lang.object; O especificador protected; A palavra- chave final. Desta forma: Aumentar a capacidade de desenvolvimento de código para e com reuso, tornando- se mais produ%vo. Maio 2013 O Paradigma Orientado a Objetos 2

Reuso / reu%lização Para entregar sosware de qualidade em menos tempo, é preciso reu%lizar; Copy & paste não é reuso! Reuso é uma das principais vantagens anunciadas pela Orientação a Objetos; Mecanismo baseado no conceito de classes: Composição ( tem um ); Herança ou derivação ( é um ). Maio 2013 O Paradigma Orientado a Objetos 3

Composição Criação de uma nova classe usando classes existentes como atributos; Relacionamento tem um : uma conta tem um dono (cliente), um cliente tem um nome (string); Vimos como fazer isso no capítulo passado: Atributos primi%vos e referências a objetos; Operadores de seleção; Inicialização (zerar e atribuir valor inicial); O valor null; Atributos está%cos. Maio 2013 O Paradigma Orientado a Objetos 4

Composição class Aleatorio { int numero; Aleatorio(int max) { numero = new Random().nextInt(max); public class NumeroAleatorio { private String nome; private Aleatorio valor; NumeroAleatorio(String nome, int valor) { this.nome = nome; this.valor = new Aleatorio(valor); public static void main(string[] args) { NumeroAleatorio n; n = new NumeroAleatorio("Número secreto", 50); Maio 2013 O Paradigma Orientado a Objetos 5

Herança Criação de novas classes derivando classes existentes; Relacionamento é um [sub%po de] : um livro é um produto, um administrador é um usuário; Uso da palavra- chave extends; A palavra- chave é suges%va a classe que está sendo criada estende outra classe: Par%ndo do que já existe naquela classe... Pode adicionar novos recursos; Pode redefinir recursos existentes. Maio 2013 O Paradigma Orientado a Objetos 6

Sintaxe Sintaxe: class Subclasse extends Superclasse { Semân%ca: A subclasse herda todos os atributos e métodos que a superclasse possuir; Subclasse é uma derivação, um sub%po, uma extensão da superclasse. Maio 2013 O Paradigma Orientado a Objetos 7

Herança public class Produto { protected String nome; protected double preco; public Produto(String nome, double preco) { this.nome = nome; this.preco = preco; public boolean ehcaro() { return (preco > 1000); /* Métodos de acesso... */ Maio 2013 O Paradigma Orientado a Objetos 8

Herança public class Livro extends Produto { private String autor; private int paginas; public Livro(String nome, double preco, String autor, int paginas) { super(nome, preco); this.autor = autor; this.paginas = paginas; public boolean ehgrande() { return (paginas > 200); Maio 2013 O Paradigma Orientado a Objetos 9

Herança public class Loja { public static void main(string[] args) { Livro l; l = new Livro("Linguagem de Programação", 74.90, "Flávio Varejão", 334); System.out.println(l.ehCaro()); System.out.println(l.ehGrande()); Maio 2013 O Paradigma Orientado a Objetos 10

Subclasses herdam membros Livro possui autor e paginas (definidos na própria classe); Livro possui nome e preco (definidos na superclasse); Livro pode receber mensagens ehgrande() (definida na própria classe); Livro pode receber mensagens ehcaro() (definida na superclasse). Maio 2013 O Paradigma Orientado a Objetos 11

Sinônimos Superclasse; Classe base; Classe pai/mãe; Classe ancestral; Etc. Subclasse; Classe derivada; Classe filha; Classe descendente; Etc. Maio 2013 O Paradigma Orientado a Objetos 12

Sobrescrita de métodos Se um método herdado não sa%sfaz, podemos redefini- lo (sobrescrevê- lo): public class Livro extends Produto { /* Definições anteriores... */ // Livros acima de R$ 200 são caros! public boolean ehcaro() { return (preco > 200); Maio 2013 O Paradigma Orientado a Objetos 13

Sobrescrita de métodos Métodos sobrescritos podem chamar sua versão na superclasse usando a palavra super: public class Produto { /*... */ public void imprimir() { System.out.println(nome + "," + preco); public class Livro extends Produto { /*... */ public void imprimir() { super.imprimir(); System.out.println(autor + "," + paginas); Maio 2013 O Paradigma Orientado a Objetos 14

Chamando o construtor da superclasse public class Livro extends Produto { /*... */ public Livro(String nome, double preco, String autor, int paginas) { super(nome, preco); this.autor = autor; this.paginas = paginas; public class Produto { /*... */ public Produto(String nome, double preco) { this.nome = nome; this.preco = preco; Maio 2013 O Paradigma Orientado a Objetos 15

A classe Object Em Java, todos os objetos par%cipam de uma mesma hierarquia, com uma raiz única; Esta raiz é a classe java.lang.object. class Produto { /* É equivalente a: */ class Produto extends Object { Maio 2013 O Paradigma Orientado a Objetos 16

A classe Object Possui alguns métodos úteis: clone(): cria uma cópia do objeto (uso avançado); equals(object o): verifica se objetos são iguais; finalize(): chamado pelo GC (não é garan%a); getclass(): retorna a classe do objeto; hashcode(): função hash; notify(), notifyall() e wait(): para uso com threads; tostring(): converte o objeto para uma representação como String. Maio 2013 O Paradigma Orientado a Objetos 17

O método tostring() tostring() é chamado sempre que: Tentamos imprimir um objeto; Tentamos concatená- lo com uma string. public class Loja { public static void main(string[] args) { Produto p = new Produto("CD", 30.0); System.out.println(p); // Resultado (tostring() herdado de Object): // Produto@10b62c9 Maio 2013 O Paradigma Orientado a Objetos 18

O método tostring() class Produto { /*... */ public String tostring() { return nome + " (R$ " + preco + ")"; public class Loja { public static void main(string[] args) { Produto p = new Produto("CD", 30.0); System.out.println(p); // Resultado (tostring() sobrescrito): // CD (R$ 30.0) Maio 2013 O Paradigma Orientado a Objetos 19

Inicialização da classe base Se um Livro é um Produto, para criarmos um livro precisamos antes criar um produto. class Computador { public Computador() { System.out.println("Computador()"); class Notebook extends Computador { public Notebook() { System.out.println("Notebook()"); Maio 2013 O Paradigma Orientado a Objetos 20

Inicialização da classe base O construtor base é chamado automa%camente; Chamada implícita à super(); O construtor default também faz isso. public class Teste { public static void main(string[] args) { new Notebook(); // Resultado: // Computador() // Notebook() Maio 2013 O Paradigma Orientado a Objetos 21

Atenção à ordem de construção class Computador { public Computador() { System.out.println("Computador()"); ligar(); public void ligar() { class Notebook extends Computador { private int codigo; public Notebook() { System.out.println("Notebook()"); codigo = 12345; public void ligar() { System.out.println("Código " + codigo); Maio 2013 O Paradigma Orientado a Objetos 22

Atenção à ordem de construção O construtor da superclasse é chamado antes do código receber seu valor: public class Teste { public static void main(string[] args) { new Notebook(); // Resultado: // Computador() // Código 0 // Notebook() Maio 2013 O Paradigma Orientado a Objetos 23

Construtores sem parâmetros class Pessoa { private String nome; public Pessoa(String nome) { this.nome = nome; class Aluno extends Pessoa { // Teste.java:28: cannot find symbol // symbol : constructor Pessoa() // location: class Pessoa // class Aluno extends Pessoa { // ^ // 1 error Maio 2013 O Paradigma Orientado a Objetos 24

Construtores com parâmetros Aluno não define construtor: ganha um default; Pessoa define um construtor com parâmetro: não ganha construtor default; Construtor default tenta chamar construtor sem parâmetro na superclasse (Pessoa); Pessoa não possui construtor sem parâmetro! Maio 2013 O Paradigma Orientado a Objetos 25

Construtores com parâmetro A solução é chamar o construtor explicitamente; Assim como this(), super() deve ser o primeiro comando do construtor. class Aluno extends Pessoa { public Aluno() { super("sem nome"); public Aluno(String nome) { super(nome); Maio 2013 O Paradigma Orientado a Objetos 26

Composição vs. herança Use herança quando: Uma classe representa um sub%po de outra classe; Construção de famílias de %pos; Use com cuidado! Use composição quando: Uma classe representa algo que faz parte de outra; Prefira composição à herança. Os dois conceitos são u%lizados em conjunto a todo momento! Maio 2013 O Paradigma Orientado a Objetos 27

Composição vs. herança class Lista { public void adic(int pos, Object obj) { public Object obter(int pos) { public void remover(int pos) { // Uma pilha é uma lista? class Pilha1 extends Lista { // Ou uma pilha tem uma lista? class Pilha2 { private Lista elementos; public void empilha(object obj) { public Object desempilha() { Maio 2013 O Paradigma Orientado a Objetos 28

O especificador de acesso protected Como já vimos, protected é um especificador de acesso que: Permite acesso interno (à própria classe); Permite acesso às classes do mesmo pacote; Permite acesso às subclasses (do mesmo ou de outro pacote); Não permite acesso às demais classes. Maio 2013 O Paradigma Orientado a Objetos 29

Membros protegidos class A { int x = 10; protected void print() { System.out.println(x); protected void incr() { x++; import letras.*; public class Um extends A { public void g() { incr(); // OK! print(); // OK! // Erro: x++; public class B { A a = new A(); public void f() { a.x = 15; a.print(); Maio 2013 O Paradigma Orientado a Objetos 30

Regra de bolso do ocultamento De maneira geral: Atributos de uma classe devem ser privados; Se a classe possui filhas, atributos podem ser protegidos ou possuir métodos de acesso protegidos; Métodos que pertencem à interface devem ser públicos; Alguns métodos podem ser u%lizados internamente e, portanto, serem privados ou protegidos. Maio 2013 O Paradigma Orientado a Objetos 31

Vantagens da herança Suportar do desenvolvimento incremental; Classes já testadas podem ser reu%lizadas; Economia de tempo. Relacionamento é um : Permite subs%tuir a classe base por uma subclasse quando a primeira é esperada; Propriedade que chamamos de polimorfismo; Veremos em mais detalhes no próximo capítulo. Maio 2013 O Paradigma Orientado a Objetos 32

Polimorfismo class Forma { public void desenhar() { System.out.println("Forma"); class Circulo extends Forma { public void desenhar() { System.out.println("Círculo"); class Quadrado extends Forma { /*... */ class Triangulo extends Forma { /*... */ Maio 2013 O Paradigma Orientado a Objetos 33

Polimorfismo public class Teste { private static void desenha(forma[] fs) { for (int i = 0; i < fs.length; i++) fs[i].desenhar(); public static void main(string[] args) { Forma[] formas = new Forma[] { new Circulo(), new Forma(), new Quadrado(), new Triangulo() ; desenha(formas); Maio 2013 O Paradigma Orientado a Objetos 34

Upcas%ng (ampliação) Nome dado à conversão implícita de uma subclasse para uma superclasse: class Teste { public static void inverter(forma f) { System.out.println("Inverte " + f); public static void main(string[] args) { Circulo c = new Circulo(); inverter(c); // Upcasting! Forma f = new Quadrado(); // Upcasting! Maio 2013 O Paradigma Orientado a Objetos 35

Recapitulando... O que já aprendemos: Podemos fazer reuso com composição ou herança; Os dois conceitos são muito usados em conjunto; Subclasses herdam membros da superclasse; Subclasses podem sobrescrever métodos; Classe java.lang.object é raiz da hierarquia; A subclasse chama o construtor da superclasse; protected é um friendly extensível às subclasses. Prosseguindo... É possível definir uma classe como não herdável? Maio 2013 O Paradigma Orientado a Objetos 36

A palavra reservada final Significa Isto não pode ser mudado ; Dependendo do contexto, o efeito é levemente diferente; Pode ser usada em: Dados (atributos / variáveis locais); Métodos; Classes. Obje%vos: Eficiência; Garan%r propriedades de projeto. Maio 2013 O Paradigma Orientado a Objetos 37

Dados finais Constantes são comuns em LPs; Constantes conhecidas em tempo de compilação podem adiantar cálculos; Constantes inicializadas em tempo de execução garantem que o valor não irá mudar. Em Java, u%liza- se a palavra final: public static final int MAX = 1000; private final String NOME = "Java"; final double RAD = Math.PI / 180; Maio 2013 O Paradigma Orientado a Objetos 38

Referência constante Um primi%vo constante nunca muda de valor; Uma referência constante nunca muda, mas o objeto pode mudar internamente: public class Teste { public static final int MAX = 1000; private final Coordenada C = new Coordenada(); public static void main(string[] args) { // Erro: MAX = 2000; // Erro: C = new Coordenada(); C.x = 100; // OK, se x for público! Maio 2013 O Paradigma Orientado a Objetos 39

Dados finais não inicializados class Viagem { class DadoFinalLivre { final int i = 0; // Final inicializado final int j; // Final não inicializado final Viagem p; // Referência final não inicializada // Finais DEVEM ser inicializados em // todos os construtores e somente neles DadoFinalLivre () { j = 1; p = new Viagem(); DadoFinalLivre (int x) { j = x; p = new Viagem(); Maio 2013 O Paradigma Orientado a Objetos 40

Argumentos finais Um parâmetro de um método pode ser final: Dentro do método, funciona como constante. public class Teste { public void soimprimir(final int i) { // Erro: i++; System.out.println(i); Maio 2013 O Paradigma Orientado a Objetos 41

Métodos finais Métodos finais não podem ser sobrescritos por uma subclasse; Chamada do método inline (maior eficiência). class Telefone { public final void discar() { // Não compila: discar() é final! class TelefoneCelular extends Telefone { public void discar() { Maio 2013 O Paradigma Orientado a Objetos 42

Métodos privados são finais Métodos privados não podem ser acessados; Portanto, são finais por natureza (as subclasses não têm acesso a ele). class Telefone { private final void checarrede() { // OK. São dois métodos diferentes! class TelefoneCelular extends Telefone { private final void checarrede() { Maio 2013 O Paradigma Orientado a Objetos 43

Classes finais Classes finais não podem ter subclasses; Por consequência, todos os métodos de uma classe final são automa%camente finais. class Telefone { final class TelefoneCelular extends Telefone { // Erro: TelefoneCelular é final! class TelefoneAtomico extends TelefoneCelular { Maio 2013 O Paradigma Orientado a Objetos 44

h"p://nemo.inf.ufes.br/ Maio 2013 O Paradigma Orientado a Objetos 45