Capítulo 5 Reuso de Classes

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

Java 2 Standard Edition Como criar classes e objetos

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

Programação Orientada a Objetos (DPADF 0063)

Programação Orientada a Objetos em Java

Reuso com Herança a e Composiçã

Programação por Objectos. Java

Herança. Alberto Costa Neto DComp - UFS

Módulo 06 Desenho de Classes

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

Orientação a Objetos e a Linguagem Java

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

Técnicas de Programação II

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

Programação por Objectos. Java

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Encapsulamento de Dados

Desenvolvimento OO com Java Herança, reescrita e polimorfismo

Computação II Orientação a Objetos

Classes, Superclasses e Subclasses

1. Herança. Sobrescrevem métodos - redefinem métodos herdados. Subclasse herda de uma superclasse

Análise e Projeto Orientados por Objetos

Aula 3 Objeto atual com referencia THIS e Classes com Herança

Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Tópicos da Aula. Classes e Objetos. Classe Pública em Java. Classes em Java. Assinatura de Métodos. Corpo de Classes e Métodos. Conceitos de classe

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercícios de Revisão Java Básico

Módulo 07 Características Avançadas de Classes

Noções sobre Objetos e Classes

PHP INTRODUÇÃO CLASSES E OBJETOS

Análise de Programação

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

DEFINIÇÃO DE MÉTODOS

Herança. Algoritmos e Programação II. Aula 5 Herança

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Orientação a Objetos com Java

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Programação Orientada a Objetos em java. Polimorfismo

Programação de Computadores - I. Profª Beatriz Profº Israel

Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único

Programação Orientada a Objetos. Encapsulamento

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Linguagem de Programação III

Desenvolvimento OO com Java Orientação a objetos básica

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

A Introdução à Programação Orientada a Objetos. Programação e Sistemas de Informação

Curso Java Starter. 1

Para desenvolver a atividade a atividade desta aula utilizaremos o ambiente de desenvolvimento integrado NetBeans.

Guia de Fatores de Qualidade de OO e Java

POO Programação Orientada a Objetos. Classes em Java

Capítulo 4 Classes e Objetos

Revisão OO Básico. Orientação a Objetos em Java

Unidade IV: Ponteiros, Referências e Arrays

Prof. Jhonatan Fernando

Programação com Acesso a BD. Programação com OO Acesso em Java

Capítulo 3. Programação por objectos em Java

Capítulo 4. Packages e interfaces

Orientação a Objetos

Introdução a Java. Hélder Nunes

Padrão Básico de Projeto: Interfaces e Polimorfismo

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Material de Apoio 5. int getres() { return res; O que estas classes possuem em comum? 1) 2) 3)

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

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

Projeto de Software Orientado a Objeto

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Programação Orientada por Objetos

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

THREADS EM JAVA. George Gomes Cabral

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

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p:// h7p://leveme.

5 Caso de estudo O cartão fidelidade

Programação Concorrente em java - Exercícios Práticos Abril 2004

BSI UFRPE Prof. Gustavo Callou

Introdução à orientação a objetos. João Tito Almeida Vianna 25/05/2013

3 Classes e instanciação de objectos (em Java)

Polimorfismo. Prof. Leonardo Barreto Campos 1

Implementação de Classe e Auto-Relacionamento em Java

CURSO DE PROGRAMAÇÃO EM JAVA

HERANÇA. Prog. Orientada a Objetos em Java

Programação com Objectos. Processamento de Dados I. 4. Classes Abstractas

UNIVERSIDADE FEDERAL DO PARANÁ

Clonando Discos. Manual. Clonagem de Discos. Regiane S. de Carvalho Engenheira da Computação MEC/SEED/DITEC/CETE

Capítulo 8. Introdução UML

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

Transcrição:

Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. Desenvolvimento Orientado a Objetos com Java Capítulo 5 Reuso de Classes

