Modulo Ia Introdução ao Java

UniverCidade - Prof. Ismael H F Santos

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

1

Ementa
Modulo I - Introdução a Linguagem JAVA
Paradigma OO Características da linguagem Plataformas Java Introdução Prática Fundamentos da linguagem Interfaces e Classes Abstratas Classes parametrizadas (não é Generics !)

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

2

1

Bibliografia
Linguagem de Programação JAVA
Ismael H. F. Santos, Apostila UniverCidade, 2002

The Java Tutorial: A practical guide for programmers
Tutorial on-line: http://java.sun.com/docs/books/tutorial

Java in a Nutshell
David Flanagan, O´Reilly & Associates

Just Java 2
Mark C. Chan, Steven W. Griffith e Anthony F. Iasi, Makron Books.

Java 1.2
Laura Lemay & Rogers Cadenhead, Editora Campos
April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br 3

Livros
Core Java 2, Cay S. Horstmann, Gary Cornell Volume 1 (Fundamentos) Volume 2 (Características Avançadas) Java: Como Programar, Deitel & Deitel Thinking in Patterns with JAVA, Bruce Eckel Gratuito. http://www.mindview.net/Books/TIJ/

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

4

2

POO-Java
Paradigma OO

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

5

Paradigma OO
Paradigmas de Programação
Programação Procedural ou Imperativo Programação Funcional Programação Lógico Programação Orientada por Objetos

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

6

3

José. então. para que ele envie um bouquet de rosas ao endereço de Maria. cumprir a requisição.puc-rio. João vai.” April 05 Prof. até a floricultura e pede a José. e lhe passa uma mensagem contendo sua requisição: enviar rosas para Maria. Santos . April 05 Prof. e pede para que as flores sejam entregues. Então. F.puc-rio. F.br 8 4 .ismael@tecgraf. da cidade de Maria. por sua vez.ismael@tecgraf. o floricultor. O método utilizado por José pode estar oculto de João. José. Santos .Paradigma OO Cenário Exemplo “João deseja enviar flores para Maria mas ela mora em outra cidade. ele procura um agente. Ismael H. liga para uma outra floricultura.br 7 Paradigma OO Colocação do Problema . através de algum método. José tem a responsabilidade de.nomenclatura João precisa resolver um problema. Ismael H.

puc-rio. Se o agente receptor da mensagem a aceita. além de toda a informação necessária. Santos . F. Ismael H. F. isto é os argumentos.ismael@tecgraf. Possuem a responsabilidade de executar um método que cumpra a requisição. Possuem um estado representado por informações internas. Santos .ismael@tecgraf.br 10 5 .puc-rio. April 05 Prof. A mensagem carrega uma requisição. para que a ação seja executada. Recebem essas requisições através de mensagens. April 05 Prof. ele tem a responsabilidade de executar um método para cumprir a requisição.br 9 Paradigma OO Objetos Estão preparados para cumprir um determinado conjunto de requisições.Paradigma OO Modelo OO Uma ação se inicia através do envio de uma mensagem para um agente (um objeto) responsável por essa ação. Ismael H.

br 11 Paradigma OO Classes O conjunto de requisições que um objeto pode cumprir é determinado pela sua classe. Objetos são instâncias de classes. F. através de herança. A classe também determina que método será executado para cumprir uma requisição.00 Alterar Cargo Estado Alterar Dados Pessoais Imprimir Cargo April 05 Prof.puc-rio. Santos .ismael@tecgraf. F. Classes podem ser compostas em hierarquias.ismael@tecgraf. April 05 Prof. Ismael H. Santos .Paradigma OO Objeto Atualizar Salário Salá Imprimir Dados Pessoais Imprimir Salário Salá Método José José Engenheiro R$ 1200.puc-rio. Ismael H.br 12 6 . A classe especifica que informações um objeto armazena internamente.

br 13 Paradigma OO Encapsulamento As classes possuem uma parte invisível. Santos . e uma parte visível que é a sua interface.Paradigma OO Classe Atualizar Salario Imprimir Dados Pessoais Imprimir Salario Serviços Serviç Nome Cargo Salário Salá Alterar Cargo Atributos Alterar Dados Pessoais Imprimir Cargo April 05 Prof. As operações da interface possibilitam o acesso aos objetos.puc-rio. April 05 Prof. que é a sua implementação. Santos . F.puc-rio. F.ismael@tecgraf. Ismael H. Ismael H.br 14 7 .ismael@tecgraf.

puc-rio.br 16 8 . A definição de classes em termos de outras classes constitui uma hierarquia: superclasses (classes ancestrais ou bases) subclasses (classes derivadas) Recurso utilizado para especializar ou estender classes.br 15 Paradigma OO Herança . F.ismael@tecgraf. Santos .Hierarquia de Classes Mamíferos Humanos Floricultores José April 05 Prof.puc-rio. April 05 Prof. Santos . Ismael H.ismael@tecgraf. F.Paradigma OO Herança Compartilhamento de atributos e serviços entre classes. Ismael H.

br 18 9 . Ismael H.ismael@tecgraf.puc-rio.ismael@tecgraf. Santos . Santos .br 17 Paradigma OO Herança Múltipla Veículo Veículo Aquático Veículo Terrestre Barco Veículo Anfíbio Carro April 05 Prof.puc-rio. F. Ismael H. F.Paradigma OO Herança Simples Objetos Materiais Animais Mamíferos Humanos Dentistas João April 05 Vegetais Rosas Rosas da Maria Floricultores José Prof.

Nome Pessoa .Paradigma OO Polimorfismo Implica na redefinição de um método ou serviço da superclasse. Santos . F.Salário Atualizar Salário Vendedor Recepcionista 20 April 05 Prof. Ismael H. Santos . Métodos com várias formas.ismael@tecgraf.puc-rio.br 19 Paradigma OO Polimorfismo Atualizar Dados Pessoais . Desta forma. Ismael H. April 05 Prof. implica em métodos com várias implementações. pode haver métodos com diferentes implementações em uma hierarquia.Idade Atualizar Salário Empregado .ismael@tecgraf.br 10 .puc-rio.Endereço . F.

puc-rio.puc-rio.br 22 11 . Ismael H. Ismael H. F. Todo objeto é uma instância de uma classe.Sumário Agentes são objetos. Ações são executadas através da troca de mensagens entre objetos.Paradigma OO .ismael@tecgraf. Uma classe define uma interface e um comportamento.br 21 Paradigma OO . Santos .ismael@tecgraf. F. Santos . Classes podem estender outras classes através de herança.Sumário April 05 Prof. April 05 Prof.

F. Santos .Sumário April 05 Prof.ismael@tecgraf.ismael@tecgraf.br 24 12 . Santos .Paradigma OO . Ismael H.br 23 Paradigma OO . Ismael H.puc-rio. F.Sumário April 05 Prof.puc-rio.

br 26 13 .ismael@tecgraf. F.puc-rio. F. Ismael H.ismael@tecgraf. Santos . Ismael H. Santos .br 25 Paradigma OO Por que OO ? Porque promove o desenvolvimento de software com qualidade Correção Robusto Extensibilidade Reusabilidade Compatibilidade April 05 Prof.puc-rio.Sumário April 05 Prof.Paradigma OO .

