desenvolvimento oo com java 5 – reuso de classesvitorsouza/wp-content/uploads/java-br-curso... ·...

45
Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ([email protected] ) 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.

Upload: lamtuyen

Post on 09-Nov-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Desenvolvimento OO com Java 5 – Reuso de Classes

Vítor E. Silva Souza

([email protected]) 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.

Page 2: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 3: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 4: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 5: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Composição  

Maio  2013   O  Paradigma  Orientado  a  Objetos   5  

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); } }

Page 6: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 7: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Sintaxe  •  Sintaxe:        •  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  

class Subclasse extends Superclasse { }

Page 8: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Herança  

Maio  2013   O  Paradigma  Orientado  a  Objetos   8  

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 ... */ }

Page 9: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Herança  

Maio  2013   O  Paradigma  Orientado  a  Objetos   9  

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); } }

Page 10: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Herança  

Maio  2013   O  Paradigma  Orientado  a  Objetos   10  

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()); } }

Page 11: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 12: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 13: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Sobrescrita  de  métodos  •  Se  um  método  herdado  não  sa%sfaz,  podemos  redefini-­‐lo  (sobrescrevê-­‐lo):  

Maio  2013   O  Paradigma  Orientado  a  Objetos   13  

public class Livro extends Produto { /* Definições anteriores... */ // Livros acima de R$ 200 são caros! public boolean ehCaro() { return (preco > 200); } }

Page 14: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Sobrescrita  de  métodos  •  Métodos  sobrescritos  podem  chamar  sua  versão  na  superclasse  usando  a  palavra  super:  

Maio  2013   O  Paradigma  Orientado  a  Objetos   14  

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); } }

Page 15: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Chamando  o  construtor  da  superclasse  

Maio  2013   O  Paradigma  Orientado  a  Objetos   15  

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; } }

Page 16: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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.  

Maio  2013   O  Paradigma  Orientado  a  Objetos   16  

class Produto { } /* É equivalente a: */ class Produto extends Object { }

Page 17: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 18: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

O  método  toString()  •   toString()  é  chamado  sempre  que:  

–  Tentamos  imprimir  um  objeto;  –  Tentamos  concatená-­‐lo  com  uma  string.  

Maio  2013   O  Paradigma  Orientado  a  Objetos   18  

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

Page 19: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

O  método  toString()  

Maio  2013   O  Paradigma  Orientado  a  Objetos   19  

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)

Page 20: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Inicialização  da  classe  base  •  Se  um  Livro  é  um  Produto,  para  criarmos  um  livro  precisamos  antes  criar  um  produto.  

Maio  2013   O  Paradigma  Orientado  a  Objetos   20  

class Computador { public Computador() { System.out.println("Computador()"); } } class Notebook extends Computador { public Notebook() { System.out.println("Notebook()"); } }

Page 21: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Inicialização  da  classe  base  •  O  construtor  base  é  chamado  automa%camente;  •  Chamada  implícita  à  super();  •  O  construtor  default  também  faz  isso.  

Maio  2013   O  Paradigma  Orientado  a  Objetos   21  

public class Teste { public static void main(String[] args) { new Notebook(); } } // Resultado: // Computador() // Notebook()

Page 22: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Atenção  à  ordem  de  construção  

Maio  2013   O  Paradigma  Orientado  a  Objetos   22  

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); } }

Page 23: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Atenção  à  ordem  de  construção  •  O  construtor  da  superclasse  é  chamado  antes  do  código  receber  seu  valor:  

Maio  2013   O  Paradigma  Orientado  a  Objetos   23  

public class Teste { public static void main(String[] args) { new Notebook(); } } // Resultado: // Computador() // Código 0 // Notebook()

Page 24: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Construtores  sem  parâmetros  

Maio  2013   O  Paradigma  Orientado  a  Objetos   24  

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

Page 25: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 26: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Construtores  com  parâmetro  •  A  solução  é  chamar  o  construtor  explicitamente;  •  Assim  como  this(),  super()  deve  ser  o  primeiro  comando  do  construtor.  

Maio  2013   O  Paradigma  Orientado  a  Objetos   26  

class Aluno extends Pessoa { public Aluno() { super("Sem nome"); } public Aluno(String nome) { super(nome); } }

Page 27: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 28: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Composição  vs.  herança  

Maio  2013   O  Paradigma  Orientado  a  Objetos   28  

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() { } }

Page 29: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 30: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Membros  protegidos  

Maio  2013   O  Paradigma  Orientado  a  Objetos   30  

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(); } }

Page 31: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 32: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 33: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Polimorfismo  

Maio  2013   O  Paradigma  Orientado  a  Objetos   33  

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 { /* ... */ }

Page 34: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Polimorfismo  

Maio  2013   O  Paradigma  Orientado  a  Objetos   34  

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); } }

Page 35: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Upcas%ng  (ampliação)  •  Nome  dado  à  conversão  implícita  de  uma  subclasse  para  uma  superclasse:  

Maio  2013   O  Paradigma  Orientado  a  Objetos   35  

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! } }

Page 36: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 37: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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  

Page 38: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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:  

Maio  2013   O  Paradigma  Orientado  a  Objetos   38  

public static final int MAX = 1000; private final String NOME = "Java"; final double RAD = Math.PI / 180;

Page 39: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Referência  constante  •  Um  primi%vo  constante  nunca  muda  de  valor;  •  Uma  referência  constante  nunca  muda,  mas  o  objeto  pode  mudar  internamente:  

Maio  2013   O  Paradigma  Orientado  a  Objetos   39  

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! } }

Page 40: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Dados  finais  não  inicializados  

Maio  2013   O  Paradigma  Orientado  a  Objetos   40  

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(); } }

Page 41: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Argumentos  finais  •  Um  parâmetro  de  um  método  pode  ser  final:  

– Dentro  do  método,  funciona  como  constante.  

Maio  2013   O  Paradigma  Orientado  a  Objetos   41  

public class Teste { public void soImprimir(final int i) { // Erro: i++; System.out.println(i); } }

Page 42: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

Métodos  finais  •  Métodos  finais  não  podem  ser  sobrescritos  por  uma  subclasse;  

•  Chamada  do  método  inline  (maior  eficiência).  

Maio  2013   O  Paradigma  Orientado  a  Objetos   42  

class Telefone { public final void discar() { } } // Não compila: discar() é final! class TelefoneCelular extends Telefone { public void discar() { } }

Page 43: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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

Maio  2013   O  Paradigma  Orientado  a  Objetos   43  

class Telefone { private final void checarRede() { } } // OK. São dois métodos diferentes! class TelefoneCelular extends Telefone { private final void checarRede() { } }

Page 44: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

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.  

Maio  2013   O  Paradigma  Orientado  a  Objetos   44  

class Telefone { } final class TelefoneCelular extends Telefone { } // Erro: TelefoneCelular é final! class TelefoneAtomico extends TelefoneCelular { }

Page 45: Desenvolvimento OO com Java 5 – Reuso de Classesvitorsouza/wp-content/uploads/java-br-curso... · Desenvolvimento OO com Java 5 – Reuso de Classes Vítor E. Silva Souza ... reuso)com)composição)ou)herança;)

h"p://nemo.inf.ufes.br/  

Maio  2013   O  Paradigma  Orientado  a  Objetos   45