Você está na página 1de 34

Introduo a Java

Java foi iniciado pela Sun no ano de 1990. James Gosling coordenou a equipe que a desenvolveu inicialmente. No incio dos trabalhos o objetivo era desenvolver software para uso em eletrnicos de consumo. Antes do lanamento os projetistas descobriram que Java era timo para a Internet. Tiveram a idia de utilizar um recurso chamado Applet Java, que permitia que programas funcionassem inseridos (Embed) em pginas Web. Lanada em 1995, rapidamente a linguagem ganhou fora como a linguagem para uso com a Internet. Embora o uso de Applets parecesse interessante, a banda larga no era to difundida como hoje, e os links lentos impediam a carga dos programas com uma velocidade aceitvel. Hoje em dia, estes Applets so usados para validao de senhas em alguns bancos. Veja que a segurana um dos pontos extremamente fortes do ambiente Java. Java acabou se transformando na linguagem mais badalada com a introduo do Jsp-Java Server Page, e dos frameworks como Struts, Hibernate e outros. e do J2ee. Isso permitiu que Java fosse realmente utilizado pelas grandes corporaes desenvolver softwares de peso nesta linguagem que inicialmente era despretensiosa. O principal diferencial de Java para as outras linguagens sua independncia de plataforma, embora seja compilada. Utilizando uma mquina virtual diferente em cada plataforma onde funciona, os programas em si depois de compilados podem ser transportados de um ambiente para outro sem modificaes. E para ambientes diferentes eu quero dizer: Processadores diferentes: x86, Sparcs, PowerPC, etc Sistemas Operacionais diferentes: Windows, Linux, MacOs, Solaris, etc Assim podemos desenvolver um programa para Windows que funciona em Linux, MacOs, etc. Mas outras caractersticas importantes ainda esto presentes: Orientao a Objeto Alto nvel Tipos de dados Estticos Multithreaded Extensvel Bem estruturada Acesso a banco de dados

Em Java escrevemos o cdigo em um editor de texto sem formatao, como o bloco de notas do Windows e salvamos o arquivo com a exteno *.java. Usamos o compilador javac para obter o programa executvel *.class. Os arquivos .class no possuem cdigo executvel (bytecode) para o processador do ambiente de desenvolvimento, como acontece com os arquivos executveis de outras linguagens. Os cdigos so bytecodes para uma Mquina Virtual Java (JVM). Para execut-lo usamos o lanador de programas java que aciona a Mquina Virtual para executar o programa. O JVM por sua vez traduz os bytecodes java para o processador especfico onde est sendo executado o programa. A plataforma Java inclui alm da Linguagem de Programao e da Java Virtual Machine JVM, a API Biblioteca de Classes. Esta biblioteca possui um grande conjunto de Classes que implementam vrias ferramentas necessrias para os programadores. A maior parte das implementao do Java esto na biblioteca. O aprendizado da linguagem Java extremamente rpida, mas devido amplitude da biblioteca, necessrio muita pesquisa para no tentar reinventar a roda a cada programa desenvolvido. Na prxima aula iremos comear realmente a programar em Java, escrevendo muito cdigo. Antes de terminar esta aula no entanto instale o seu ambiente de desenvolvimento Netbeans que eu recomendo para as aulas seguintes. necessrio uma mquina razovel (>1Ghz) e 512Mb de memria para ficar confortvel. Porm j vi funcionando com menos. E vamos fazer um teste para ver se est funcionando:

Abrir o Netbeans e acionar o menu Arquivo/Novo Projeto; Uma janela chamada Novo Projeto abrir. No canto esquerdo tem a identificao do passo em que estamos; No passo 1: Selecionar Geral / Aplicao Java , clicar no boto Prximo ; Passo 2: Definir o nome da aplicao. Use AppAloMundo. (maiscula e minscula importante em Java, nunca se esquea disso). Defina a pasta onde vai salvar a aplicao e o nome da classe principal: appalomundo.AloMundo e clique em finalizar; Faa exatamente como eu estou pedindo a primeira vez, depois se quiser repetir por sua conta; Automaticamente o Netbeans ir criar os diretrios necessrios e arquivos para sua aplicao;

Com o projeto pronto para uso, modificar o cdigo de AloMundo.java para:

public class AloMundo { public static void main(String[] argv){ AloMundo objeto=new AloMundo(); } /** Creates a new instance of AloMundo */ public AloMundo() { System.out.println("Al mundo!"); } } Salve o arquivo e execute a classe com a tecla <F6> ou com o menu Executar/Executar Projeto Principal. O resultado, se tudo der certo, ser uma aba conforme a imagem abaixo:

Veja aps a sada run: o resultado da execuo do seu programa. Simplesmente Al Mundo!

Java Essencial
Java uma linguagem Orientada a Objeto A programao em java consiste em manipulao e criao de objetos.