Licença para uso e distribuição Este material está disponível para uso nãocomercial e pode ser derivado e/ou distribuído, desde que utilizando uma licença equivalente. Atribuição-Uso Não-Comercial- Compatilhamento pela mesma licença, versão 2.5 http://creativecommons.org/licenses/by-nc-sa/2.5/deed.pt Você pode copiar, distribuir, exibir e executar a obra, além de criar obras derivadas, sob as seguintes condições: (a) você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante; (b) você não pode utilizar esta obra com finalidades comerciais; (c) Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta. 2

Objetivos deste capítulo Apresentar os conceitos de reutilizaçã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 produtivo. 3

Reuso / reutilização Para entregar software de qualidade em menos tempo, é preciso reutilizar; 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 ). 4

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 primitivos e referências a objetos; Operadores de seleção; Inicialização (zerar e atribuir valor inicial); O valor null; Atributos estáticos. 5

Composição class Aleatorio { int numero; Aleatorio(int max) { numero = new Random().nextInt(max); 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); 6

Herança Criação de novas classes estendendo classes existentes; Relacionamento é um [subtipo de] : um livro é um produto, um administrador é um usuário; Uso da palavra-chave extends; A palavra-chave é sugestiva a classe que está sendo criada estende outra classe: Parte do que já existe naquela classe; Pode adicionar novos recursos; Pode redefinir recursos existentes. 7

Herança Sintaxe: class Subclasse extends Superclasse { Semântica: A subclasse herda todos os atributos e métodos que a superclasse possuir; Subclasse é uma derivação, um subtipo, uma extensão da superclasse. 8

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

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

Herança public class Loja { public static void main(string[] args) { Livro l; l = new Livro("Ling. de Programação", 74.90, "Flávio Varejão", 334); System.out.println(l.ehCaro()); System.out.println(l.ehGrande()); 11

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

Sinônimos Superclasse; Classe base; Classe pai/mãe; Classe ancestral; Etc. Subclasse; Classe derivada; Classe filha; Classe descendente; Etc. 13

Sobrescrita de métodos Se um método herdado não satisfaz, podemos redefini-lo (sobrescrevê-lo): public class Livro { /* Definições anteriores... */ // Livros acima de R$ 200 são caros! public boolean ehcaro() { return (preco > 200); 14

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

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

A classe Object Em Java, todos os objetos participam de uma mesma hierarquia, com uma raiz única; Esta raiz é a classe java.lang.object. class Produto { = class Produto extends Object { 17

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 é garantia); 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. 18

Object.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 19

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

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()"); 21

Inicialização da classe base O construtor base é chamado automaticamente; 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() 22

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

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() 24

Construtores com 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 25

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

Construtores com parâmetros 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); 27

Composição x herança Use herança quando: Uma classe representa um subtipo de outra classe; Construção de famílias de tipos; 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 utilizados em conjunto a todo momento! 28

Composição x 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() { 29

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

Membros protegidos public class A { int x = 10; protected void print() { System.out.println(x); protected void incr() { x++; letras A.java B.java numeros Um.java 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(); 31

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 utilizados internamente e, portanto, serem privados ou protegidos. 32

Vantagens da herança Suportar do desenvolvimento incremental; Classes já testadas podem ser reutilizadas; Economia de tempo. Relacionamento é um : Permite substituir a classe base por uma subclasse quando a primeira é esperada; Propriedade que chamamos de polimorfismo; Veremos em mais detalhes no próximo capítulo. 33

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

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

Upcasting (Ampliação) Nome dado à conversão implícita de uma subclasse para uma superclasse: class Teste { public 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! 36

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? 37

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. Objetivos: Eficiência; Garantir propriedades de projeto. 38

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, utiliza-se a palavra final: public static final int MAX = 1000; private final String NOME = "Java"; final double RAD = Math.PI / 180; 39

Referência constante Um primitivo 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! 40

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. 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(); 41

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

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

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

Classes finais Classes finais não podem ter subclasses; Por conseqüência, todos os métodos de uma classe final são automaticamente finais. class Telefone { final class TelefoneCelular extends Telefone { // Erro: TelefoneCelular é final! class TelefoneAtomico extends TelefoneCelular { 45