You are on page 1of 116

Governo do Estado do Cear

Secretaria da Educao SEDUC Escolas Estaduais de Educao Profissional EEEP Curso Tcnico de Nvel Mdio em Informtica Prof Marcos Ambrosio dos Santos

Ementa
Carga Horria: 80hs Objetivo: Identificar conceitos e tcnicas de orientao a objetos, Identificar classes de objetos a partir de entidades do mundo real, Interpretar os diagramas da UML na programao orientada a objetos

O aluno dever saber elaborar programas usando o paradigma de orientao a objetos.

Contedo Programtico
Mdulo 1: Caractersticas Avanadas de Classes; Mdulo 2: Arrays e Colees; Mdulo 3: Excees; Mdulo 4: Aplicaes Baseadas em Texto; Mdulo 5: Fluxo de I/O Avanado; Mdulo 6: Acessando Banco de Dados com JAVA;

Avaliaes
1 Avaliao: Terica 1 Avaliao: Prtica Criar um Software envolvendo todos os recursos estudados na disciplina;

Programao Orientada a Objetos II

Vid

Caractersticas Avanadas de Classes

Declarar e usar variveis e mtodos "Estticos"


static uma das palavras-chave do Java. O mtodostaticmais famoso de todos omain. E sempre viamainque nossos programas criam vida. Por definio da linguagem Java, o mtodo mainprecisa necessariamente ter acessopublic, serstatic, no retornar coisa alguma (void) e receber como argumento um array de String (String args[]).

publicstaticvoidmain(Stri ngargs[]){ }

Regra Geral dentro de mtodosstaticsomente possvel acessar outros mtodos e variveis que tambm sejamstatic. Dentro do mtodo pode-se definir qualquer tipo de varivel, static ou no. Caso seja necessrio acessar algum mtodo ou membro no-static, necessrio criar uma instncia da classe e ento chamar o que quiser.

J o contrario um pouco diferente: dentro de membros no-static, possvel acessar tanto propriedadesstaticquanto as nostatic. O fato de ser preciso primeiramente criar uma instncia da classe para s ento chamar algum mtodo nostatic ou acessar uma varivel comum dentro de um mtodostaticdeve-se ao fato que dentro dele no existe uma referncia para o ponteirothis.

O ponteirothis utilizado para referenciar propriedades da classe em que estamos trabalhando.

... //Varivelsimples,paraguardar onome privateStringnome; //Algummtodocomum publicvoidmeuMetodo() { this.nome=Claudemir"; }

No exemplo anterior,this.nome = Claudemir"diz que estamos atribuindo ao membro da classe chamadonomeo valor Claudemir". O uso dethis automtico, portando o exemplo anterior poderia ser escrito simplesmente sem this.

staticnos garante que somente haver uma, e no mais que uma, referncia para determinada varivel ou mtodo disponvel em memria. Em outras palavras, declarando alguma coisa comostatic, todas as instncias da classe iro compartilhar a mesma cpia da varivel ou mtodo. Declarar algo comostatictambm permite voc acessar as coisas diretamente, ou seja, sem precisar criar uma instncia da classe.

//TesteStatic.java classClasse1 { //Variavelstatic publicstaticintcontador=0; //Variavelnao-static publicintoutroContador=0; publicClasse1(){} //Precisaserstaticporque"contador"static publicstaticvoidincrementaContador() { contador++; System.out.println("contadoragora"+c ontador); } publicvoidincrementaOutroContador() { outroContador++; System.out.println("outroContadoragora" +outroContador); } }