Objeto
Em programao, objetos so representaes computacionais de entidades reais, ou abstratas. Eles representas pessoas, entidades. Ou mesmo coisas mais ou menos abstratas, como uma msica, ou uma conta bancria. Todos objetos tem estados: uma pessoa tem nome, idade, Rg, etc. Uma msica tem ttulo, interprete, etc. Uma conta bancria tem seu saldo, seu nmero de identificao, titular da conta, etc. Programadores podem chamar mtodos ou aes no objeto para realizar computaes que podem potencialmente modificar o estado do objeto: Programador: Quantos anos voc tem ? <<mtodo Objeto: Eu tenho 10. <<valor de retorno do mtodo Programador: Hoje seu aniversrio! <<outro mtodo Objeto: Eu tenho que somar 1 minha idade. <<provocou mudana Programador: Qual seu saldo? Objeto Conta Bancria: Saldo igual a R$ 2940,00 Programador: Sacar 100 reais Objeto: Eu tenho que atualizar o saldo para R$ 2840,00 Um programa em Java: package ola; import java.util.System; class OlaMundo { String minhaString; void vaiLa() { minhaString = new String("Ol, Mundo!); System.out.println(minhaString); } public static void main(String[] args) { AloMundo meuAloMundo = new AloMundo(); meuAloMundo.vaiLa(); } }

Classes
Classes por sua vez so modelos para fazer Objetos. Programar em Java consiste em escrever classes. Todo o cdigo de Java est dentro de classes. class HelloWorld { //nome da classe ... <toda a programao> ... }

Campos
Campos tambm chamados variveis, so usadas para armazenar o estado do Objeto. class Pessoa { int idade; // <<= varivel ou campo } <classe do objeto> <nome da varivel/campo>;

Construindo Objetos
Pessoa luis = new Pessoa(); Para a construo de um objeto usa-se o cdigo new conforme o exemplo acima. Objetos so criados a partir de uma classe, so instncias das classes. O cdigo new Pessoa() cria um objeto na memria do computador, especificamente no Heap do Java. No cdigo acima luis um ponteiro para o objeto. Isto , o Objeto que foi criado armazenado em uma rea de memria do computador, a varivel luis armazena o endereo desta posio de memria. O cdigo acima luis = atribui o endereo do objeto na memria para a varivel luis. <tipo> <nome da varivel> = new <nome da classe>();

Usando objetos
Depois de criado, um objeto pode ser usado assim: Pessoa luis = new Pessoa(); luis.idade=33; //use "." para acessar os campos Pessoa elaine = new Pessoa(); elaine.idade=32; System.out.println(luis.idade); // imprime 33 na tela System.out.println(elaine.idade); //imprime 32 na tela

Tipos Primitivos
Em Java nem tudo so objetos. Algumas coisas so to simples, que no compensa usar objetos para represent-los: boolean, byte, short, int, long, double, float, char. So respectivamente tipo lgico, nmero, inteiro curto, inteiro, inteiro longo, nmero ponto flutuante duplo, ponto flutuante simples, caracter. Boolean Um valor verdadeiro ou falso. Byte short char int long float Valor numrico inteiro com sinal de 8 bits Valor numrico inteiro com sinal de 16 bits Caracter unicode de 16 bits Valor numrico inteiro com sinal de 32 bits Valor numrico inteiro com sinal de 64 bits Valor numrico de ponto flutuante padro IEEE754 de 32 bits

double Valor numrico de ponto flutuante padro IEEE754 de 64 bits

Para armazenar texto, no usamos um tipo primitivo, temos uma classe String: String nome=new String(Jos das Couves);

Mtodos
So aes que podemos realizar sobre os objetos, que podem mudar seu estado. <tipo do retorno> <nome do mtodo>(<parmetros>) { <corpo do mtodo> } No exemplo AloMundo no inicio temos dois mtodos definidos: vaiLa e main: meuAloMundo.vaiLa(); // use . para acessar o mtodo

Construtores
Construtores so tipos especiais de mtodos que no retornam valores, usados para iniciar campos, aceitam parmetros e tem corpo de mtodo normal. Tem o mesmo nome da classe, inclusive iniciando com letra maiscula: class Pessoa{ int idade; Pessoa(){ //incio do contrutor idade=18; // ao criar um objeto do tipo Pessoa a idade ser iniciada // com 18 anos em todos os objetos; } //fim do construtor }

Corpo do Mtodo
String primeiroNome(String nomeCompleto) { int espaco = nomeCompleto.indexOf( ); //posio onde est o espao String palavra = nomeCompleto.substring(0, espaco); return palavra; } Pode-se definir qualquer nmero de parmetros, separando por vrgula (no exemplo nomeCompleto). Pode-se declarar variveis locais(espaco, palavra). Deve sempre retornar alguma coisa (String palavra). No caso de um mtodo no necessitar retorno usa-se void no tipo de retorno (void=nada). void seuAniversario(){ >>exemplo de mtodo void para a classe Pessoa idade++; }

Controle de Fluxo
O comando if permite controle sobre aes que devem ser realizadas de acordo com as situaes do programa: if(luis.idade<18){ System.out.println("Proibido para menores"); } else if(luis.temCartaoCredito(){ System.out.println("Seja bem vindo!"); } else { System.out.println("Sai fora, t pensando que de graa?"); }

if(condio 1){ } else if (condio2) { } else if (condioN) { }else { }

Condies
As condies do if so expresses que so booleanas, valem Verdadeiro ou Falso. Para construir usar os operadores: < menor > maior == igual <= menor ou igual >= maior ou igual ! negao Exemplos: caixa.isVazia(); caixa.numeroLivros()==0 !(caixa.numeroLivros()>1) negao: nmero de livros na caixa NO maior que 1) caixa.numeroLivros!=MAX_NUMBER_BOOKS caixa.numeroLivros%2==0 //verifica se o resto da diviso por 2 zero (isso , se o nmero de livros par) Repetio For (loops) Repete um trecho de cdigo, controlando por uma varivel: for (int i = 0; i < 3; i++) { System.out.println(i); // imprime 0 1 2 } for (<inicializao> ; <condio> ; <incremento>) { . // trecho de cdigo que repete } Inicializao executado uma nica vez antes do trecho repetido. A condio verificada aps a inicializao e antes de repetir o trecho. Incremento realizado todas as vezes aps o trecho repetido.

Para de repetir quando a condio passa a ser falsa.

Repetio While
Repetio de um trecho de cdigo enquanto (while) uma condio for verdadeira. int i = 0; while(i<3) { System.out.println(i); //imprime 0 1 2 i++; } while (<condio>) { } Combinando Condies Quando temos mais de uma condio para testar usamos &&: E lgico ou ||: OU lgico. luis.idade>=18 && luis.temCartaoCredito() alguem.nome.equals(Luis)||alguem.nome.equals(Lima) (!true || false)&& true (resposta=false)

Matrizes ou arrays
Lista de objetos identificados com um nico nome, mais nmeros de ordem. String[] animais = new String[2]; // dois objetos String animais[0] = new String("Rex"); animais[1] = "Lulu"; // forma simples de criar String String[] animais= new String[] {"Rex","Lulu"}; System.out.println(animais.length); // 2 tens na matriz

Objetos wrapper dos tipos Primitivos


Os tipos primitivos em algumas situaes so interessantes serem manipulados como objetos. A biblioteca Java possui classes que representam cada tipo de varivel primitiva: Integer para int, Float para float, Double para double, Boolean para boolean, etc.

Usando os wrappers Integer a= new Integer(3); // cria objeto Integer e inicia com valor 3; Integer sum = a.add(5); // cria objeto Integer com o valor de a+5; Wrappers em Arrays Integer notas= new Integer[50]; // 50 objetos Integer

Cuidado ao usar Objetos


No tentar acessar array fora de faixa animais[5] >> excesso ArrayOutOfBoundsException; Acessar varivel sem criar objeto correspondente String[] str; str.length >> NullPointerException Erros de interpretao de uso Integer a = new Integer(3); //a=>3 a.add(5); //calcular a+5, no muda valor de a=>3 a=a.add(5); //agora sim: a=>8

Resumo
Variveis Variveis apontam para objetos; Variveis apontam objetos de uma classe em particular; Integer x; Declara uma varivel; Objetos Classes definem objetos Objetos so instncias de uma classe em particular; new Integer(3); Constri um objeto;

Representao Objeto vs Variveis


Um exemplo visual de objetos e variveis durante a execuo de um programa java:

Temos dois objetos da classe Integer com o valor 3 armazenado. E temos 4 variveis: num, x, y e z. As variveis num e x apontam para o mesmo objeto. A varivel z no aponta para nenhum objeto.

Null
Variveis sem objetos relacionados apontam para null. null no um objeto, apenas uma indicao para a no existncia de objeto relacionado com uma varivel. Utilizar uma varivel com valor Null para verificar um campo de um objeto ir causar um erro (NullPointerException): Pessoa joao; joao.idade=10; // NullPointerException, no existe objeto relacionado varivel joao, portanto no existe o campo idade.

Mudando um objeto atravs das variveis


Para atribuir um objeto uma varivel, utilize o operador =. Com isso possvel fazer mais de uma varivel apontar para o mesmo objeto. Este recurso pode provocar um efeito chamado mutao de objetos compartilhados: public class MutationExample { public static void main(String[] args) { List<String> a = new ArrayList<String>(); List<String> b; b= a; // b e a compartilham a lista a.add(Alo, Mundo!); System.out.println(b); // imprime "Al, Mundo!" } } No exemplo, a e b so variveis apontando para a mesma lista. Usando a.add( modificamos o objeto lista. Quando imprimimos b, a varivel aponta para o mesmo objeto modificado, e portanto mostra o valor Al, Mundo!.

Campos e Mtodos Estticos e No estticos


Campos e mtodos tambm so chamados membros de uma classe. Por padro so no estticos.

Membros estticos so aqueles que so compartilhados entre cada Instncia/Objeto da classe. Um campo esttico, compartilha seu valor entre cada objeto da classe. Campos no Estticos public class Livro { public int livroCounter = 0; public Livro() { livroCounter++; } public static void main(String[] args) { new Livro(); new Livro(); Livro biblia = new Livro(); System.out.println(biblia.livroCounter); // Imprime 1 } }

Campos Estticos
public class Livro { public static int livroCounter = 0; // <<== campo esttico public Livro() { livroCounter++; } public static void main(String[] args) { new Livro(); new Livro(); new Livro(); System.out.println(Livro.livroCounter); // Imprime 3: observe Livro se refere classe } } Campos Estticos devem ser chamados a partir do nome da Classe. So nicos para todos os objetos da classe.

Mtodos No Estticos
public class livro { private boolean lido = false; public void leiaLivro() { lido = true; } public static void main(String[] args) { Livro livro = new Livro(); livro.leiaLivro(); // Invocado atravs do objeto

} }

Mtodos Estticos
public class Livro { private boolean lido = false; public static void leiaLivro(Livro livro) { // <<== metodo esttico livro.lido = true; } public static void main(String[] args) { Livro livro = new Livro(); Livro.leiaLivro(livro); // mtodo invocado atravs da classe // livro.leiaLivro(livro); vlido mas desaconselhado! } } Mtodos estticos so chamados atravs da classe, e s tem acesso a dados estticos.

Objetos passados por referncia


Parmetros de mtodos podem ser por referncia ou valor. Objetos por padro so passados por referncia. Isso , mudanas no objeto dentro da funo se propagam para fora da mesma. public static <T> void removePrimeiro(List<T> lista) { lista.remove(0); } public static void main(String[] args) { List<String> minhaLista = new ArrayList<String>(); minhaLista.add(Gato); minhaLista.add(Cachorro); removePrimeiro(minhaLista); System.out.println(minhaLista); // imprime [Cachorro] } Tanto a varivel minhaLista no mtodo main e a varivel lista no mtodo removePrimeiro se referem ao mesmo objeto na memria (veja a e b em Mudando um objeto atravs das variveis acima)

Escopo
Escopo de variveis est relacionado que partes do programa podem acessar uma varivel. Dependendo de onde a varivel est definida seu escopo muda.

As Chaves {} definem uma rea de escopo. Quando uma varivel definida dentro de uma rea de escopo, somente visvel dentro desta rea. Ao final da execuo de uma rea de escopo, as variveis internas so automaticamente destrudas. O escopo dos campos das classes so todos os mtodos da classe. Isso , um campo de um objeto da classe acessvel por todos os mtodos daquele objeto. Os parmetros de um mtodo, funcionam exatamente como uma varivel do mtodo. Existe at o fim da execuo do mtodo.

Exemplos de Escopo

Alguns toques: Atribuo: variveis apontam objetos. Cuidado com ponteiros nulos; Static: no invocar mtodos estticos pelos objetos Passagem por referncia: faa uma cpia se quizer se prevenir de uma mudana acidental;

Escopo: minimize o escopo das variveis o mais possvel. No faa tudo global Como voc pode ver, esta a aula mais pesada do curso. No deixe as dvidas acumularem. Faa os exerccios. Tire suas dvidas no Frum, para isso que est disponvel. No se acanhe. O curso s melhora com a participao de vocs. Aprofundando Procure no Java Tutorial da Sun, os tpicos abordados nesta aula. Faa um estudo de operadores Java. Faa um estudo da classe java.lang.Math. Faa um estudo da classe java.lang.String. Qualquer dvida v ao frum. Exerccios Faa um programa para mostrar os nmeros pares de 1 a at 100; Faa um mtodo que verifique se um nmero primo; (chamado isPrimo) Faa um programa para mostrar os nmeros primos de 1 a 50; Transforme o mtodo isPrimo em um mtodo esttico; Refaa o programa para usar o mtodo esttico; Faa uma funo que verifique os nmeros primos de uma lista e exclua todos os nmeros no primos da mesma.

Classes, Interfaces e Polimorfismo


Classes e Interfaces, Conceitos
Vamos comear com uma reviso de alguns conceitos j passados na ltima aula: Classe: um modelo para um Objeto Interface: uma especificao Instncia: um objeto de uma Classe ou Interface fisicamente representado na memria

Membros de uma Classe:

Mtodo: um conjunto sequencial de instrues Campo: varivel associada com um objeto particular Campo esttico: varivel compartilada entre todos os objetos de uma classe.

Tipos de Dados
Existem dois tipos de dados em Java, os tipos primitivos e os tipos objetos.

Objetos
Usar a palavra chave new para criar um objeto. Este comando ir reservar espao para um novo objeto na memria, chamar o construtor do objeto e retornar o endereo para o novo objeto. Modelo de definio de uma Classe: [acesso] [abstract/final] class NomeDaClasse [extends NomeClassePai] [implements NomeDaInterface...] { //construtores //mtodos membros //campos membros } Exemplo de Sintaxe public class ContaBancaria { ... }

Membros das Classes


Ao escrever uma classe ns podemos definir os seguintes membros: Construtores Mtodos e campos Mtodos e campos estticos Classes alinhadas Vamos detalhar cada um dos membros, comeando pelos Construtores.

Construtores
So os mtodos chamados automaticamente na criao dos objetos. Deve ter o mesmo nome da classe que a possue. Tem o objetivo de realizar a inicializao de um objeto da classe. Modelo de Construtor [acesso] NomedaClasse ([argumentos...]) { //corpo do construtor }

Exemplo de Sintaxe Construtor public class ContaBancaria { public ContaBancaria(){ // veja que o nome do construtor o mesmo da classe saldo=0; } }

Exemplo de Sintaxe de Mltiplos Construtores public class ContaBancaria { public ContaBancaria(){ saldo=0; } public ContaBancaria(int saldoInicial){ saldo=saldoInicial; } }

Mtodos
Mtodos so usados para realizar funes modificando o estado dos objetos. Podem ter vrios parmetros, e retornar um nico valor. Nos casos que no retornam valor deve ser utilizado a parlavra chave void. Modelo de Mtodo [acesso] tipoRetorno nomeDoMtodo ([argumentos...]) { //corpo do mtodo }

Exemplo de Mtodo public class ContaBancaria { public int getSaldo(){ return saldo; } }

Sobrecarga de mtodos
Uma classe pode possuir dois mtodos com mesmo nome, desde que os seus argumentos sejam diferentes. Por exemplo: int getSaldo() {...} int getSaldo(String tipo) {...} Java reconhece qual mtodo dever executar verificando quantos e que tipos de parmetros so apresentados na chamada. Exemplo: int x=minhaClasse.getSaldo(total); //chamar o segundo mtodo.

Campos
Um campo como uma varivel e armazena um estado do objeto. sempre relacionado a um tipo de dado que determina o que ele pode armazenar. Modelo de Campo [acesso] tipoDeDado nomeCampo [= valor]; Exemplos de Campos public class ContaBancaria { public int saldo; // << campo public Date ultimaTransacao; // << campo public List transacoes; // << campo } Juntando tudo public class ContaBancaria {

private int saldo; // campo public ContaBancaria() { //construtor saldo= 0; } public void retirada(int valor) { //mtodo saldo = saldo valor; } public void deposito (int valor) { //mtodo saldo = saldo + valor; } }

Controle de Acesso
Para controlar o acesso aos dados membros temos 4 tipos de acesso direrentes que determinam que classes tem acesso: public qualquer outra classe protected somente subclasses (default) somente classes no mesmo pacote (package) private somente acessvel por mtodos da mesma classe Estes nveis de acesso so usados para garantir a abstrao e encapsulamento dos objetos.

Herana
o mecanismo que permite uma classe herdar funcionalidades de outra classe, permitindo abstrao de dados e procedimentos e diminuindo a complexidade de grandes sistemas de dados. Usamos herana quando duas idias tem diferentes comportamentos mas com funcionalidades sobrepostas: ContaBancaria => ContaCorrente ContaBancaria => ContaPoupanca

Interfaces
Uma interface uma especificao de uma classe. Declara-se mtodos, mas no os define. No tem contrutores. O objetivo expecificar um padro de uso (interface) de um conjunto de classes diferentes.

Modelo de Interfaces [acesso] interface NomeDaInterface [extends ListaDeNomeDeInterface...] { //declarao de mtodos } Exemplo de Interface public interface ContaBancaria { public void retirada (int valor); //nenhum mtodo definido na interface, somende declarado public void deposito (int valor); public int getSaldo (); }

Como utilizar uma Interface?


Uma vez definido uma interface, podemos escrever classes, ou mesmo outras interfaces que implementam (implement) ou extendam (extends) esta interface. Quando uma classe implementa uma interface, esta classe deve possuir em seu corpo cada um dos mtodos declarados desta interface. Se uma classe implementa mais de uma interface, ela deve possuir cada uma dos mtodos de cada uma das interfaces que implementa. Exemplo usando a Interface public class ContaPoupanca implements ContaBancaria { private int saldo; public ContaPoupanca (int saldoinicial) { saldo= saldoinicial; } public void somaJuros(int juros){ //funo particular de ContaPoupanca saldo=saldo+(saldo*(juros)/100); } //implementando mtodos da interface ContaBancaria: public void retirada (int valor) { saldo= saldo valor; } public void deposito (int valor) { saldo = saldo + valor; } public int getSaldo () {

return saldo; } }

Classes Abstratas
So uma mistura de interfaces e classes, podendo definir mtodos e possuir campos. Porm podem apresentar mtodos somente declarados, e no definidos. A idia capturar o estado de uma idia e tambm sua funcionalidade. Exemplo de Classe Abstrata public abstract class ContaBancaria { private int saldo; // campo public void retirada(int valor); //funo no definida pela classe abstrata, porque difere de tipo de conta bancria para outra. public void deposito (int valor) { saldo = saldo + valor; } }

Exemplo extendendo uma Classe Abstrata public class ContaCorrente extends ContaBancaria { public ContaCorrente(){ saldo=0; } public void retirada(int valor){ if((saldo-valor)<0) { throw new RuntimeException (Insuficiencia de fundos); } else { saldo=saldo-valor; } } }

Exemplo de outro tipo de Conta Bancaria: public class ContaCorrenteEspecial extends ContaBancaria { private limiteChequeEspecial; public ContaCorrenteEspecial(){ saldo=0;

limiteChequeEspecial=1000; } public void retirada(int valor){ if((saldo-valor)<limiteChequeEspecial) { throw new RuntimeException (Estourado Limite Cheque Especial); } else { saldo=saldo-valor; } } }

Polimorfismo
Consiste na capacidade de objetos de tipos diferentes responder a mtodos de mesmo nome e tipo. Isso acontece quando usamos herana. A mquina virtual java automaticamente determina qual das funes devem ser executadas.

A classe Object
Quando uma classe no extende nenhuma outra classe, implicitamente ela extende a classe java.lang.Object. Esta uma classe da biblioteca java que contm um conjunto de mtodos que assim ficam disponveis para qualquer classe que voc definir. os principais mtodos da classe Object so: clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString e wait.

Sobreposio de mtodos (overriding)


Se uma classe A extende uma classe B, ento B a classe pai (superclass) de A. E, a classe A uma classe filha (subclass) de B. Quando a classe pai possui um mtodo definido, a classe filha pode ter um mtodo com mesmo nome e tipo para modificar o comportamento do mtodo da classe pai. Isso chama-se sobreposio (overriding).

Modificando um mtodo da Superclass


A classe Object possui um mtodo chamado equals que verifica se dois objetos so o mesmo, isto , se duas variveis esto apontando para o mesmo objeto. (revisem a ltima aula se no entenderam) Porm em alguns tipos de objetos a noo de igualdade d-se de maneira totalmente distinta. No nosso exemplo de conta bancria, igualdade poderia dizer que duas contas possuem o mesmo saldo. Graas ao polimorfismo e sobreposio possvel mudar o mtodo equals para realizar exatamente esta verificao.

Usando o mtodo equals padro ContaCorrente ContaCorrente c1.equals(c1); c2.equals(c2); c1.equals(c2); c1 = new ContaCorrente(100); c2 = new ContaCorrente(100); // verdadeiro // verdadeiro // falso, como so dois objetos a funo equals retorna falso.

Modificando nossa funo equals, usando overriding: public class ContaCorrente extends ContaBancaria { ... public boolean equals (Object aux){ if(aux instanceof ContaCorrente){ //verifica se tipo de dado do parmetro est correto ContaCorrente aux2 = (ContaBancaria) aux; return saldo == aux2.saldo; //retorna true se saldo igual } else { return false; //se tipo incorreto no igual } } ... }

Usando nova funo equals ContaCorrente c1 = new ContaCorrente(100); ContaCorrente c2 = new ContaCorrente(100); c1.equals(c1); // verdadeiro c2.equals(c2); // verdadeiro c1.equals(c2); // verdadeiro, pois agora o que se compara o saldo, no a posio do objeto

Usando variveis do tipo Superclass Variveis de um tipo podem armazenar dados de tipos subclasses Object o1 = new ContaCorrente(100); //Object superclass de qualquer classe Object o2 = new ContaCorrente(100); Object o tipo em tempo de Compilao (compile-time) e ContaCorrente o tipo em tempo de execuo (runtime).

Chamada de mtodos em tempo de execuo Quando chamamos um mtodo por uma varivel do tipo superclass mas com um objeto subclass armazenado, o mtodo executado ser o do subclass. No nosso exemplo, chamar o mtodo o1.equals(o2), iria chamar a funo equals definida em ContaCorrente. Isso acontece porque Java escolhe o mtodo a ser chamado em tempo de execuo e no em tempo de compilao. Exemplo usando ContaCorrente e ContaCorrenteEspecial ContaBancaria c1 = new ContaCorrente(10); ContaBancaria c2 = new ContaCorrenteEspecial(10); c1.retirada(12); //chamar ContaCorrente.retirada(int) e causar uma exceo por insuficincia de saldo c2.retirada(12); //chamar ContaCorrenteEspecial.retirada(int) e no apresentar problemas. As vantagem de uso de tipos abstratos como demonstrado aqui que os detalhes de implementao so mais simples de modificar sem mudanas nas classes que usam estes tipos abstratos.

Colees, Hashing e Comparadores


Hashing
Hashing uma maneira de identificar objetos com um nmero inteiro. Coisas iguais tem (ou deveriam ter) o mesmo nmero hash. Isso extremamente til para realizao de comparaes mais rpidas. Em classes escritas por voc mesmo, para isso funcionar corretamente, voc deve sobrescrever a funo .hashCode() e gerar seu prprio nmero hash. A funo .HashCode() Esta funo deve retornar um nmero inteiro. definida na classe java.lang.Object e retorna altomaticamente um valor nico para cada instncia (para cada objeto). Se sua classe tem comportamento diferente deste, voc deve sobrescrever esta funo. As trs premissas da funo .HashCode() so:

O hashCode de um objeto no deve mudar se o valor de um objeto no mudar. Dois objetos iguais DEVEM ter o mesmo hashCode

desejvel que dois objetos diferentes tenham hashCode distintos (sempre que isso for possvel) Exemplos de hashCode: String scott = "Scotty"; String scott2 = "Scotty"; String corey = "Corey"; System.out.println(scott.hashCode()); System.out.println(scott2.hashCode()); System.out.println(corey.hashCode()); // => -1823897190, -1823897190, 65295514 Integer int1 = 123456789; Integer int2 = 123456789; System.out.println(int1.hashCode()); System.out.println(int2.hashCode()); // => 123456789, 123456789

Classe NomeCompleto
Para prosseguir iremos definir uma classe chamada NomeCompleto, que ser utilizada nos exemplos do restante da aula: public class NomeCompleto { public String nome; public String sobrenome; public NomeCompleto(String nome, String sobrenome) { this.nome = nome; this.sobrenome = sobrenome; } public String toString() { return nome + " " + sobrenome; } public boolean equals(Object o) { return (o instanceof NomeCompleto &&((NomeCompleto) o).nome.equals(this.nome) &&((NomeCompleto) o).sobrenome.equals(this.sobrenome)); } } Vamos verificar se esta classe NomeCompleto est funcionando corretamente: NomeCompleto maria = new NomeCompleto("Maria", "Lcia"); NomeCompleto jose = new NomeCompleto("Jos", "Silva"); NomeCompleto jose2 = new NomeCompleto("Jos", "Silva"); System.out.println(maria.equals(jose));

System.out.println(jose.equals(jose2)); System.out.println(maria.hashCode()); System.out.println(jose.hashCode()); System.out.println(jose2.hashCode()); // false, true, 6718604, 7122755, 14718739 Objetos so iguais, mas o hashCode no . Precisamos arrumar esta classe. Voc no pretende usar a classe hashCode, portanto no precisa se preocupar com isso no ? ERRADO! Voc precisa resolver isso porque ir ter problemas com listas e colees. As classes que implementam as listas pressupem que a funo hashCode() funciona corretamente. Alis, estamos vendo hashCode, justamente para podermos usar listas na continuao, e lembr-lo que antes de usar listas deve sobrescrever esta funo. O que deve fazer a funo hashCode mesmo? Gerar um nmero inteiro nico para objetos com contedo iguais, e diferentes para objetos de contedo diferente. Possvel implementao para o nosso exemplo: public class NomeCompleto { ... public int hashCode() { return nome.hashCode() *23 + sobrenome.hashCode(); } } Veja que as classes String j implementam hashCode corretamente. Usamos *23 para que Jos Maria seja diferente de Maria Jos. Faa testes e verifique que sem a multiplicao o hashCode gerado o mesmo. Tenha certeza que entendeu este tpico antes de prosseguir. Funes hashCode no implementadas ou com cdigo errado iro provocar problemas estranhos no uso de colees. Estes problemas podero te deixar realmente confuso. Se tiver dvidas nesta parte pergunte no frum, ou nos comentrios antes de continuar.

Colees
Colees so implementaes da biblioteca java para executar: Colees de objetos Ordenao de objetos Estocagem de objetos

Recuperao e busca de objetos estocados Para usar Colees deve-se incluir a importao de java.util.* no topo de cada arquivo *.java: package lab2; import java.util.*; public class UsandoColecoes { List<String> lista = new ArrayList<String>(); ... //resto da classe } Sintaxe bsica de uma coleo de NomeCompleto:

Adiciona um nome a lista: boolean add(NomeCompleto o); Verifica se um objeto est na lista: boolean contains(Object o); Remove um elemento da lista: boolean remove(NomeCompleto o); Verifica quantos elementos tem na lista: int size(); Exemplo de uso: List<NomeCompleto> iapjava = new ArrayList<NomeCompleto>(); iapjava.add(new NomeCompleto("Luis", "Lima"); iapjava.add(new NomeCompleto("Jos", "Silva"); System.out.println(iapjava.size()); // => 2 iapjava.remove(new NomeCompleto("Jos", "Silva"); System.out.println(iapjava.size()); // => 1 List<NomeCompleto> iapruby = new ArrayList<NomeCompleto>(); Iapruby.add(new NomeCompleto("Marcos", "Fontes")); iapjava.addAll(iapruby); System.out.println(iapjava.size()); // => 2

Colees Genricas
permitido definir uma coleo que s armazene objetos de um determinado tipo como no exemplo acima. Porm tambm permitido definirmos colees genricas que armazenam objetos de qualquer tipo. Exemplo de colees genricas: List untyped = new ArrayList(); List<String> typed = new ArrayList<String>(); Object obj = untyped.get(0); String sillyString = (String) obj;

String smartString = typed.get(0); As colees no genricas ou tipadas so mais prticas de manipular. Recuperando todos os dados de uma lista: Dado uma coleo de NomeCompleto chamada colecaox podemos usar duas ferramentas para recuperar cada item da coleo: Iterator e For each.

Iterator
Iterator<NomeCompleto> it = colecaox.iterator(); while (it.hasNext) { NomeCompleto obj = it.next(); // Fazer alguma coisa com cada objeto } for (NomeCompleto obj : colecaox) { // Fazer alguma coisa com cada objeto }

Excluir objetos da lista enquanto se est recuperando os mesmo: No permitido remover objetos de uma coleo enquanto a mesma est em um lao for-each. Para remover uma lista enquanto se est recuperando necessrio usar o Iterator: Iterator<NomeCompleto> it = colecaox.iterator(); while (it.hasNext) { NomeCompleto obj = it.next(); it.remove(obj); // Veja que s se remove pelo Iterator no pela coleo: colecaox.remove(Obj); }

Tipos de Coleo disponveis: Listas: ArrayList; Conjunto: (set) HashSet TreeSet Mapeamento (map) HashMap

Listas
ArrayList uma lista de objetos ordenados, similar a um Array, porm sem tamanho pr-definido. A lista ordenada de acordo com a ordem de insero. Definindo e inserindo itens na lista: List<String> strings = new ArrayList<String>(); strings.add("one"); strings.add("two"); strings.add("three"); // strings = [ "one", "two", "three"] Inserindo objetos em uma determinada posio List<String> strings = new ArrayList<String>(); strings.add("one"); strings.add("three"); strings.add(1, "two"); // strings = [ "one", "two", "three"] Recuperando objetos de uma determinada posio: s.o.print(strings.get(0)) // => "one" s.o.print(strings.indexOf("one")) // => 0

Conjuntos (set)
Coleo sem tamanho e sem ordem definida. No permitido duplicidade de objetos no conjunto. Exemplo: Set<NomeCompleto> nomes = new HashSet<NomeCompleto>(); nomes.add(new NomeCompleto("Jos", "Silva")); nomes.add(new NomeCompleto("Jos", "Silva")); System.out.println(names.size()); => 1 Regra de ouro para Conjuntos (set): Um elemento do conjunto no pode mudar se isso poder afet-la a ponto de torn-lo igual a um outro objeto do conjunto. (ou a outro objeto a ser inserido no conjunto mesmo aps a mudana) Se no respeitar esta regra, pode se preparar para coisas realmente estranhas. De preferncia sempre use objetos imutveis com conjuntos.

Mapas (map)
Mapas so conjuntos de pares Chave/Valor. Para cada chave o mapa armazena um valor correspondente. Com o valor da chave a coleo map pode recuperar

o valor previamente armazenado. Uma chave deve ser nica, porm valores podem repetir. um servio muito til para armazenamento e posterior recuperao de dados com valor chave. Utilssimo para uso com banco de dados relacionais. Iremos usar isso muito, ento no deixe dvidas a respeito Mapas no implementam as funes add e contais, em seu lugar temos as seguintes funes: boolean put(Foo chave, Bar valor); boolean contaisKey(Foo chave); boolean contaisvalue(Bar value); (neste exemplo Foo e Bar so duas classes de qualquer tipo) Exemplo de uso: Map<String, String> dns = new HashMap<String, String>(); dns.put("scotty.mit.edu", "18.227.0.87"); System.out.println(dns.get("scotty.mit.edu")); System.out.println(dns.containsKey("scotty.mit.edu")); System.out.println(dns.containsValue("18.227.0.87")); dns.remove("scotty.mit.edu"); System.out.println(dns.containsValue("18.227.0.87")); // => "18.227.0.87", true, true, false Outros mtodos teis em mapas (map): keySet() retorna um Set de todos as chaves values() retorna uma Collection de todos os valores (use ArrayList ou Set para armazen-lo) entrySet() returna um Set de pares chave,valor. Cada par um objeto Map.Entry. Map.Entry suporta getKey, getValue, setValue ;

Comparao e Ordenao
Para uso das colees ordenadas preciso tambm definirmos a funo compareTo nas classes que definirmos. Esta funo usada para decidir, entre dois objetos, qual o maior ou se so iguais. (a.compareTo(b)) dever resultar em um nmero menor que zero se a < b, em zero se a = b e, finalmente, em um nmero maior que zero se a > b . Exemplos de comparao: Integer um = 1; System.out.println(um.compareTo(3)); System.out.println(um.compareTo(-50)); String jose= "Jos";

System.out.println(jose.compareTo("Ana")); System.out.println(jose.compareTo("Z")); // => -1 , 1, 4, -2 Veja que as classes String e Integer j implementam uma funo compareTo corretamente. Nas classes definidas pelo programador esta funo dever ser definida corretamente. Mais a frente iremos defin-la para nosso exemplo NomeCompleto. Por enquanto vamos ver como usar compareTo com listas para ordenar alfabeticamente uma lista: List<String> nomes = new ArrayList<String>(); nomes.add("Sailor"); nomes.add("Lula"); nomes.add("Bobby"); nomes.add("Santos"); nomes.add("Dell"); Collections.sort(nomes); // nomes => [ "Bobby", "Dell", "Lula", "Sailor", "Santos" ]

Interface Comparable
Podemos usar Colletions.sort com a lista acima porque Strings implementam Comparable. Isto , Strings tem uma ordem natural. Para que uma classe NomeCompleto seja Comparable, voc deve implementar: int compareTo(NomeCompleto obj); Exemplo: public class NomeCompleto implements Comparable<NomeCompleto> { ... public int compareTo(NomeCompleto o) { int compare = this.sobrenome.compareTo(o.sobrenome) if (compare != 0) return compare; else return this.nome.compareTo(o.nome); } } Usando a nova classe Comparable NomeCompleto: List<NomeCompleto> nomes = new ArrayList<NomeCompleto>(); nomes.add(new NomeCompleto("Nicolas", "Cage")); nomes.add(new NomeCompleto("Laura", "Dern")); nomes.add(new NomeCompleto("Harry", "Stanton")); nomes.add(new NomeCompleto("Diane", "Ladd")); nomes.add(new NomeCompleto("William", "Morgan")); nomes.add(new NomeCompleto("Dirty", "Glover"));

nomes.add(new NomeCompleto("Johnny", "Cage")); nomes.add(new NomeCompleto("Metal", "Cage")); System.out.println(nomes); Collections.sort(nomes); System.out.println(nomes); // => [Johnny Cage, Metal Cage, Nicolas Cage, Laura Dern, Crispin Glover, // Diane Ladd, William Morgan, Harry Stanton]

Objetos Comparadores (Comparator)


Para criar mais de um mtodo de ordenao voc deve definir classes Comparadoras. A classe comparadora simplesmente uma classe com a implementao da funo compateTo entre dois objetos: int compare(Foo o1, Foo o2); Exemplo de Comparador, ordenando primeiro nome primeiro: public class PrimeiroNomePrimeiro implements Comparator<NomeCompleto> { public int compare(Nome n1, Nome n2) { int ret = n1.nome.compareTo(n2.nome); if (ret != 0) return ret; else return n1.sobrenome.compareTo(n2.sobrenome); } } Isso dever ser feito em arquivo separado do NomeCompleto.java: PrimeiroNomePrimeiro.java Para usar o Comparador: List<NomeCompleto> nomes = new ArrayList<NomeCompleto>(); ... Comparator<NomeCompleto> primeiroNome = new PrimeiroNomePrimeiro(); Collections.sort(nomes, primeiroNome); System.out.println(nomes); // => [Crispin Glover, Diane Ladd, Harry Stanton, Johnny // Cage, Laura Dern, Metal Cage, Nicolas Cage, William // Morgan] Outra maneira de ordenar usando TreeSet. Isso faz a ordenao de maneira automtica, sem precisar chamar a funo sort. Para funcionar os objetos da TreeSet devem ser Comparable ou voc deve definir uma classe Comparator. SortedSet<NomeCompleto> nomes = new TreeSet<NomeCompleto>(new PrimeiroNomePrimeiro());

nomes.add(new NomeCompleto("Laura", "Dern")); nomes.add(new NomeCompleto("Harry", "Stanton")); nomes.add(new NomeCompleto("Diane", "Ladd")); System.out.println(nomes); // => [Diane Ladd, Harry Stanton, Laura Dern]

Aprofundando Procurar e estudar na documentao do java as classes apresentadas nesta aula: (veja java.util.*) emhttp://java.sun.com/j2se/1.5.0/docs/api Excees e tratamento de erros O sistema de excees do Java uma ferramenta para ajudar os programadores a reportar e manipular erros. Sempre que uma funo chamada em um programa puder gerar uma exceo o programador obrigado a tomar uma ao. Esta ao pode ser a captura e tratamento do erro, ou simplesmente o lanamento do erro para outra funo tratar. Vamos ver primeiro como tratar o erro: Exemplo de tratamento/captura de erro tpico: (Exception Catch) public float dividir(int a, int b) { Float resultado; float r=0; try { // Bloco try delimita a poro de cdigo que pode apresentar erro resultado = new Float(a / b); r=resultado.floatValue(); //diviso executada armazena resultado } catch (ArithmeticException e) { //bloco catch trata o tipo de exceo indicado return 0; //diviso por zero } catch (Exception x) { //so permitidos vrios blocos catch, um para cada tipo de exceo. //Exception usada para qualquer tipo de exceo no especfica encontrada //tratar aqui outros erros } finally { // executada aps o tratamento das excees ou quando nenhuma exceo // gerada normalmente quando liberado os recursos usados na funo resultado = null; System.out.println(r); } // aps a execuo das excees ou de todo o bloco try, o fluxo prossegue deste ponto return r; }

Lanamento de Excees (Exception throwing)


Neste caso a funo lana excees para a funo chamadora, isso , quem dever capturar o erro e trat-lo uma funo que usa esta funo para funcionar. Em outras palavras, a funo escrita no trata o erro, simplesmente avisa que o erro aconteceu e interrompe seu processamento. Exemplo de lanamento de erro: public class File { public File(String nomeArquivo) throws FileNotFoundException { ... if (arquivo no encontrado ) { throw new FileNotFoundException(); } } } throws FileNotFoundException na linha de declarao da funo, indica que nesta funo este tipo de exceo poder ocorrer. Isso obriga o programador que usar esta funo a tratar esta exceo (ou lanar para outro nvel novamente). throws new FileNotFoundException(); indica que uma exceo foi detectada e avisa a mquina Java a respeito.