5. Santos .br 27 Características da Linguagem Java é uma Linguagem OO. Ismael H.POO-Java Características da Linguagem April 05 Prof.0) Java segundo a Sun Microsystems Simples interpretada architecture-neutral multithreaded April 05 object-oriented robusta portável dinâmica Prof. Três grandes revisões: Java Development Kit (JDK) 1.0/1.1.br distribuída segura alta performance 28 14 . 1.3.ismael@tecgraf.2.puc-rio.0. 1. contendo uma coleção de APIs para o desenvolvimento de aplicações multiplataforma Java foi lançada pela Sun em 1995.1/1. Santos .8 Java 2 Platform ( Java 2 SDK e JRE 1.2 Java Development Kit (JDK) 1.4. F. Ismael H.puc-rio. F.ismael@tecgraf.

awt. etc) Diferentemente de C++. Santos . April 05 Prof.br 29 Características da Linguagem Orientada a Objeto Suporte completo a OOP. não suporta templates. Ismael H. GUI java. não utiliza ponteiros.swing => classes para interface GUI extensão do AWT java. listas.puc-rio. caracter e boolean.ismael@tecgraf. Santos .awt. F. texto. não trabalha com unions ou estruturas.event => classes para tratamento de eventos na interface GUI java. somente classes. a maioria dos tipos em Java são objetos.lang => classes para definição básica da linguagem (core language) java. Define uma extensa biblioteca de classes. disponibilizadas em pacotes (packages). ausência de goto (apesar de suportar break para label).util => classes para tipos de dados úteis (arrays.io => classes para input / output java.image => classes para processamento de imagens java.awt => classes para gráficos.puc-rio. não suporta herança múltipla. F. janelas.Características da Linguagem Simplicidade Poucos comandos. Vetores e strings são objetos. mecanismos de tratamento de exceção.net => classes para network computing java.awt. Java só trabalha com referências ! April 05 Prof.ismael@tecgraf. com exceção dos tipos: numéricos. Ismael H. java.applet => classes para implementação de Applets java.peer => classes para interface GUI independente de plataforma java. não permite sobrecarga de operadores.br 30 15 .awt.

Ismael H. Santos . April 05 Prof. Através dos Bytecodes. Java provê um formato de arquivo objeto neutro (independente de plataforma). Não suporta ponteiros.ismael@tecgraf. Requer declaração explícita de métodos (idem ANSI-C). o que é feito pelo interpretador Java.package.ismael@tecgraf. Santos . Suporta vários níveis de conectividade através de classes presentes no java. Um programa em Java pode rodar em qualquer plataforma que tenha o interpretador Java instalado e as bibliotecas de run-time. Ismael H. Robusta Java é uma linguagem fortemente tipada (mais que C++).br 32 16 . Suporta conexão através de sockets (socket class). Para executar um programa Java é preciso se interpretar os Bytecodes.net. F. April 05 Prof. F.Características da Linguagem Distribuída Java suporta aplicações Cliente/Servidor por ser uma linguagem distribuída.puc-rio. o que permite a sua migração entre plataformas de maneira eficiente e segura.puc-rio.br 31 Características da Linguagem Interpretada O compilador Java gera Bytecodes ao invés de código nativo de cada máquina. eliminando assim a possibilidade de invasões de área e manipulação errônea com aritmética de ponteiros.

Santos .ismael@tecgraf.puc-rio. Ismael H. Ismael H. Santos . F.br 33 JVM – Java Virtual Machine COMPILADOR JAVA (translator) (o mesmo para todas as plataformas) INTERPRETADOR JAVA (um para cada sistema diferente) JAVA BYTE CODE Windows 2K Macintosh April 05 Solaris Windows NT 34 Prof.Características da Linguagem Compilação e Interpretação no Java JVM = Interpretador + Run-time System April 05 Prof.ismael@tecgraf.puc-rio.br 17 . F.

Java API Métodos nativos Dynamic libraries Compilador Java Java Bytecodes movido localmente ou remotamente através de uma rede Java Interpretador Compilador JIT Java Virtual machine Sistema de Runtime Java Bytecode (. Santos . Ismael H.Ciclo de vida de um programa em Java Ambiente de compilação Fonte Java (.puc-rio.puc-rio.class ) April 05 SO Hardware Prof.java) Ambiente de execução Class Loader Verificador de Bytecode Bibliotecas de Classes . Ismael H. Santos .br 36 18 . F.ismael@tecgraf.br 35 JVM – Class Loader April 05 Prof.ismael@tecgraf. F.

Santos .br 37 JSDK . Ferramentas para desenvolvimento: compilador.também distribuído separadamente: ambiente para execução de aplicações. Demonstrações de uso das APIs.puc-rio. Ismael H. principalmente Applets.ismael@tecgraf. F. Ismael H. Santos . F. debugger. interface gráfica com Swing e recursos de multimídia. etc.br 38 19 .Ambiente de Desenvolvimento April 05 Prof.ismael@tecgraf. gerador de documentação. Código-fonte das classes da API. empacotador JAR. A documentação é distribuída separadamente April 05 Prof.J2SDK – Java System Devel. Kit O JSDK (Java System Development Kit) é o ambiente padrão distribuído pela Sun para desenvolvimento de aplicações Java O JSDK consiste de JRE (Java Runtime Environment) .puc-rio.

Verificação de Bytecodes Etapa que antecede a execução do código em classes carregadas através da rede Class Loader distingue classes locais (seguras) de classes remotas (potencialmente inseguras) April 05 Prof. F.ismael@tecgraf. Santos .Compilação para Byte-code April 05 Prof.br 40 20 . Ismael H.ismael@tecgraf.puc-rio. Ismael H. Durante a execução a maquina virtual Java (JVM) executa um processo de verificação dos Bytecodes do programa para assegurar que a classe carregada a partir da rede não tenha sido adulterada (no caso de Applets).puc-rio.br 39 Bytecode Verifier Segurança Referências à memória são resolvidas pelo compilador e traduzidas durante a execução pelo interpretador. F. Santos .

F. Inicializar o objeto (via construtor) 3.awt–Abstract Windowing Toolkit) de forma que a aplicação terá sempre o mesmo comportamento e aparência em qualquer plataforma Coleta de Lixo Memória alocada em Java não é liberada pelo programador. para um formato neutro (independente de plataforma).ismael@tecgraf. Alocar memória no heap para armazenar dados do objeto 2.puc-rio.puc-rio.Bytecode Verifier Verificação de Bytecodes (cont) Verificação garante Aderência ao formato de arquivo especificado [JVMS] Não-violação de políticas de acesso estabelecidas pela aplicação Não-violação da integridade do sistema Ausência de estouros de pilha Tipos de parâmetros corretamente especificados e ausência de conversões ilegais de tipos April 05 Prof. Santos .br 42 21 . Atribuir endereço de memória a uma variável (referência) April 05 Prof. Santos .ismael@tecgraf. Java define uma biblioteca gráfica padrão para GUI (java. objetos criados não são destruídos pelo programador A criação de objetos em Java consiste de: 1.br 41 Características da Linguagem Java Arquitetura Neutra Programas Java são compilados. Além disso. F. A primeira vantagem é a possibilidade de executar este programa em qualquer HW que suporte um JVM. ou seja. Ismael H. conforme já vimos. Ismael H.

ismael@tecgraf.br 43 Características da Linguagem Java Coleta de Lixo (cont. e a memória pode ser liberada. Ismael H.) Quando um objeto não tem mais referências apontando para ele.br 44 22 .Características da Linguagem Java Coleta de Lixo (cont.puc-rio. O coletor de lixo irá liberar a memória na primeira oportunidade April 05 Prof. Ismael H.ismael@tecgraf.puc-rio. F. F. Santos . seus dados não mais podem ser usados. Santos . conforme o exemplo abaixo: April 05 Prof.) Mais de uma referência pode apontar para o mesmo objeto.

Ismael H.br 46 23 . Santos .Características da Linguagem Java Portabilidade Arquitetura Neutra é apenas uma parte do processo para se obter a portabilidade! Java se preocupa em não deixar nenhum aspecto da linguagem sendo dependente de implementação. F.ismael@tecgraf. Ismael H.puc-rio.br 45 Características da Linguagem Java Java Applet April 05 Prof. Além disso Java apresenta suporte para a mobilidade de código via rede como é o caso de applets.puc-rio. Santos .ismael@tecgraf. April 05 Prof. Por isso o tamanho dos tipos de dados de Java são definidos independentes de plataforma (veremos isso adiante) Dinâmica Java é mais dinâmica que C/C++. Bibliotecas podem livremente somar novos métodos e instâncias de variáveis sem nenhum efeito em seus clientes. F. Em Java descobrir o tipo de uma instância em tempo de execução é algo extremamente simples.

Características da Linguagem Java Alta Performance Antigamente Java era aproximadamente 10 a 20 vezes mais lenta que o código gerado em C/C++. Estas primitivas estão baseadas no modelo de monitor e variáveis de condição definidas por C. Além disso. Threads em Java têm a capacidade de usar os recursos de sistemas com múltiplos processadores.lang define a classe Thread e inclui suporte a primitivas de sincronização de threads. Alem disso conversores de Java para C/C++ já estão disponíveis e podem ser usados nos casos onde a necessidade de performance seja crítica.A.puc-rio. Java é uma linguagem multithread. Ismael H.puc-rio. F. April 05 Prof. April 05 Prof. Santos .ismael@tecgraf.ismael@tecgraf. F. suportando múltiplas threads para a execução de várias tarefas em paralelo. Santos . Ismael H. Mais recentemente a tecnologia HotSpot tem se mostrado bastante eficiente e já se consegue executar programas com performance semelhante a de programas em C ou ate mesmo Fortran.br 47 Características da Linguagem Java MultiThreaded Aplicações gráficas e distribuídas devem possibilitar a execução de várias tarefas de forma concorrente (Web Browser). Hoare.br 48 24 .R. O pacote java. Atualmente após diversas pesquisas na area de compiladores com tecnologia JIT (Just In Time Compiler) já e’ possível a tradução de Bytecodes direto para código de máquina da CPU durante a execução. Escrever código com múltiplas threads é extremamente difícil em C e/ou C++ já que estas linguagens não foram projetadas com este intuito.

F. Ismael H.br 50 25 .ismael@tecgraf. Standard Edition (J2SE) Java 2 Plataform. Micro Edition (J2ME) April 05 Prof.ismael@tecgraf. F. Ismael H. Santos .POO-Java Plataformas Java April 05 Prof.br 49 The Java Plataforms Java 2 Plataform.puc-rio.puc-rio. Enterprise Edition (J2EE) Java 2 Plataform. Santos .

Ismael H.puc-rio. Santos .Java 2 Plataform SE April 05 Prof. Santos .br 51 Global Enterprise April 05 Prof. F.puc-rio.ismael@tecgraf.ismael@tecgraf. Ismael H.br 52 26 . F.

br 54 27 . Santos . F.puc-rio.puc-rio. Santos .ismael@tecgraf. Ismael H. suporte a transações distribuídas Segurança Disponibilidade Escalabilidade Suporte a distribuição da aplicações Integração de diversas aplicações Facilidades de administração April 05 Prof. Ismael H.Java Plataform EE April 05 Prof. F.br 53 JEE Container Funções Concorrência na execução multi-usuarios Consistência.ismael@tecgraf.

Santos . F.puc-rio.br 56 28 . Santos .puc-rio.br 55 O Ambiente JEE April 05 Prof. F. Ismael H.ismael@tecgraf.ismael@tecgraf.O Ambiente JEE April 05 Prof. Ismael H.

Se encarregam do gerenciamento da comunicação entre as camadas de Apresentação.puc-rio.br 58 29 . Negócios e Persistência. F.br 57 O deployment da Aplicação April 05 Prof.J2EE Containers x Components Containers O container é o carro Representa o suporte dado pela plataforma. Santos .ismael@tecgraf. Components O componente é o motorista Aplicação do cliente é mais facilmente codificada através do uso dos componentes disponibilizados pela plataforma April 05 Prof. F. realizando seu trabalho de forma transparente para o usuario.ismael@tecgraf. Santos . Ismael H. Ismael H.puc-rio.

ismael@tecgraf. Santos .ismael@tecgraf.br 60 30 . Santos .br 59 Java 2 Plataforms ME April 05 Prof.puc-rio. F.Ciclo de Vida da Aplicação April 05 Prof. Ismael H. Ismael H. F.puc-rio.

Santos . CLDC (Connected Limited Device Configuration) Mínimo: 512 Kb ROM. conexão de rede wireless com baixa taxa de transmissão e acesso intermitente. 256 Kb RAM e algum tipo de conexão.puc-rio.ismael@tecgraf. GUI restrita. F. rede(HTTP. PDAP (PDA Profile) April 05 Prof. RS232. HTTPS. sons FP (Foundation Profile). possivelmente persistente.ismael@tecgraf. contem bibliotecas de classes para a criação de aplicações para uma categoria restrita de dispositivos MIDP 2. Especifica uma JVM e uma API que podem ser portadas facilmente entre uma larga faixa de dispositivos. Ismael H.puc-rio. gráficos. define aspectos de seguranca. Datagramas). Ismael H. April 05 Prof. JGP (JavaGame Profile) PP (Personal Profile).A especificação J2ME O J2ME e dividido em Configurações e Perfis Uma Configuração define uma plataforma Java para uma faixa de equipamentos.br 61 A especificação J2ME O J2ME Perfis O Perfil é o suplemento da configuração para dispositivos específicos. e com alta taxa de transmissão. tecnologia Push. F.br 62 31 . 32 Kb RAM. Sockets. Santos .0 (Mobile Information Device Profile). CLDC (Connected Device Configuration) Mínimo: 128 Kb ROM.

backCommand = new Command("Back". textBox.*.0). List.. private boolean firstTime = true.INFO). Ismael H.SCREEN.. Command. AlertType. aboutCommand = new Command("About".ismael@tecgraf. propsCommand = new Command("SysProps". 1). import javax.puc-rio.addCommand(aboutCommand).Exemplo J2ME . April 05 Prof. */ public class HelloWorldMIDlet extends MIDlet implements CommandListener { private Display display.microedition.HelloWorldMIDlet /* * @(#)HelloWorldMIDlet. /** * An example HelloWorldMIDlet shows the values of the system properties. F.256. */ public HelloWorldMIDlet() { // Display display = Display. F. "System Properties".BACK. 2). Ismael H.". // Form info props = new Form("System Properties").addCommand(backCommand).addCommand(backCommand).java .0 03/03/05 */ package example. null). 1).*. /* * Construct a new HelloWorldMIDlet.puc-rio. 2). private StringBuffer propbuf = new StringBuffer(50). backCommand.addCommand(exitCommand). "Alert" }.1. stringElements. "Hello World MIDlet Example . aboutCommand. // First Display shows List options String stringElements[] = { "About".lcdui.midlet. "Testing Alert .EXIT. // Sintax: TextBox("Title". // Alert Message alert = new Alert("Hello Alert". propsCommand. private TextBox textBox. textBox. list.IMPLICIT. Santos .) // Sintax: Command("Name". Command. Priority) exitCommand = new Command("Exit". props.br 64 32 . import javax. Command. Santos . props. Command.addCommand(propsCommand).getDisplay(this).. } April 05 Prof.ismael@tecgraf. list = new List("Título".SCREEN. private Alert alert. null.. Type. private List list.br 63 Exemplo J2ME (cont.microedition.addCommand(exitCommand). Validations) textBox = new TextBox("HelloWorldMIDlet".". textBox. props. private Command exitCommand.addCommand(exitCommand). "Initial text". NrChars. private Form props.

display. Santos . list. Ismael H.) /** * Handle events */ public void commandAction(Command c.append(showProp("microedition.append(showProp("microedition.gc().append(showProp("microedition.setCurrent(props). "Free Memory = " + free + "\n")).profiles")). } else if ( list. props.set(0.ismael@tecgraf.configuration")). } else { props. props. display.br 66 33 .append("Free Memory = " + free + "\n").) /** * Show the value of the properties */ public void startApp() { Runtime runtime = Runtime.encoding")). display.setCurrent(props). display. if( firstTime ) { long total = runtime. } else if ( c == backCommand ) { list. Santos .append(showProp("microedition.setCommandListener(this). } else if ( c == propsCommand ) { props. Ismael H.puc-rio.puc-rio.br 65 Exemplo J2ME (cont.setCommandListener(this). long free = runtime. props.setCurrent(list). display.setCurrent(textBox).locale")).append(showProp("microedition. firstTime = false. notifyDestroyed().getSelectedIndex() == 1 ) { props. new StringItem("". F.getSelectedIndex() == 0 ) { textBox.setCurrent(list).getRuntime(). } else if ( c == aboutCommand ) { textBox.setCommandListener(this). } else { if ( list. props.setCurrent(textBox).setCommandListener(this). } } } April 05 Prof. props.setCommandListener(this). Displayable s) { if ( c == exitCommand ) { destroyApp(false).ismael@tecgraf. } else { display.setCommandListener(this).Exemplo J2ME (cont.totalMemory(). display. runtime.platform")).append("Total Memory = " + total + "\n"). props.freeMemory(). props. F.setCurrent(alert). } } April 05 Prof.

ismael@tecgraf.append(prop).) /** * Show a property. } else { propbuf. */ public void pauseApp() { } /** * Destroy must cleanup everything. propbuf. */ public void destroyApp(boolean unconditional) { } } April 05 Prof.append("<undefined>"). if (value == null) { propbuf.append("\"").toString().getProperty(prop).append("\n").setLength(0). Ismael H. Santos . propbuf.append(value).puc-rio.puc-rio. Santos . } /** * Time to pause. propbuf.Exemplo J2ME (cont. Ismael H.br 67 Tecnologia JavaCard Disponibiliza Java para “smart cards” JavaCard define um subset da linguagem Java e da Java Virtual Machine para executar em “smart cards” OOP para “smart cards” mais simples e poderosa do que programação em C Modelo Web browser de funcionamento Core and extensions JavaCard API JavaCard Runtime Environment (JCRE) April 05 Prof. F. propbuf. F.ismael@tecgraf.br 68 34 . */ String showProp(String prop) { String value = System. propbuf.append(" = ").append("\""). return propbuf. free any space we don't need right now. } propbuf.

Ismael H.Desenvolvendo aplicação JavaCard April 05 Prof. Santos . F.ismael@tecgraf. Santos .br 69 POO-Java Introdução Prática April 05 Prof.br 70 35 . F.puc-rio.ismael@tecgraf.puc-rio. Ismael H.

br 72 36 . F.awt. Santos .puc-rio.Introdução Prática Programa Exemplo Crie o programa “AloMundo.ismael@tecgraf. public class HelloWorld extends Applet { public void paint(Graphics g) { g.Applet Applet Exemplo – “AloMundoApplet. F.ismael@tecgraf.Graphics. 50.puc-rio.br 71 Introdução Prática . } } Exercício . import java.Questão 1 April 05 Prof. Santos .drawString("Hello world!".java” (case-sensitive) public class AloMundo { public static void main(String[] args){ System. Ismael H.Questão 2 April 05 Prof.out.println(“Alô Mundo!”). Ismael H.java” Applets são programas que podem ser executados em Browsers compatíveis com a linguagem Java import java.applet.Applet. } } Exercício . 25).

Santos .ismael@tecgraf.puc-rio. Ismael H. F.br 74 37 .Como Compilar April 05 Prof. Santos .ismael@tecgraf.br 73 Class Loader e CLASSPATH April 05 Prof. F. Ismael H.puc-rio.

Como Executar April 05 Prof. Ismael H.puc-rio. Ismael H. F.puc-rio. Santos .br 76 38 .br 75 Outras ferramentas do JSDK April 05 Prof.ismael@tecgraf.ismael@tecgraf. Santos . F.

Ismael H.puc-rio.br 78 39 .POO-Java Fundamentos da Linguagem April 05 Prof. Não faz qualquer consideração com relação à implementação. Ismael H. Santos . Santos . April 05 Prof.puc-rio. F.ismael@tecgraf.ismael@tecgraf. Define a interface de acesso à estrutura.br 77 Tipos Abstratos de Dados Modela uma estrutura de dados através de sua funcionalidade. F.

br 80 40 . A classe deve prover todos os métodos definidos na interface do TAD.ismael@tecgraf. Ismael H. Santos .puc-rio.Exemplo de TAD: Pilha Funcionalidade: armazenagem LIFO Interface: boolean isEmpty() verifica se a pilha está vazia push(int n) empilha o número fornecido int pop() desempilha o número do topo e o retorna int top() retorna o número do topo April 05 Prof. April 05 Prof. Ismael H. Santos .puc-rio. F.br 79 TAD × Classes Uma determinada implementação de um TAD pode ser realizada por meio de uma classe.ismael@tecgraf. F. Um objeto dessa classe implementa uma instância do TAD.

F. A classe Point precisa armazenar as coordenadas do ponto sendo representado de alguma forma.Fundamentos da Linguagem Classes e Objetos Em Java. Ismael H.br 81 Fundamentos da Linguagem Campos .puc-rio.Atributos ou Métodos Como dito.ismael@tecgraf.ismael@tecgraf. class Point { int x. Santos . F. Podemos criar uma classe Point para representar um ponto (omitindo sua implementação) da seguinte forma: class Point { .. y. } April 05 Prof.puc-rio. Santos .br 82 41 . classes definem dados que suas instâncias conterão. } April 05 Prof. a declaração de novas classes é feita através da construção class. Ismael H..

ismael@tecgraf. Ismael H.3) April 05 Prof.y = 3. // p1 e p2 representam o ponto (2. Point p1 = new Point(). Dessa forma. p2.br 84 42 . F.x = 2. Santos . p2.ismael@tecgraf.puc-rio. duas variáveis podem se referenciar ao mesmo ponto. Ismael H.puc-rio. nós sempre fazemos referência ao objeto. F.br 83 Fundamentos da Linguagem Referências para Objetos Em Java. uma nova instância (objeto) pode ser criada através do comando new. Santos . Point p2 = p1.Fundamentos da Linguagem Instanciação ou Criação Uma vez definida uma classe. Podemos criar uma instância da classe Point da seguinte forma: Point p = new Point(). April 05 Prof.

Point p1 = new Point(). p2.2) Point p2 = new Point().puc-rio. uma classe deve definir os métodos que irá disponibilizar. F.Fundamentos da Linguagem Acessando Campos Os campos de uma instância de Point podem ser manipulados diretamente.ismael@tecgraf.puc-rio. // p1 representa o ponto (1. A classe Point pode. // e p2 o ponto (0. por exemplo.y = 2.x = 1. F.0) April 05 Prof.y = 0. p1. p1.br 85 Fundamentos da Linguagem Métodos Além de atributos. prover um método para mover o ponto de um dado deslocamento.ismael@tecgraf. Ismael H.x = 0. a sua interface.br 86 43 . p2. Santos . April 05 Prof. isto é. Santos . Ismael H.