publicclassTesteStatic { publicstaticvoidmai n(Stringargs[]) { Classe1c1=new Classe1(); c1.incrementaConta dor(); c1.incrementaOutro Contador(); Classe1c2=newCl asse1(); c2.incrementaConta dor(); c2.incrementaOutro

contadoragora1 outroContadoragora1 contadoragora2 outroContadoragora1 contadoragora3 outroContadoragora1 contadoragora4 outroContadoragora1 Note que a variavel "contador", que static, no teve seu valor zerado a cada novo objeto criado da classeClasse1, mas sim

Acesso direto
Ao contrrio de tipos de dados no-static, qualquer varivel ou mtodostaticpodem ser acessado diretamente, sem necessitar de uma instncia da classe criada:

//TesteStatic2.java classClasse2 { //Escrevealgumafrasenatela publicstaticvoidescreve(String msg) { System.out.println(msg); } //Retornaamultiplicaodedois nmerosint publicstaticintmultiplica(intn 1,intn2) { return(n1*n2); } //Construtor,apenasparamostrar que //elenemchegaserchamado publicClasse2() { System.out.println("Construtor deClasse2"); } }

publicclassTesteStatic2 { publicstaticvoidmain(String args[]) { Classe2.escreve("Multiplican do3vezes3:");intresultado= Classe2.multiplica(3,3); Classe2.escreve("Resultado: "+resultado); } }

Caso os mtodosescreveemultipl icano fossemstatic, seria necessrio fazer a chamada da classe. O cdigo anterior funciona perfeitamente mesmo com os mtodos static.

aplicado da seguinte maneira: Varivel: Uma varivel final no pode ter o seu valor alterado Mtodo: Um mtodo final no pode ser sobrescrito Classe: Uma classe final no pode ser estendida

Declarar e usar classes, mtodos, e variveis Basicamente o modificar final "Finais"

Uma Varivel final no pode ter ser valor alterado. Sendo assim, quando declaramos uma varivel assim: final int var = 10; No podemos alterar seu valor, e caso voc tente alterar ocorrer uma exceo.

class VarFinal{ public static void main(String args[]) { final int idade = 20; System.out.println(idade); idade += 1; // Erro!! } }

Argumento Final
Alm de ser usado em variveis, mtodos e classe o modificador final tambm pode ser utilizado nos argumentos

class ArgFinal { // a declaracao e bem simples public void argumentoFinal (final int idade) { /* do mesmo modo que uma variavel final se tentarmos alterar o seu valor... */ idade += 1; // Erro!! } }

Mtodo Final
O modificador final normalmente utilizado em mtodos importantes para o programa, e que no podem ter o seu comportamento alterado.

class MaeFinal { final void imprimeOi(){ System.out.println("Oi"); } }

class FilhaFinal extends MaeFinal { void imprimeOi() { System.out.println("Oi novo"); } }

Classe Final
As classes marcadas com o modificador final no podem ser herdadas (ter subclasses/classes filhas), sendo assim nenhuma classe pode reaproveitar as funcionalidades dela.

final class MaeFinal { // variaveis e metodos } class FilhaFinal extends MaeFinal { // Erro!! } importante lembrar que uma classe no pode ser marcada como final e abstract ao mesmo tempo, final e abstract so praticamente o oposto, enquanto com final uma classe no

Usar mtodos "Abstratos" e "Interfaces"

Uma classe abstrata uma classe que no pode gerar um objeto. Freqentemente aparece no topo de uma hierarquia de classes no modelo de programao orientada a objetos.

Usamos a palavra chave abstract para impedir que ela possa ser instanciada.

Os mtodos nas classes abstratas que no tm implementao so chamados de mtodos abstratos. Para criar um mtodo abstrato, apenas escreva a assinatura do mtodo sem o corpo e use a palavra-chave abstract.

Quando uma classe estende a classe abstrata, ela obrigada a implementar o mtodo abstrato.

Regra para classe abstrata:


Uma classe abstrata no pode ser instanciada nunca, seu nico propsito ser estendida(subclassificada).

abstract class Carro { public double preco; public String modelo; public Carro(double p, String m) { this.modelo = m; this.preco = p; } public abstract void Preco(float p); public void mostrarMotor(){ System.out.println("V8!");

class MeuCarro extends Carro { public MeuCarro(String c) { super(25, "BMW"); // TODO Auto-generated constructor stub } public void Preco(float p) { super.preco = p; } }

public class TestDriver { public static void main(String[] args) { // TODO Auto-generated method stub MeuCarro gol = new MeuCarro("Vermelho"); gol.modelo = "2011"; gol.preco = 25; System.out.println(gol.modelo); System.out.println(gol.preco); }

Trabalhando com Interfaces


Interface uma espcie de superclasse 100% abstrata que define os mtodos que uma subclasse deve suportar, mas no como esse suporte deve ser implementado. Isso porque ao criar uma interface, estar definindo um contrato com o que a classe pode fazer, sem mencionar nada sobre como o far. Uma interface um contrato. Qualquer tipo de classe (concreta) e de qualquer rvore de herana pode implementar uma interface.

Todos os mtodos em uma interface so implicitamente abstratos (o equivalente utilizar o modificador abstract em uma classe abstrata), e pblicos.

Interfaces no podem ter atributos (ou seja, variveis membro), mas podem, no entanto possuir constantes definidas (variveis que utilizam os modificadores static e final conjuntamente).

publicinterfaceFuncionario{ publicstaticfinalintFUNCIONARI O_GERENTE=0; publicstaticfinalintFUNCIONARI O_VENDEDOR=1 }

Exemplo Ecli

Uma classe pode ainda implementar mais de uma interface, neste caso, elas so colocadas lado a lado, separadas por vrgula juntamente com a clusulaimplements. Quando uma classe implementa uma interface, ela deve obrigatoriamente

Exemplo Ecli

Mdulo 2: "Arrays e Colees"

Capacidade do Array:
Declarar e criar Array; Acessar elementos de um Array; Determinar o nmero de elementos de um Array; Declarar e criar Array multidimensional;

Em Java, e em outras linguagens de programao, pode-se utilizar uma varivel para armazenar e manipular uma lista de dados com maior eficincia. Este tipo de varivel chamado de array.

Um array armazena mltiplos itens de um mesmo tipo de dado em um bloco contnuo de memria, dividindo-o em certa quantidade de posies.

Declarando Array

Array precisa ser declarados como qualquer varivel. Ao declarar um array, defina o tipo de dados deste seguido por colchetes [] e pelo nome que o identifica. Por exemplo: int [] ages; ou colocando os colchetes depois do identificador. Por exemplo: int ages[];

Depois da declarao, precisamos criar o array e especificar seu tamanho. Para se construir um objeto, precisamos utilizar um construtor.

Por exemplo: // declarao int ages[]; // construindo ages = new int[100]; ou, pode ser escrito como: // declarar e construir int ages[] = new int[100];

Em vez de utilizar uma nova linha de instruo para construir um array, tambm possvel automaticamente declarar, construir e adicionar um valor uma nica vez.

boolean results[] ={ true, false, true, false }; double []grades = {100, 90, 80, 75}; String days[] = {"Mon","Tue","Wed","Thu","Fri","Sat"," Sun"};

Uma vez que tenha sido inicializado, o tamanho de um array no pode ser modificado, pois armazenado em um bloco contnuo de memria.

Acessando um elemento do Array

Para acessar um elemento do array, ou parte de um array, utiliza-se um nmero inteiro chamado de ndice. Os nmeros dos ndices so sempre inteiros. Eles comeam com zero e progridem seqencialmente por todas as posies at o fim do array. Lembre-se que os elementos dentro do array possuem ndice de 0 ao tamanho final do Array.

// atribuir 10 ao primeiro elemento do array ages[0] = 10; // imprimir o ltimo elemento do array System.out.print(ages[99]);

O cdigo abaixo utiliza uma declarao for para mostrar todos os elementos de um array. public class ArraySample { public static void main(String[] args) { int[] ages = new int[100]; for (int i = 0; i < 100; i++) { System.out.print(ages[i]); } } }

Para se obter o nmero de elementos de um array, pode-se utilizar o atributo length. O atributo length de um array retorna seu tamanho, ou seja, a quantidade de elementos. utilizado como no cdigo abaixo: nomeArray.length

public class ArraySample { public static void main (String[] args) { int[] ages = new int[100]; for (int i = 0; i < ages.length; i++) { System.out.print(ages[i]); } } }

Arrays Multidimensionais

Arrays multidimensionais so implementados como arrays dentro de arrays. So declarados ao atribuir um novo conjunto de colchetes depois do nome do array.

// array inteiro de 512 x 128 elementos int [][] twoD = new int[512][128]; // array de caracteres de 8 x 16 x 24 char [][][] threeD = new char[8] [16][24]; // array de String de 4 linhas x 2 colunas String [][] dogs = {{"terry", "brown"}, {"Kristin", "white"}, {"toby", "gray"}, {"fido", "black"}};

System.out.print(dogs[0][0]); Isso mostrar a String "terry" na sada padro. Caso queira mostrar todos os elementos deste array, escreve-se: for (int i = 0; i < dogs.length; i++) { for (int j = 0; j < dogs[i].length; j++) { System.out.print(dogs[i][j] + " "); } }

Exerccios Criar um array de Strings inicializado com os nomes dos sete dias da semana. Por exemplo: String days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday,"Sunday"}; Usando uma declarao while, imprima todo o contedo do array. Faa o mesmo para as declaraes dowhile e for.

Dado o seguinte array multidimensional, que contm as entradas da agenda telefnica: String entry = {{"Florence", "7351234", "Manila"}, {"Joyce", "9833333", "Quezon City"},{"Becca", "4563322", "Manila"}}; mostre-as conforme o formato abaixo: Name : Florence Tel. # : 735-1234 Address: Manila

Colees

Listas: java.util.List

Um primeiro recurso que a API de Collections traz so listas. Uma lista uma coleo que permite elementos duplicados e mantm uma ordenao especfica entre os elementos.

A implementao mais utilizada da interface List a ArrayList, que trabalha com um array interno para gerar uma lista.

Para criar um ArrayList, chamar o construtor:

basta

ArrayList<String> lista = new ArrayList<String>(); sempre possvel abstrair a lista a partir da interface List: List<String> lista = new ArrayList<String>();

A interface List possui dois mtodos add, um que recebe o objeto a ser inserido e o coloca no final da lista. lista.add(Maria);

Para saber quantos elementos h na lista, podemos usar o mtodo size(): System.out.println(lista.size( ));

H ainda um mtodo get(int) que recebe como argumento o ndice do elemento que se quer recuperar. Atravs dele, podemos fazer um for para iterar na lista de contas: for (int i = 0; i < lista.size(); i++) { System.out.println(lista.get(i)); }

H ainda outros mtodos como remove() que recebe um objeto que se deseja remover da lista; e contains(), que recebe um objeto como argumento e devolve true ou false, indicando se o elemento est ou no na lista. lista.remove(maria); lista.contains(maria);

A classe Collections traz um mtodo esttico sort que recebe um List como argumento e o ordena por ordem crescente. import java.util.Collections;
Collections.sort(lista);

Outros mtodos da classe Collections

A classe Collections traz uma grande quantidade de mtodos estticos teis na manipulao de colees. binarySearch(List, Object): Realiza uma busca binria por determinado elemento na lista ordenada e retorna sua posio ou um nmero negativo, caso no encontrado. max(Collection): Retorna o maior elemento da coleo. min(Collection): Retorna o menor elemento da coleo. reverse(List): Inverte a lista.

import java.util.Set;

Um conjunto (Set) funciona de forma anloga aos conjuntos da matemtica, ele uma coleo que no permite elementos duplicados e no armazena ordem.

Um conjunto representado pela interface Set e tem como suas principais implementaes a classe HashSet. Existindo tambem o LinkedHashSet. Eu serve para ordenar da forma que foi inserido. import java.util.HashSet; import java.util.LinkedHashSet;

cargos.add("Gerente"); cargos.add("Diretor"); cargos.add("Presidente"); cargos.add("Secretria"); cargos.add("Funcionrio"); cargos.add("Diretor"); System.out.println(cargos);

Percorrendo colees

for (String palavra : cargos) { System.out.println(palavra); }

No eclipse, voc pode escrever foreach e dar ctrl+espao, que ele vai gerar o esqueleto desse enhanced for! Muito til!

Iterando sobre colees com: Import java.util.Iterator

Conhece internamente a coleo e d acesso a todos os seus elementos.

A interface Iterator possui dois mtodos principais: hasNext() (com retorno booleano), indica se ainda existe um elemento a ser percorrido; next(), retorna o prximo objeto.

Iterator<String> i = cargos.iterator(); while (i.hasNext()) { String palavra = i.next(); System.out.println(palavra); }

Excees

Uma exceo um evento que interrompe o fluxo normal de processamento de uma classe. Este evento um erro de algum tipo.

Para tratar excees em Java utilizamos a declarao trycatch-finally. O que devemos fazer para proteger as instrues passveis de gerar uma exceo, inser-las dentro deste bloco.

A forma geral de um try-catch-finally : try{ // escreva as instrues passveis de gerar uma exceo // neste bloco } catch (<exceptionType1> <varName1>){ // escreva a ao que o seu programa far caso ocorra // uma exceo de um determinado }... } catch (<exceptionTypen>

Excees geradas durante a execuo do bloco try podem ser detectadas e tratadas num bloco catch. O cdigo no bloco finally sempre executado, ocorrendo ou no a exceo.

A seguir so mostrados os principais aspectos da sintaxe da construo de um try-catchfinally: A notao de bloco obrigatria. Para cada bloco try, pode haver um ou mais blocos catch, mas somente um bloco finally. Um bloco try deve que ser seguido de PELO MENOS um bloco catch OU um bloco finally, ou ambos. Cada bloco catch define o tratamento de uma exceo.

Exemplos de excees j definidas no pacote java.lang: ArithmeticException: indica situaes de erros em processamento aritmtico, tal como uma diviso inteira por 0. A diviso de um valor real por 0 no gera uma exceo (o resultado o valor infinito). NumberFormatException: indica que tentou-se a converso de uma string para um formato numrico, mas seu contedo no representava adequadamente um nmero para aquele formato. uma subclasse de IllegalArgumentException; IndexOutOfBounds: indica a tentativa de acesso a um elemento de um agregado aqum ou alm dos limites vlidos. a superclasse de ArrayIndexOutOfBoundsException, para arranjos, e de StringIndexOutOfBounds, para strings. NullPointerException: indica que a aplicao tentou usar uma referncia a um objeto que no foi ainda definida. ClassNotFoundException: indica que a mquina virtual Java tentou carregar uma classe mas no foi possvel encontr-la durante a execuo da aplicao.

try{ int[] vet = new int[4]; int x = 10; String str = JOptionPane.showInputDialog("Digite o numero"); int y = Integer.parseInt(str); int result = x/y; vet[result] = result; } catch(NumberFormatException e){ System.out.println("Exceo de formatao do nmero"); }

Pacote java.io Colees API

As classes abstratas InputStream e OutputStream definem, respectivamente, o comportamento padro dos fluxos em Java: em um fluxo de entrada, possvel ler bytes e, no fluxo de sada, escrever bytes.

InputStream, InputStreamReader e BufferedReader

Para ler um byte de um arquivo, vamos usar o leitor de arquivo, o FileInputStream. Para um FileInputStream conseguir ler um byte, ele precisa saber de onde ele dever ler. Essa informao to importante que quem escreveu essa classe obriga voc a passar o nome do arquivo pelo construtor: sem isso o objeto no pode ser construdo. import java.io.FileInputStream; import java.io.InputStream;

class TestaEntrada { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("arquivo.txt"); int b = is.read(); } }

A classe InputStream abstrata e FileInputStream uma de suas filhas concretas. FileInputStream vai procurar o arquivo no diretrio em que a JVM fora invocada (no caso do Eclipse, vai ser a partir de dentro do diretrio do projeto). Alternativamente voc pode usar um caminho absoluto.

Quando trabalhamos com java.io, diversos mtodos lanam IOException, que uma exception do tipo checked o que nos obriga a trat-la ou declarla. throws IOException

Para recuperar um caractere, precisamos traduzir os bytes com o encoding dado para o respectivo cdigo unicode, isso pode usar um ou mais bytes. Escrever esse decodificador muito complicado, quem faz isso por voc a classe InputStreamReader.

class TestaEntrada { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("arquivo.txt"); InputStreamReader isr = new InputStreamReader(is); int c = isr.read(); } }

Apesar da classe abstrata Reader j ajudar no trabalho de manipulao de caracteres, ainda seria difcil pegar uma String. A classe BufferedReader um Reader que recebe outro Reader pelo construtor e concatena os diversos chars para formar uma String atravs do mtodo readLine:

class TestaEntrada { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("arquivo.txt"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String s = br.readLine(); } }

Aqui, lemos apenas a primeira linha do arquivo. O mtodo readLine devolve a linha que foi lida e muda o cursor para a prxima linha. Caso ele chegue ao fim do Reader (no nosso caso, fim do arquivo), ele vai devolver null. Ento, com um simples lao, podemos ler o arquivo por inteiro:

class TestaEntrada { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("arquivo.txt"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String s = br.readLine(); // primeira linha while (s != null) { System.out.println(s);