Fundamentos da Linguagem
Declaração de Método
Para mover um ponto, precisamos saber quanto deslocar em x e em y. Esse método não tem um valor de retorno pois seu efeito é mudar o estado do objeto. class Point { int x, y; void move(int dx, int dy) { x += dx; y += dy; } }
April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br 87

Fundamentos da Linguagem
Envio de Mensagens: Chamadas de Método
Em Java, o envio de uma mensagem é feito através de uma chamada de método com passagem de parâmetros. Por exemplo, a mensagem que dispara a ação de deslocar um ponto é a chamada de seu método move. p1.move(2,2); // p1 está deslocado de duas unidades // no sentido positivo, nos dois eixos.

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

88

44

Fundamentos da Linguagem
this
Dentro de um método, o objeto pode precisar de sua própria referência. Em Java, a palavra reservada this significa essa referência ao próprio objeto. class Point { int x, y; void move(int dx, int dy) { this.x += dx; this.y += dy; } }
April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br 89

Fundamentos da Linguagem
Inicializações
Em várias circunstâncias, é interessante inicializar um objeto. Por exemplo, poderíamos querer que todo ponto recém criado estivesse em (0,0). Esse tipo de inicialização se resume a determinar valores iniciais para os campos

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

90

45

Fundamentos da Linguagem
Inicialização de Campos
Por exemplo, a classe Point poderia declarar: class Point { int x = 0; int y = 0; void move(int dx, int dy) { this.x += dx; this.y += dy; } }
April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br 91

Fundamentos da Linguagem
Construtores
Ao invés de criar pontos sempre em (0,0), poderíamos querer especificar a posição do ponto no momento de sua criação. O uso de construtores permite isso. Construtores são mais genéricos do que simples atribuições de valores iniciais aos campos: podem receber parâmetros e fazer um processamento qualquer.

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

92

46

} April 05 Prof. F. this. Ismael H. } .x = x. Santos .Fundamentos da Linguagem Declaração de Construtores O construtor citado para a classe Point pode ser definido da seguinte forma: class Point { int x = 0. Point // p1 Point // p2 p1 = new Point(1..ismael@tecgraf. F. é o ponto (0. int y = 0.br 94 47 .y = y.ismael@tecgraf. devemos utilizá-lo no momento da instanciação. Santos . é o ponto (1.2) p2 = new Point(0. int y) { this.puc-rio. Ismael H.0)..0) April 05 Prof.br 93 Fundamentos da Linguagem Usando Construtores Como o construtor é um método de inicialização do objeto. Point(int x.2).puc-rio.

Ismael H.puc-rio. Destrutores são métodos que são chamados automaticamente quando um objeto deixa de existir.br 95 Fundamentos da Linguagem Finalizações Pode ser necessário executar alguma ação antes que um objeto deixe de existir. Se declararmos algum construtor.br 96 48 . April 05 Prof. Santos . vazio. destrutores são chamados de finalizadores. um construtor padrão.puc-rio. Para isso são utilizados os destrutores. F. que não recebe parâmetros.Fundamentos da Linguagem Construtor Padrão Quando não especificamos nenhum construtor. a linguagem Java declara. esse construtor padrão não será mais declarado. F.ismael@tecgraf. Ismael H.ismael@tecgraf. April 05 Prof. Em Java. implicitamente. Santos .

April 05 Prof.Fundamentos da Linguagem Gerência de Memória – Garbage Collection Java possui uma gerência automática de memória. quando um objeto não é mais referenciado pelo programa. nesse caso. Nem todas as linguagens OO fazem coleta de lixo e. April 05 Prof. Ismael H. o programador deve destruir o objeto explicitamente. Esse método deve efetuar qualquer procedimento de finalização que seja necessário antes da coleta do objeto. F.ismael@tecgraf.puc-rio. Santos .ismael@tecgraf. Ismael H. ele tem seu método finalize chamado. ele é automaticamente coletado (destruído). Santos . isto é. F. A esse processo chamamos “coleta de lixo”.br 98 49 .puc-rio.br 97 Fundamentos da Linguagem Finalizadores em Java Quando um objeto Java vai ser coletado.

ou seja.ismael@tecgraf. Daí.br 99 Fundamentos da Linguagem Membros de Classe: Motivação Considere uma classe que precise atribuir identificadores unívocos para cada objeto.ismael@tecgraf. recebe o seu identificador. Santos . Ismael H. F. F. o nome ‘membros estáticos’ usado em Java. ao ser criado. April 05 Prof. Em Java. declaramos um membro de classe usando o qualificador static. O identificador pode ser um número gerado seqüencialmente.puc-rio. membros compartilhados por todos os objetos da classe. de tal forma que cada objeto guarde o seu mas o próximo número a ser usado deve ser armazenado na classe. April 05 Prof. Cada objeto. Santos .puc-rio. Ismael H. Tais membros são comumente chamados de ‘membros de classe’ (versus ‘de objetos’).br 100 50 .Fundamentos da Linguagem Membros de Classe Classes podem declarar membros (campos e métodos) que sejam comuns a todas as instâncias.

. } April 05 Prof.próximo_id = 1 Produto caneta = new Produto()..br 102 Um só campo! 51 .id = 1 // caneta.br 101 Fundamentos da Linguagem Membros de Classe: Análise do Exemplo // Considere que ainda não há nenhum produto.próximo_id = 2 April 05 Prof. Ismael H. Santos . // lápis. } . Cada produto deve ter um código único de identificação. // caneta. Produto() { id = próximo_id. próximo_id++. F. F.Fundamentos da Linguagem Membros de Classe: Um Exemplo Podemos criar uma classe que modele produtos que são produzidos em uma fábrica. class Produto { static int próximo_id = 0. Ismael H.puc-rio. // Produto.próximo_id = 0 Produto lápis = new Produto(). Santos .puc-rio.ismael@tecgraf.ismael@tecgraf.id = 0 // lápis. int id.

Santos . sendo uma linguagem puramente orientada por objetos.puc-rio. Produto. F. float dx = p1.Fundamentos da Linguagem Membros de Classe: Acesso Direto Como os membros estáticos são da classe. não precisamos de um objeto para acessá-los: podemos fazê-lo diretamente sobre a classe. float dy = p1.p2.x.x . // O próximo produto criado terá // id = 200. float d = Math. April 05 Prof. Santos . Exemplo1: calcular a distância entre dois pontos. Math.br 103 Fundamentos da Linguagem Membros de Classe Para prover uma biblioteca matemática.p2. possui apenas declarações de classes: não é possível escrever código fora de uma classe. Java declara uma classe. que contém apenas métodos estáticos.ismael@tecgraf.y .y. Ismael H. Java.sqrt(dx*dx+dy*dy).próximo_id = 200. Exemplo2: observe na figura ao lado que a a variavel de classe y não esta presente em nenhum objeto ! April 05 Prof.puc-rio.ismael@tecgraf.br 104 52 . F. Ismael H.

Santos . Ismael H. Ismael H. não é necessário que haja uma instância para chamarmos um método estático. Para ser executado.puc-rio. April 05 Prof. Dessa forma.Fundamentos da Linguagem this revisitado Vimos que um método estático pode ser chamado diretamente sobre a classe. April 05 Prof. não faz sentido que o this exista dentro de um método estático.br 105 Fundamentos da Linguagem Noção de Programa Uma vez que tudo o que se escreve em Java são declarações de classes. Santos .puc-rio. o método main deve possuir uma assinatura bem determinada.br 106 53 . na verdade.ismael@tecgraf. a execução de uma classe. F.ismael@tecgraf. Ou seja. F. o conceito de programa também está relacionado a classes: a execução de um programa é. Executar uma classe significa executar seu método estático main.

puc-rio. seu método main deve possuir a seguinte assinatura: public static void main(String[] args) Estrutura de um Programa Java April 05 Prof. F. Exercício . podemos escrever nosso primeiro programa: public class AloMundo { public static void main(String[] args){ System.br 108 54 . Ismael H.println(“Alô Mundo!”). Ismael H. F.ismael@tecgraf.java Usando o método main e um atributo estático da classe que modela o sistema.java.ismael@tecgraf.out. Santos . } } Uma classe deve ser declarada em um arquivo homônimo (case-sensitive) com extensão . Santos .br 107 Fundamentos da Linguagem Programa Exemplo – AloMundo.puc-rio.Questão 1 April 05 Prof.Fundamentos da Linguagem Executando uma Classe Para que a classe possa ser executada.

. F.ismael@tecgraf.ismael@tecgraf. */ April 05 Prof. Santos .79 X 10308 Maior Valor \uFFFF 127 32767 2147483647 263 .. Ismael H.0 0.40 X 1038 1.0 Tamanho 1 bit 16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits Menor Valor \u0000 -128 -32768 -2147483648 -263 3..94 X 10-324 April 05 Prof.Fundamentos da Linguagem Léxico Suporte a Unicode Comentários em uma linha // . */ Comentários de documentação (javadoc) /** .puc-rio. Ismael H.puc-rio..br 109 Fundamentos da Linguagem Tipos Básicos ou Primitivos de Java Type boolean char byte short int long float double Conteúdo True ou False Unicode caracter Signed integer Signed integer Signed integer Signed integer IEEE75A floating point IEEE75A point floating Valor Default False \u0000 0 0 0 0 0..40 X 10-45 4. Santos .br 110 55 . Comentários em múltiplas linhas /* . F.1 1..

br 112 56 .puc-rio. April 05 Prof.Fundamentos da Linguagem Formato dos Tipos de Dados April 05 Prof.puc-rio. são acessados pelo Java por “referência”.ismael@tecgraf. Santos . F. por isso.ismael@tecgraf. Ismael H. Ismael H. Santos . Por isso chamamos os tipos de dados de Java não primitivos de “Reference Data Types”. e.br 111 Fundamentos da Linguagem Tipos de Dados de Referência – Reference Data Types Todos os tipos não primitivos são tratados como objetos ou arrays. F.

pois pode ser construído diretamente.puc-rio. April 05 Prof. //Exibe: i=3-j=2 April 05 Prof.out. Ismael H.lang.ismael@tecgraf. int j = i. A forma normal de criação de objetos também é permitida para strings (embora raramente usada): String s2 = new String(“Também sou uma string").br 113 Fundamentos da Linguagem A classe String Strings são objetos da classe java. Ismael H.getLabel().puc-rio. String s = b. // s será igual a “Ok” Observe que isso não acontece quando utilizamos os tipos primitivos: int i = 3.b.println(“i=“+i+“-“+“j=“+j). // b refere-se ao mesmo objeto que a b.String Apesar de String não ser um tipo primitivo.setLabel(“Ok”). F. F. Santos . a=new Button(). sem o uso de new.br 114 57 . Santos .Fundamentos da Linguagem Exemplo Button a. ele pode ser visto como um. System. //a refere-se a um objeto Button b=a.ismael@tecgraf. i = 2. Strings são imutáveis ! String s1 = “Sou uma string".

a expressão s1 == s2 testa se s1 e s2 são o mesmo objeto e não se eles contem os mesmos strings ! String principais métodos: public public public public char charAt(int index) int compareTo(String comparison) int compareTo(Object object) boolean endsWith(String suffix) April 05 Prof.) public String concat(String suffix) String result = someString.concat(otherString). int startIndex) int indexOf(String subString) int indexOf(String subString.br 116 58 . char newChar) April 05 Prof. public public public public public public public boolean equalsIgnoreCase(String comparison) int indexOf(int character) int indexOf(int character. F.puc-rio.ismael@tecgraf. Santos .puc-rio. String result = s1 + s2.br 115 Fundamentos da Linguagem String principais métodos (cont. F. Ismael H.ismael@tecgraf. Em Java. Ismael H.Fundamentos da Linguagem A classe String (cont. int startIndex) int length() String replace(char oldChar.) O operador + pode ser utilizado para concatenar strings. Santos .

É necessária também a indicação do tamanho do array para a sua utilização. O roar again". assim como a variáveis de seu tipo específico. Ismael H.ismael@tecgraf. F. April 05 Prof. for (int i=len-1.length(). System. Indexação de seus elementos começa por zero.Fundamentos da Linguagem Exemplo public class StringsDemo { public static void main(String[] args) { String palindrome = “Niagara. Santos .br 117 Fundamentos da Linguagem Arrays Seu comprimento pode ser determinado pelo método length Pode ser associados a variáveis do tipo Object.toString()). A declaração de um array de um determinado tipo é indicada pelo uso de [ ] para cada dimensão do array. F.charAt(i)). i--) dest.ismael@tecgraf. int len = palindrome. Arrays podem ser passados para métodos. Santos .puc-rio.br 118 59 . i >= 0.println(dest. Ismael H.puc-rio. } } April 05 Prof.out. StringBuffer dest = new StringBuffer(len).append(palindrome.

for (int i = 0. // copia os precos System. i<list.“Arthur”. Ismael H. for( int i=0. matrixDeChars = new char[3][4]. April 05 Prof. Santos .println(“Preço: ” + precos[i]).ismael@tecgraf. 20000). // 1-dim char[ ][ ] matrixDeChars. { “Lucia”. Declaração e Alocação boolean[] answers = { true. } Outro exemplo: int[] list = {1.ismael@tecgraf. // array de 3 carros carros[0] = new Carro(“BMW”. carros[1] = new Carro(“Vectra”.puc-rio. 40000). carros[2] = new Carro(“Gol”.out.br 119 Fundamentos da Linguagem O atributo length Carro[] carros = new Carro[3]. int[] precos = new int[3]. Alocação de memória arrayDeInts = new int [7].Fundamentos da Linguagem Exemplos: Declaração de Arrays int[ ] arrayDeInts. “Jose”. Ismael H. true }.out. // 2-dim UmaClasseX[ ] arrayDeUmaClasseX. Santos .println(“list[“+i+”]=“+list[i]). F. “Carol”} }.length.length. ++i ) System.getPreco().br 120 60 . April 05 Prof. “Joao”}. String[][] nomes = { {“Maria”. true. // 2-dim Object[ ] matrixDeObjetos[ ]. F.puc-rio. i < carros. i ++) { precos[i] = carros[i]. 4. 5}. 3. 60000). false. 2.

{ “background”.br 122 61 . } April 05 Prof. i < triangular. F. 15 "elemento do tipo byte [ ]" April 05 "elemento do tipo byte inicializados com 0" 121 Prof. j < i + 1. Santos . // é válida double temperatura[][][] = new double [100][][10] // não ! String parametros[ ][ ] = { { “foreground”.puc-rio. matrix "referência " 0 15 0 "elemento do tipo byte [ ] [ ] " 255 . “color”. “String”. Outro exemplo: short triangular[][] = new short [10][].length.ismael@tecgraf. for ( int j = 0.br Fundamentos da Linguagem Arrays Multidimensionais – Exemplos String texto[][][][] = new String [5][3][][].ismael@tecgraf. . F. . “color”. ++j ) triangular[i][j] = i + j. ++i ) { triangular[i] = new short [i + 1]. Ismael H.puc-rio. . “Alô mamãe” } }. “block” }. Ismael H.Fundamentos da Linguagem Arrays Multidimensionais Array multidimensionais em Java são tratados como arrays de arrays exatamente como em C/C++ byte matrix[ ][ ] = new byte [256][16]. 0 . . Santos . { “Mensagem”. “gray” }. for ( int i = 0.

puc-rio. Santos . Santos .br 123 Arrays April 05 Prof.br 124 62 .puc-rio. F. public Vector() // Construtores public Vector(int initialCapacity) public Vector(int initialCapacity. F. Ismael H.Fundamentos da Linguagem Arrays são limitados pelo fato de não poderem variar de tamanho com o tempo => Vector array de tamanho variável. Ismael H.ismael@tecgraf.ismael@tecgraf. int capacityIncrement) Outros métodos: public public public public public public public public April 05 void setSize(int newSize) boolean removeElement(Object object) void removeElementAt(int index) void removeAllElements() boolean isEmpty() boolean contains(Object object) int capacity() int size() Prof.

ismael@tecgraf. F. F. (params) exp++ exp-++exp --exp +exp -exp ~exp !exp new (tipo)exp * / % + << >> >>> < > <= >= instanceof == != & ^ | && || ?: = += -= *= /= %= <<= >>= >>>= &= ^= |= April 05 Prof.ismael@tecgraf.br 126 63 . Ismael H. Santos . Santos .br 125 Fundamentos da Linguagem Lista de Operadores April 05 Prof. Ismael H.puc-rio.puc-rio.Fundamentos da Linguagem Operadores [] .

Santos .puc-rio. Santos . Ismael H.ismael@tecgraf.Fundamentos da Linguagem Tabela de Precedência April 05 Prof. Ismael H.br 128 64 .puc-rio.br 127 Fundamentos da Linguagem Lista de Caracteres April 05 Prof.ismael@tecgraf. F. F.

Ismael H. Santos . operadores e parentesis x * ( y .ismael@tecgraf.0F. April 05 Prof. pois não existem ponteiros como em C/C++ *(mat + lin*tam_linha+col)=0 // Não em Java mat[lin][col]=0 // Ok April 05 Prof.br 130 65 . int i.ismael@tecgraf. F. // Conversão automática (implícita) float f = 0.(a + b) >> 5 ) & m[i].k * f(4) Não existe aritmética de ponteiros. Ismael H.puc-rio. Santos . assim conversões em expressões podem ser: automáticas: implícita ou por promoção (conversão p/ tipo mais geral) explícitas (coerção ou type-cast) Exemplos: byte b = 10.puc-rio.Fundamentos da Linguagem Expressões Formadas por dados. F.br 129 Fundamentos da Linguagem Conversões em expressões Java utiliza tipagem forte.

3. // promoção para double dos numeros b = (byte)i. F.ismael@tecgraf. // Estas instruções apresentam problema ? April 05 Prof. F. f = b. // explícita (coerção) ou “type cast” s = i.puc-rio.br 132 66 .ismael@tecgraf. Explicit cast needed to convert int” double d = 12 + 9L + 12.Fundamentos da Linguagem Exemplos (cont. // O Compilador vai indicar o erro: “Imcompatible // type for=. // explícita (coerção) por métodos f = i. Ismael H.br 131 Conversão de Tipos Primitivos April 05 Prof. Santos . Ismael H.) b = i.puc-rio.toString(). Santos .

ismael@tecgraf. Santos .br 134 67 .puc-rio.ismael@tecgraf. Santos . Ismael H. F.br 133 Operadores de Coerção April 05 Prof.Conversão de Tipos Referência April 05 Prof. F.puc-rio. Ismael H.

Santos . return e rótulos Não existe comando goto goto. do-while Seleção: if-else. F. break. Santos . April 05 Prof.br 136 68 . Ismael H.puc-rio.ismael@tecgraf.br 135 Fundamentos da Linguagem Controle de Fluxo de execução O controle do fluxo da execução em Java utiliza os mesmos comandos existentes em outras linguagens Repetição: for.puc-rio. F.ismael@tecgraf. porém. é palavra-reservada. Ismael H.Promoção April 05 Prof. while. switch-case Desvios (somente em estruturas de repetição): continue.

Ismael H.br 138 69 .ismael@tecgraf. } April 05 Prof. F. Santos . b).ismael@tecgraf. else { errno = -1. Santos .br 137 Fundamentos da Linguagem if-else if( a>0 && b>0 ) m = média(a.Fundamentos da Linguagem Comandos Comando expressão de atribuição formas pré-fixadas ou pós-fixadas de ++ e -chamada de métodos criação de objetos comandos de controle de fluxo bloco Bloco = { <lista de comandos> } April 05 Prof. Ismael H.puc-rio. m = 0. F.puc-rio.

. break.ismael@tecgraf..puc-rio. Ismael H. F.println(i).br 140 70 . break. default: . do { System.. Santos .. } //Que números serão impressos? //E se trocarmos por i++<10 do while int i = 0. //Que números serão impressos? //E se trocarmos por i++<10 April 05 Prof..println(i).ismael@tecgraf. case 0: . } April 05 Prof. while( ++i<10 ) { System. Santos .out. } while( ++i<10).. Ismael H.out.br 139 Fundamentos da Linguagem while int i = 0.puc-rio.Fundamentos da Linguagem switch-case-default switch( i=f() ) { case -1: . F.

out. } //Que números serão impressos? //E se trocarmos por i++ April 05 Prof.println(i).out. } April 05 Prof.br 142 71 . F.br 141 Fundamentos da Linguagem break int i = 0. Santos .println(i).Fundamentos da Linguagem for for(int i=0. i<10.println(i). } //Que números serão impressos? //E se trocarmos por i++ continue int i = 0. int b) { return (a+b)/2. F.ismael@tecgraf. Ismael H. //Que números serão impressos? //E se trocarmos por i++ return int média(int a. Ismael H.ismael@tecgraf. Santos . System.out.puc-rio. ++i) System.puc-rio. while( true ) { if (++i==10) break. System. while ( true ) { if (++i%2 == 1) continue.

j++) { if (v[i][j] < 0) break início. Ismael H. i<10.br 144 // Define Classe // Atributo // Atributo // Método 72 . } . .puc-rio.Questão 3 April 05 Prof. j<10.. } } April 05 Prof. F.. F.puc-rio. int h_total.br 143 Fundamentos da Linguagem Classes Classes definem modelos de objetos Objetos = Dados + Código class Empregado { String nome.Fundamentos da Linguagem break para Label início: for (int i=0. Exercícios .ismael@tecgraf.ismael@tecgraf.. Santos . void Trabalha (int h) { h_total += h. Ismael H. i++) for (int j=0.. Santos .

br 146 73 .puc-rio.ismael@tecgraf. } } April 05 Prof.Fundamentos da Linguagem Escopo de definições April 05 Prof. Santos . Ismael H. // Inicialização de atributo static int data[1000].ismael@tecgraf. F. F. ++i) data[i] = i. Santos .puc-rio.br 145 Fundamentos da Linguagem Inicialização de Classes Bloco de inicialização de classe identificado pela palavra reservada static Atributos podem ter atribuição default class Nome { String Nome = "". Ismael H. static { // Bloco inicialização de classe for (int i=0. i<1000.

h_total = 0. F. F.Trabalha(8). // Declara objeto Roberto = new Empregado.br 148 74 . ) Roberto. Roberto. // Instancia objeto Quando o objeto é declarado este recebe o valor nulo (null) Após new o objeto é efetivamente criado em memória (heap) usando o construtor da classe April 05 Prof. Ismael H. } // Define classe Empregado Roberto.ismael@tecgraf.puc-rio..br 147 Fundamentos da Linguagem Acessando Atributos e Métodos Operador de acesso aos membros de um objeto ( . // Atributo // Método Inicialização de Objetos Inicialização de objeto é realizada pelo método construtor da classe O construtor é invocado automaticamente quando o comando new é executado O construtor é um método que não possui identificação de valor de retorno e possui o mesmo nome que a classe April 05 Prof.. Santos .Fundamentos da Linguagem Objetos Instâncias de classes class Empregado { .puc-rio. Ismael H. Santos .ismael@tecgraf.

Santos . F. Ismael H.puc-rio.br 150 75 . Ônibus(int LotaçãoMáxima) { lotação = LotaçãoMáxima. // Instancia objeto ou Ônibus o2 = new Ônibus(40).puc-rio. Santos .. F. Ônibus o. Ismael H..ismael@tecgraf.ismael@tecgraf. April 05 Prof.br 149 Fundamentos da Linguagem Inicialização de Objetos class Ônibus { int lotação. // Declara objeto o = new Ônibus(32).Construtores April 05 Prof. } } .

Santos .br 151 Fundamentos da Linguagem Exemplo Classe Pilha Classe pilha de números inteiros. top_index = -1. class Stack { int top_index.Variáveis Stack(int size) { // <.Métodos int top() { return data[top_index]. Não se pode dizer quando o destrutor será invocado O destrutor é um método especial da classe que não retorna valor (void). F. } boolean isEmpty() { return (top_index < 0). por isso é melhor usar o código dentro de um bloco try { … } catch( … ) { ….ismael@tecgraf. } April 05 Prof.. } int pop() { return data[top_index--].br 152 76 . // <. Santos . } } April 05 Prof. Obs: finalize() não tem garantia de funcionar quando desejado. Ismael H. int[] data.Fundamentos da Linguagem Destruição de Objetos O destrutor de um objeto é invocado pelo coletor de lixo quando este precisa desfazer-se do objeto para liberar memória.puc-rio.puc-rio.finalize(). F. } } O método finalize() também pode ser executado explicitamente se desejado: meuÔnibus.ismael@tecgraf. } void push(int n) { data[++top_index] = n. Ismael H. possui o nome de finalize e não possui parâmetros class Ônibus { void finalize() { ProFerroVelho().Construtor data = new int[size]. } // <. armazenados internamente em um array cujo tamanho máximo é dado no momento de sua criação. } finally { ….

out. Ismael H.println(s. s. // 30 // false // true April 05 Prof.out.push(10). System.isEmpty()).pop().Fundamentos da Linguagem Uso da classe Pilha declarada Stack s = new Stack(2).isEmpty() ). para 2 números. System.ismael@tecgraf. // true! April 05 Prof. Santos . nós encapsulamos a definição de pilha que desejávamos. é possível forçar situações nas quais a pilha não se comporta como desejado. Santos . System.top_index = -1.top()). F.println(s. s. s. por falta de controle de acesso.out.br 153 Fundamentos da Linguagem Encapsulamento Na classe Stack implementada.isEmpty()).println( s.push(6).ismael@tecgraf.push(s. F.out. s. porém. s. System. Ismael H.pop()+s.println(s. Stack s = new Stack(10). // Pilha s.puc-rio.push(20).br 154 77 .puc-rio.pop()).

Membros públicos podem ser acessados indiscriminadamente.puc-rio.puc-rio. } } April 05 Prof.Controle de Acesso As linguagens OO disponibilizam formas de controlar o acesso aos membros de uma classe.Fundamentos da Linguagem Encapsulamento .br 156 78 . devemos poder fazer diferença entre o que é público e o que é privado. Ismael H. } void push(int n) { data[++top_index] = n. private int top_index. enquanto os privados só podem ser acessados pela própria classe. } boolean isEmpty() { return (top_index < 0). } int pop() { return data[top_index--]. F. Ismael H. Exemplo . top_index = -1.br 155 Fundamentos da Linguagem Redefinindo a Classe Stack class Stack { private int[] data. Santos .Calculadora Polonesa Stack(int size) { data = new int[size].ismael@tecgraf. No mínimo. } int top() { return data[top_index].ismael@tecgraf. Santos . F. April 05 Prof.

println(s.Fundamentos da Linguagem Exemplo de Controle de Acesso Com a nova implementação da pilha. April 05 Prof.isEmpty()). Sobrecarregar um método significa prover mais de uma versão de um mesmo método. Santos . Stack s = new Stack(10).out. o exemplo anterior não pode mais ser feito pois teremos um erro de compilação. Ismael H.puc-rio.puc-rio. s. As versões devem. F. Ismael H. // ERRO! na compilação System.push(6). necessariamente.br 158 79 .top_index = -1.ismael@tecgraf.ismael@tecgraf. possuir algo que as diferencie: tipo e/ou número de parâmetros ou tipo do valor de retorno. F. s.br 157 Fundamentos da Linguagem Sobrecarga (Overload) Um recurso usual em programação OO é o uso de sobrecarga de métodos. Santos . April 05 Prof.

//p2 está em (1. é preciso usar operadores de coerção (cast) April 05 Prof. F.2) April 05 Prof. deixava o ponto na posição (0. Ismael H. Ismael H.0). perdemos o construtor padrão que.2).Fundamentos da Linguagem Sobrecarga (Overload) Na chamada de um método.puc-rio. seus parâmetros são passados da mesma forma que em uma atribuição. ao criarmos o construtor da classe Point para inicializar o ponto em uma dada posição. int y) { this. Point() {} Point(int x.y = y.br 160 80 . F.ismael@tecgraf. this. //p1 está em (0.0) Point p2 = new Point(1.x = x.br 159 Fundamentos da Linguagem Sobrecarga de Construtores Como dito anteriormente. Nós podemos voltar a ter esse construtor usando sobrecarga.ismael@tecgraf.puc-rio. Santos . não fazendo nada. int y = 0. Valores são passados em tipos primitivos Referências são passadas em objetos Há promoção de tipos de acordo com as regras de conversão de primitivos e objetos Em casos onde a conversão direta não é permitida. Santos . } } Agora no momento da criação do objeto podemos escolher qual construtor usar Point p1 = new Point(). class Point { int x = 0.

ismael@tecgraf. int y) { this.ismael@tecgraf.puc-rio.br 162 81 . this. April 05 Prof.br 161 Fundamentos da Linguagem Encadeamento de Construtores class Point { int x. A única limitação é que essa chamada seja a primeira linha do construtor. // <. Isso é um encadeamento de construtores.Chama construtor com parametros } Point(int x..Encadeamento de Construtores Uma solução melhor para o exemplo dos dois construtores seria o construtor vazio chamar o construtor que espera suas coordenadas. Ismael H.. Ismael H.). Santos ..y = y. F. Point() { this(0. F. } . y. Java suporta isso através da construção this(. passando zero para ambas. Santos . } April 05 Prof.0)..x = x.puc-rio.

ismael@tecgraf. Ismael H. F.Exemplo April 05 Prof.puc-rio. Santos .3). Ismael H. devemos manter a semântica: não é um bom projeto termos um método sobrecarregado cujas versões fazem coisas completamente diferentes.br 164 82 .abs(-2. double b = Math. int a = Math. // a = 10.br 163 Sobrecarga de Métodos Pode ser feita da mesma maneira que fizemos com os construtores.3. April 05 Prof. Santos . // b = 2.ismael@tecgraf. Note que a semântica das várias versões são compatíveis. Quando sobrecarregamos um método.abs(-10). A classe Math possui vários métodos sobrecarregados. F.puc-rio.

Santos . classes podem ser compostas em hierarquias. ou os dois. F.puc-rio. Quando uma classe herda de outra.br 166 83 . diz-se que ela a estende ou a especializa.ismael@tecgraf.ismael@tecgraf.br 165 Fundamentos da Linguagem Herança Como vimos anteriormente. Ismael H. F. Herança implica tanto herança de interface quanto herança de código. Ismael H.puc-rio. Santos . através do uso de herança. April 05 Prof.) April 05 Prof.Sobrecarga de Métodos (cont.

F.ismael@tecgraf. Uma classe Java estende apenas uma outra classe a essa restrição damos o nome de herança simples. Além disso.puc-rio.br 167 Fundamentos da Linguagem Herança em Java Quando uma classe A herda de B. Ismael H. a superclasse. Santos . Herança de código significa que as implementações desses métodos também são herdadas. F. os campos que não sejam privados também são herdados. April 05 Prof.br 168 84 . Para criar uma sub-classe.puc-rio. Santos . April 05 Prof.ismael@tecgraf. Ismael H. usamos a palavra reservada extends. diz-se que A é a subclasse e estende B.Fundamentos da Linguagem Herança de Interface x Herança de Código Herança de interface significa que a classe que herda recebe todos os métodos declarados pela superclasse que não sejam privados.

. Afinal.puc-rio. Ismael H. int c) { super(x.Fundamentos da Linguagem Herança Java somente suporta herança simples para a especialização de classes class Ônibus extends Veículo { . v[16] = new Bicicleta..Abastece(). y)..br 170 85 . } } April 05 Prof. F. public Pixel(int x.Abastece-Polimorfismo April 05 Prof.br 169 Fundamentos da Linguagem Exemplo de Herança Podemos criar uma classe que represente um pixel a partir da classe Point. F. Santos . } .. // Ônibus.ismael@tecgraf. // array heterogêneo . Ismael H.ismael@tecgraf. Veículo v[100].puc-rio. um Pixel é um ponto colorido.. public class Pixel extends Point { int color.. int y. v[15]. color = c. Santos . v[15] = new Ônibus(100).

br 171 Fundamentos da Linguagem super Note que a primeira coisa que o construtor de Pixel faz é chamar o construtor de Point. Pixel px = new Pixel(1. Isso é necessário pois Pixel é uma extensão de Point. Se nós não chamássemos o construtor da superclasse explicitamente. F. para isso.br 172 86 . Ismael H.move(1. Ismael H.0).puc-rio. //Pixel de cor 0 px.Fundamentos da Linguagem Herança de Código A classe Pixel herda a interface e o código da classe Point. ou seja.puc-rio.0). Santos . F. a palavra reservada super. April 05 Prof.2) April 05 Prof. Ou seja. ela deve inicializar sua parte Point antes de inicializar sua parte estendida. Pixel passa a ter tanto os campos quanto os métodos (com suas implementações) de Point. Santos .ismael@tecgraf. a linguagem Java faria uma chamada ao construtor padrão da superclasse automaticamente. usando. // Agora px está em (2.ismael@tecgraf.2.

.Fundamentos da Linguagem super Usa-se a palavra reservada super para referenciar a classe-pai em uma hierarquia de classes Java class CaminhãoTanque extends Veículo { void Bate() { super.Bate().f(). . Santos .. } } class B extends A { void f() { .ismael@tecgraf. } } class A { void f() { . F.super.f(). } } class C extends B { void f() { super. ou B. } } April 05 Prof. super.. if (CargaInflamável()) Explode().br 174 87 ... ou A. Ismael H.. é possível chamar construtor da classe-base usando também a palavra reservada super class Ônibus extends Veículo { Ônibus(int LotaçãoMáxima) { super(LotaçãoMáxima). } } April 05 Prof.f().puc-rio.br // Acessando B // Acessando A 173 Fundamentos da Linguagem super Na implementação de um construtor. Santos . F.f(). Ismael H.puc-rio.ismael@tecgraf.

Ismael H. Ismael H. F. F.super() April 05 Prof.puc-rio. Santos .ismael@tecgraf.ismael@tecgraf.br 175 super() e this() April 05 Prof.br 176 88 . Santos .puc-rio.

Santos . Um outro exemplo é o método finalize usado na destruição de um objeto. April 05 Prof. isto é. existe uma superclasse comum a todas as classes. Uma das vantagens de termos uma superclasse comum.ismael@tecgraf. a classe Object define um método chamado toString que retorna um texto descritivo do objeto. ela implicitamente estende Object.puc-rio. Árvore significa que uma única hierarquia compreende todas as classes existentes. como já dito. Ismael H. Quando não declaramos que uma classe estende outra.puc-rio. Floresta significa que pode haver diversas árvores de hierarquia que não se relacionam.ismael@tecgraf. Ismael H. F.Árvore × Floresta As linguagens OO podem adotar um modelo de hierarquia em árvore ou em floresta.br 178 89 . April 05 Prof. Santos . isto é. é termos uma funcionalidade comum a todos os objetos: Por exemplo. F. não existe uma superclasse comum a todas as classes.br 177 Fundamentos da Linguagem Modelo de Classes de Java Em Java a classe Object é a raiz da hierarquia de classes à qual todas as classes existentes pertencem.

ismael@tecgraf.ismael@tecgraf.puc-rio.Fundamentos da Linguagem Especialização × Extensão Uma classe pode herdar de outra para especializá-la redefinindo métodos.Questão 4 April 05 Prof. Santos .br 180 90 .br 179 Polimorfismo April 05 Prof. Exercícios . ampliando sua interface. Santos . sem ampliar sua interface. F. Ismael H. Ismael H.puc-rio. dessa forma. Uma classe pode herdar de outra para estendê-la declarando novos métodos e. Ou as duas coisas podem acontecer simultaneamente. F.

0). Ismael H. ou seja.br Fundamentos da Linguagem Note que um Pixel pode ser usado sempre que se necessita um ponto. um Pixel. Ao estendermos ou especializarmos uma classe. é compatível com ela. Conclusão: Polimorfismo é o nome formal para o fato de que quando precisamos de um objeto de determinado tipo.2. F. Santos .br 182 91 . Pixel px = new Point(0. Esse fato pode ser bem entendido analisando-se a árvore de hierarquia de classes. podemos usar um Pixel em seu lugar. Pixel(1. o contrário não é verdade: não podemos usar um ponto quando precisamos de um pixel. Ismael H. // OK! um pixel é um ponto String(“Alo”).0). Isso implica que.ismael@tecgraf.ismael@tecgraf. April 05 Prof. Santos .puc-rio. A sub-classe de Point.// ERRO!. // um array de pontos Point().0. podemos usar uma versão mais especializada dele. é um ponto. não é um ponto 181 Prof.puc-rio. além de outras coisas. Point[] pontos = pontos[0] = new pontos[1] = new pontos[2] = new April 05 new Point[5]. Point pt = new Pixel(0. Pixel. não perdemos compatibilidade com a superclasse.1). //OK! pixel é ponto. sempre que precisarmos de um ponto. //ERRO! ponto não é pixel. Porém. F. A capacidade polimórfica decorre diretamente do mecanismo de herança.Fundamentos da Linguagem Polimorfismo Polimorfismo é a capacidade de um objeto tomar diversas formas.

} } Com essa modificação.puc-rio.0.br Fundamentos da Linguagem Exemplo public class Point { .”+y+“)”). Ismael H. Animais. Podemos voltar ao exemplo do array de pontos e imprimir as posições preenchidas.0).out...br 184 92 .0) Pixel px = new Pixel(0..ismael@tecgraf.Uso do Polimorfismo Objetos Materiais Animais Mamíferos Humanos Dentistas João April 05 Vegetais Rosas Rosas da Maria Jose e Joao são ambos objetos das classes Humanos. 183 Floricultores José Prof..println(“Point (”+x+“.ismael@tecgraf. // pixel em (0. Santos . Santos .puc-rio. F. public void print() { System.. tanto a classe Point quanto a classe Pixel agora possuem um método que imprime o ponto representado. Point pt = new Point().0) April 05 Prof. Mamiferos. Ismael H. // ponto em (0. F.

br 185 Fundamentos da Linguagem Point pt = new Point().0) pixel em (0.0)” (0. Santos .” +y+ “. // Imprime: “Pixel (1. Santos .” + color+“)”). pontos[0]. } } Com essa nova modificação.0) (0. // Imprime: “Ponto (0. public class Pixel extends Point { .. // Imprime: “Ponto px.0)..ismael@tecgraf. Ismael H.print().puc-rio.0)” April 05 Prof. // Pixel px = new Pixel(0. // pt. a classe Pixel agora possui um método que imprime o pixel de forma correta. Point[] pontos = new Point[5].0)” Porém.0). F.0)” pontos[1].2. a implementação desse método não é boa para um Pixel pois a cor não é impressa.0.print().print() .0)” px.println(“Pixel(”+x+ “. F.2.Fundamentos da Linguagem pt. Para resolver o problema fazemos a classe Pixel redefinir o método print de forma adequada. // Imprime: “Pixel ponto em (0. Ismael H. April 05 Prof.ismael@tecgraf.out.print(). // Imprime: “Ponto (0.br 186 93 . pontos[1] = new Pixel(1.puc-rio.print(). public void print() { System.0. // Imprime: “Ponto (0.print(). pontos[0] = new Point().0)” Voltemos ao exemplo do Array de pontos.

Fundamentos da Linguagem Polimorfismo – outro exemplo class Veiculo { public Veiculo() { System.println("Bicicleta"). else v = new Bicicleta().checkList().puc-rio.out. } } class Automovel extends Veiculo { public Automovel() { System.out.println("Bicicleta.println("Veiculo.out.println("Automovel. F.br 187 Fundamentos da Linguagem public class Oficina { Random r = new Random().cleanup().println("Automovel.manter(v).checkList").checkList"). v.out. ++i) { v = o. } public void adjust() { System.out.cleanup"). } public void cleanup() { System.out. public Veiculo proximo() { Veiculo v.adjust"). v.println("Bicicleta.adjust().out.puc-rio. Ismael H. return v. } public void adjust() { System.out.println("Automovel. } } April 05 Prof.adjust"). int code = r. i<4. // polimorfismo ! } } Diga o que será impresso ! } April 05 Prof. } public static void main(String[] args) { Oficina o = new Oficina(). Santos .out. } public void manter(Veiculo v) { v.print("Veiculo ").proximo(). } public void checkList() { System.out.println("Bicicleta.out.cleanup"). } public void adjust() { System.br 188 94 . for (int i=0. Santos .checkList"). Ismael H.out. } public void checkList(){ System.println("Veiculo.nextInt().adjust").cleanup"). } } class Bicicleta extends Veiculo { public Bicicleta() { System. } public void checkList(){System.println("Automovel"). Veiculo v. F. } public void cleanup() { System. if (code%2 == 0) v = new Automovel(). } public void cleanup() { System.println("Veiculo.ismael@tecgraf. o.ismael@tecgraf.

puc-rio.Polimorfismo April 05 Prof. Santos .ismael@tecgraf.br 189 Polimorfismo => Código extensível April 05 Prof. F. F.Outro exemplo . Santos . Ismael H. Ismael H.puc-rio.ismael@tecgraf.br 190 95 .

F. No momento da chamada.br 192 96 . a resolução do método acontecerá em tempo de execução. o método utilizado será o definido pela classe real do objeto. Santos . ao corrermos o array imprimindo os pontos. Ou seja.puc-rio.br 191 Fundamentos da Linguagem Late Binding ( Ligação tardia ) As linguagens OO possuem um recurso chamado late binding. Voltando ao exemplo do array de pontos. o ideal é que. agora que cada classe possui sua própria codificação para o método print. April 05 Prof. que permite o adiamento da resolução de um método até o momento no qual ele deve ser efetivamente chamado. Santos . Ismael H.puc-rio.ismael@tecgraf. ao invés de em tempo de compilação.ismael@tecgraf. Ismael H. as versões corretas dos métodos fossem usadas. Isso realmente acontece. F. pois as linguagens OO usam um recurso chamado late binding.Interface x Implementação April 05 Prof.

puc-rio. pontos[1] = new Pixel(1.puc-rio. Uma única referência. durante a execução.ismael@tecgraf.ismael@tecgraf. F.) O objeto chamado pode ser da mesma classe ou de uma subclasse da referência (TODA a interface está implementada no objeto !). a vários objetos diferentes (a referência é dita polimórfica ) April 05 Prof.br 193 Late Binding na prática Late Binding (cont. Santos . Ismael H.br 194 97 .Late Binding na prática Graças a esse recurso. F. pontos[0] = new Point().0)” Suporte ao polimorfismo depende do suporte à ligação tardia (late binding) de chamadas de função A referência (interface) é conhecida em tempo de compilação mas o objeto a que ela aponta (implementação) não é. // Imprime: “Pixel (1.2. Santos .0). pontos[0]. // Imprime: “Point (0.print().print(). agora temos: Point[] pontos = new Point[5]. Ismael H.0)” pontos[1].2. April 05 Prof. pode ser ligada.

devido ao uso da indereção causada pelo mecanismo de implementação do late-binding (tabelas virtuais). F. April 05 Prof.ismael@tecgraf.puc-rio. ou seja. Ismael H.ismael@tecgraf. Esse fato levou várias linguagens OO a permitir a construção de métodos constantes (chamados métodos finais em Java). F. Santos .br 195 Late Binding => suporte Polimorfismo April 05 Prof.Fundamentos da Linguagem Late Binding x Eficiência O uso de late binding implica em perda no desempenho dos programas visto que a cada chamada de método um processamento adicional deve ser feito. Ismael H.br 196 98 .puc-rio. métodos cujas implementações não podem ser redefinidas nas sub-classes. Santos .

Late x Early Binding

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

197

Outro exemplo - Polimorfismo

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

198

99

Outro exemplo - Polimorfismo

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

199

Outro exemplo - Polimorfismo

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

200

100

Outro exemplo - Polimorfismo

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

201

Alguns comentários

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

202

101

.ismael@tecgraf.. . enquanto tipos específicos (abaixo.. final int ERR_COD2 = -2. Tipos genéricos (acima.Fundamentos da Linguagem Atributos Constantes Java permite declarar um campo ou uma variável local que.. na hierarquia) não podem receber explícitamente seus objetos que foram declarados como referências de suas superclasses: downcasting. teremos que fazê-lo explicitamente. A conversão explícita de um objeto de um tipo para outro é chamada type casting. Ismael H. Para isso utilizamos o modificador final.. } // constantes ! Métodos e Classes Constantes em Java public class A { public final int f() { . April 05 Prof. F.puc-rio. class A { final int ERR_COD1 = -1. Ismael H. Santos . public final class B { April 05 . } 203 Prof. na hierarquia) sempre podem receber objetos de suas subclasses: upcasting. uma vez inicializada. Santos ..br Fundamentos da Linguagem Conversão de Tipo – Type Casting Podemos usar uma versão mais especializada quando precisamos de um objeto de certo tipo mas o contrário não é verdade.ismael@tecgraf. para fazer a conversão de volta ao tipo mais especializado.br 204 102 . }} Uma classe inteira pode ser definida final. F. tenha seu valor fixo. Isto serve para evitar que também a classe seja estendida. Por isso.puc-rio.

0. F. } Exercícios . // ERRO compilação: falta type-cast explicíto. Ismael H. Ismael H..ismael@tecgraf. assim. // ERRO não compila.1). // Erro execução: ClassCastException.. assim como o late binding.puc-rio.. 0). April 05 Prof.0. downcasting invalido! Pixel px =(Pixel)pt2. pq ? pt = new Pixel(0. pixel é ponto ! Pixel px = (Pixel)pt1.. decidir se a conversão é válida ou não.Fundamentos da Linguagem Conversão de Tipo – Type Casting (cont) Point pt1 = new Pixel(0.br 206 103 . // OK – upcasting. Pixel px= pt2. o type casting e instanceof só podem ser resolvidos em tempo de execução: só quando o programa estiver rodando é possível saber o valor que uma dada variável terá e. April 05 Prof. px = pt.puc-rio. Santos .Questão 5 Note que.ismael@tecgraf.// Compila. // OK – downcasting valido! Point pt2 = new Point(0. erro execução ClassCastExcetion! Point pt=new Point().0). Santos . Pixel px=(Pixel)pt. F. .br 205 Fundamentos da Linguagem Para evitar a exceção deveríamos fazer o seguinte: if (pt instanceof Pixel) { Pixel px = (Pixel)pt.

ismael@tecgraf. F.Herança April 05 Prof.br 207 Exemplo (1) .br 208 104 . F.ismael@tecgraf. Santos . Ismael H. Santos .puc-rio.Inicialização de instâncias April 05 Prof. Ismael H.puc-rio.

F.Herança April 05 Prof.ismael@tecgraf.Exemplo 2 .ismael@tecgraf. Santos .br 210 105 . Ismael H.br 209 Exemplo 3 . Santos . Ismael H.puc-rio.Herança April 05 Prof. F.puc-rio.

ismael@tecgraf.br 211 Analise da execução April 05 Prof.br 212 106 . Ismael H. F.Resultado de new Notebook() April 05 Prof. Santos . Ismael H. F.ismael@tecgraf. Santos .puc-rio.puc-rio.

Analise da execução

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

213

Como evitar o problema ?
Evite chamar métodos locais dentro de construtores Construtor (qq um da hierarquia) sempre usa a versão sobreposta do método (late-binding) Isto pode trazer resultados inesperados se alguém estender a sua classe com uma nova implementação do método que: Dependa de variáveis da classe estendida Chame métodos em objetos que ainda serão criados provocando NullPointerException Dependa de outros métodos sobrecarregados Use apenas métodos finais em construtores Estes métodos não podem ser sobrecarregados nas subclasses
April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br 214

107

Inicialização estática

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

215

Sumário - Objetos

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

216

108

Sumário - Objetos

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

217

Sumário - Objetos

April 05

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

218

109

F. Métodos também podem ser declarados abstratos para que suas implementações fiquem adiadas para as subclasses. Uma classe desse tipo não deve poder ser instanciada pois sua funcionalidade está incompleta.ismael@tecgraf.ismael@tecgraf. Ismael H. Ismael H. April 05 Prof.br 219 Interfaces e Classes Abstratas Classes Abstratas Ao criarmos uma classe para ser estendida.puc-rio. Java utiliza o modificador abstract para declarar uma classe abstrata. F. ou seja. às vezes codificamos vários métodos usando um método para o qual não sabemos dar uma implementação.POO-Java Interfaces e Classes Abstratas April 05 Prof. Santos . Tal classe é dita abstrata.puc-rio.br 220 110 . um método que só sub-classes saberão implementar. Santos .

public boolean contains(Point p) { BBox b = getBBox(). F. } .y<b.height)..x && p. } April 05 Prof.y>=b. // Erro // Ok April 05 Prof. Ismael H.y+b.x>=b.y && p. } class Ônibus extends Veículo { void Abastece() { EncheTanqueComDiesel(). Santos . return (p. } } . objAbstrato = new Veículo(). Santos . objConcreto = new Ônibus(). F.Interfaces e Classes Abstratas Classes Abstratas em Java abstract class Veículo { abstract void Abastece().puc-rio. public abstract BBox getBBox()..ismael@tecgraf.x<b.puc-rio. Ismael H.width && p.br 221 Interfaces e Classes Abstratas Classes Abstratas em Java public abstract class Drawing { public abstract void draw()..ismael@tecgraf..x+b.br 222 111 .

.. } } April 05 Prof. void desenhar() { . devem fornecer implementação para o método abstrato herdado de FiguraGeometrica. abstract void desenhar()..Interfaces e Classes Abstratas Seja uma classe abstrata.ismael@tecgraf.ismael@tecgraf.puc-rio. Santos . FiguraGeometrica.. Ismael H...br 223 Interfaces e Classes Abstratas public abstract class FiguraGeometrica { ... Santos .. Ismael H. F.br 224 112 .. } public class Circulo extends FiguraGeometrica { . Em FiguraGeometrica: abstract void desenhar(). April 05 Prof. F. void desenhar() { . As classes Círculo e Quadrado.puc-rio. } } public class Quadrado extends FiguraGeometrica { . para serem concretas.

Interfaces e Classes Abstratas Classes ContaCorrente e ContaPoupança herdam os métodos concretos creditar e debitar. Ismael H. Ismael H. F. April 05 Prof. Santos . F. Santos . e implementam o método abstrato aplicarJuros.ismael@tecgraf.br 225 Classes Abstratas April 05 Prof.puc-rio.br 226 113 .ismael@tecgraf.puc-rio.

br 227 Template Method .br 228 114 .implementação April 05 Prof. Santos . Ismael H.puc-rio.puc-rio.ismael@tecgraf. Ismael H.ismael@tecgraf. F.Template Method Design Pattern April 05 Prof. Santos . F.

ismael@tecgraf.ismael@tecgraf.br 229 Downcasting April 05 Prof. Ismael H. Santos .br 230 115 . F. F.puc-rio.puc-rio.Upcasting April 05 Prof. Santos . Ismael H.

puc-rio.ismael@tecgraf. Santos .br 232 116 . F. Santos .ismael@tecgraf.Upcasting e Downcasting April 05 Prof.br 231 ClassCastException April 05 Prof. Ismael H. Ismael H. F.puc-rio.

ismael@tecgraf.br 233 Ampliação da Referência April 05 Prof. Ismael H. F. Santos . Santos .puc-rio.br 234 117 .puc-rio.Herança Pura x Extensão April 05 Prof. F.ismael@tecgraf. Ismael H.

April 05 Prof. C D April 05 Prof. na verdade. na prática. querendo B declarar que a classe é compatível com as classes herdadas.br 236 118 .puc-rio.Herança Múltipla Herança: Simples × Múltipla O tipo de herança que usamos até agora é chamado de herança simples pois cada classe herda de apenas uma outra. Santos . Ismael H.ismael@tecgraf. O que. pois apresenta um problema quando construímos hierarquias de classes onde uma classe herda duas ou mais vezes de uma mesma superclasse. F. a herança de código não é utilizada. Herança múltipla não é suportada por todas as linguagens OO. Existe também a chamada herança múltipla onde uma classe pode herdar de várias classes. Em muitos casos. torna-se um caso comum. Ismael H.puc-rio. F. estamos. A Inúmeras vezes.br 235 Herança Múltipla (cont) Problemas de Herança Múltipla O problema de herdar duas vezes de uma mesma classe vem do fato de existir uma herança de código. quando projetamos uma hierarquia de classes usando herança múltipla. Santos .ismael@tecgraf.

Em Java.ismael@tecgraf.br 237 Interfaces em Java Interfaces Algumas linguagens OO incorporam o conceito de duas classes serem compatíveis através do uso de compatibilidade estrutural ou da implementação explícita do conceito de interface.Herança Múltipla em C++ April 05 Prof. F. F. Para implementar uma interface em uma classe. Santos . uma classe estende uma outra classe e implementa zero ou mais interfaces. Ismael H. Santos . É possível herdar múltiplas interfaces. April 05 Prof. usamos a palavra implements. Ismael H. Java não permite herança múltipla com herança de código.ismael@tecgraf. mas implementa o conceito de interface.puc-rio.br 238 119 .puc-rio.

br 239 Interfaces e Classes Abstratas Exemplo interface Pessoa { void Come(int Kg). F. } . } interface Nadador extends Pessoa { void Nada(int Km).br 240 120 .. class Triatleta extends Atleta implements Ciclista. F. } interface Corredor extends Pessoa{ void Corre(int Km). Corredor.puc-rio. Nadador . April 05 Prof. Ismael H.. Ismael H.ismael@tecgraf. Santos .ismael@tecgraf..Interfaces em Java (cont) April 05 Prof..} interface Ciclista extends Pessoa { void Pedala(int Km).puc-rio. Santos .

ismael@tecgraf.1425926.puc-rio. F.puc-rio. Definida no package java. Santos . compareTo deve retornar inteiro < 0 se o objeto remetente é “menor” que o parâmetro. inteiro > 0 se o objeto remetente é maior que o parâmetro. Ismael H.Interfaces e Classes Abstratas <<interface>> Shape draw() resize() public interface Shape { double PI = 3. void resize(). } public class Circle implements Shape { public void draw() { /* draw a circle */ } public void resize() { /* draw a circle */ } } Rectangle draw() resize() public class Rectangle implements Shape { public void draw() { /* draw a rectangle */ } public void resize() { /* draw a rectangle */ } } Circle draw() resize() April 05 Prof. Ismael H. //static final ! void draw(). F.br 242 121 . Santos .ismael@tecgraf.lang: public interface Comparable { public int compareTo( Object other ). 0 se eles são iguais. Muitas classes da biblioteca Java implementam essa interface. } <<interface>> Comparable int compareTo(Object o) April 05 Prof.br 241 Interfaces e Classes Abstratas Comparable é uma interface pré-definida em Java.

myValue.ismael@tecgraf. Santos .length . Ismael H.puc-rio. Santos . public int compareTo(Object otherObject) { Card other = (Card)otherObject.br 243 Polimorfismo novamente public static SelSort(Comparable[] list) { Comparable temp. j < list. return myValue . i < list. i++) { small = i.br 244 122 .length.1. F. F. } } April 05 Prof. for(int i = 0. list[small] = list[i]. for(int j = i + 1. Ismael H.Implementando uma interface public class Card implements Comparable { .compareTo(list[small]) < 0) small = j. } temp = list[i].other. j++) { if( list[j]. } } April 05 Prof.puc-rio..ismael@tecgraf. int small.. list[i] = list[small].

Como esses qualificadores são fixos. } April 05 Prof. Santos .puc-rio. } class StackImpl implements StackInterf { int data[].Interfaces e Classes Abstratas Exemplo de Interface Ao implementarmos o TAD Pilha.puc-rio. não precisamos declará-los (note o exemplo anterior).ismael@tecgraf.br 246 123 . F. ………………. } April 05 Prof. F. Santos . interface StackInterf { boolean isEmpty().ismael@tecgraf. void push(int n). interface StackInterf { public abstract boolean isEmpty().br 245 Interfaces e Classes Abstratas Membros de Interfaces Uma vez que uma interface não possui implementação. temos que: seus campos devem ser públicos. seus métodos devem ser públicos e abstratos. int pop(). estáticos e constantes. int top(). Ismael H. public abstract int pop(). public abstract int top(). Ismael H. poderíamos ter criado uma interface que definisse o TAD e uma ou mais classes que a implementassem. top_index. public abstract void push(int n).

Podemos criar pilhas específicas mas não podemos criar todas as possíveis. Santos .puc-rio.Interfaces e Classes Abstratas Pilha revisitada class StackImpl implements StackInterf { private int[] data. April 05 Prof.br 247 Interfaces e Classes Abstratas Limites da Herança O mecanismo de herança que analisamos não resolve alguns problemas.ismael@tecgraf. } boolean isEmpty() { return (top_index < 0). F. Considere o TAD Pilha que implementamos: Ele define uma pilha de números inteiros mas isso não devia ser (e não é) necessário. Ismael H. F.. poderia ser útil ter uma pilha de inteiros e uma outra de objetos Point. } int top() { return data[top_index]. } void push(int n) { data[++top_index] = n. private int top_index. Por exemplo.br 248 124 . Ismael H. } int pop() { return data[top_index--]. } } April 05 Prof.ismael@tecgraf. top_index = -1.. Santos . Stack(int size) { data = new int[size].puc-rio.

Ismael H. F. // Comparable é uma interface x = new Pessoa().br 249 Herança Múltipla de Interfaces April 05 Prof. F.puc-rio.Interfaces e Classes Abstratas Resumindo Interfaces Não são classes Oferece compatibilidade de tipos de objetos Comparable x. Santos . Santos . // Pessoa implementa Comparable Permite o uso de instanceof if (x instanceof Comparable) {…} Uma interface pode estender outra public interface Compativel extends Comparable { … } April 05 Prof.ismael@tecgraf.puc-rio.br 250 125 .ismael@tecgraf. Ismael H.

puc-rio. Santos .) April 05 Prof. F.Exemplo – Herança Interfaces April 05 Prof.puc-rio. Ismael H. Ismael H.ismael@tecgraf.br 251 Exemplo – Herança Interfaces (cont. Santos .br 252 126 . F.ismael@tecgraf.

F. Santos .ismael@tecgraf.) April 05 Prof.ismael@tecgraf.puc-rio. Ismael H.Exemplo – Herança Interfaces (cont.br 254 127 . Santos .puc-rio. F. Ismael H.br 253 Conclusão April 05 Prof.

br 256 128 . Várias linguagens OO suportam parametrização de tipos.ismael@tecgraf. Parametrizar um tipo significa passar o tipo a ser usada em alguma operação como um parâmetro.puc-rio. Ismael H.POO-Java Classes Parametrizadas April 05 Prof. F.puc-rio. April 05 Prof. Santos . Santos . por exemplo.ismael@tecgraf. F.br 255 Classes Parametrizadas Herança × Parametrização Uma alternativa a criar novas classes para cada diferente tipo de pilha que iremos usar é parametrizar a própria classe que implementa a pilha. Ismael H. poderíamos passar o tipo dos elementos que pilha deveria conter como um parâmetro do construtor. No caso da pilha.

0. F. e.br 258 Exercícios – Questão 6 129 . Object top(). Como Java adota o modelo de hierarquia em árvore. Santos .ismael@tecgraf. mantém as informações de tipo em tempo de execução.puc-rio. Para simularmos parametrização em Java podemos consultar as informações de tipo em tempo de execução através do comando instance of April 05 Prof. Ismael H. além disso.puc-rio.ismael@tecgraf. } April 05 Prof. // pt contém um pixel b = pt instanceof Pixel.3). Ismael H. void push(Object obj). Santos . // b = false pt = new Pixel(1.2.br 257 Classes Parametrizadas Point pt = new Point(). interface StackInterf { boolean isEmpty(). // b = true Podemos então mudar a definição do nosso TAD para especificar pilhas de objetos genéricos. F. podemos simular um TAD paramétrico usando type-casting. ate J2SE 5.Classes Parametrizadas Parametrização em Java Java não provê suporte direto à construção de classes parametrizadas. com uma superclasse comum a todas as classes. Object pop(). // pt contém um ponto boolean b = pt instanceof Pixel.

Sign up to vote on this title
UsefulNot useful