Escolar Documentos
Profissional Documentos
Cultura Documentos
POO - Java
Paradigmas de programao
Mquina Procedural
Estruturada
C, Pastal, Clipper
Orientada a objetos
Classes e Objetos
Classe
O que ? Para que serve ? Como se define ?
Objeto
O que ? Semelhanas e diferenas entre objetos de uma mesma classe
Propriedades do Lpis
Cor da pintura externa Tipo de seo (Cilndrico, hexagonal, pentagonal etc) Tipo do material do corpo do lpis (Madeira, plstico, cera, papel etc) Cor do material que escreve Tipo de material que escreve Cdigo de maciez do material que escreve. Comprimento quando novo Dimetro externo Tem borracha ou no
Funcionalidades do Lpis
A Classe Lapiseira
A Hierarquia da Vida
Seres Vivos
Animais
Vertebrados
Mamferos
Primatas
Homens
Alguns mtodos:
Principais Caractersticas da OO
Classes Herana
Simples Mltipla
Polimorfismo Encapsulamento
Sobrecarga Reusabilidade
Porque Java ?
Os projetistas de software relutavam em adotar POO por acharem muito complexa. Faltava um ambiente realmente multiplataforma A principal opo OO era C++. Contudo os bons programadores de C++ no so fceis de encontrar e erros de programao em C++ so difceis de localizar e de curar.
As tecnologias desenvolvidas para WEB so uma verdadeira torre de babel. A dificuldade de documentao era um srio problema
Programao Multicamadas
Web Console Banco de Dados Relacional Banco de Dados OO Serializao e persistncia de objetos
Camada de Persistncia
Java mais simples e mais seguro que C++. Java, ao contrrio de C++, no permite uma linha
A Tecnologia Java
Um pouco de histria
Em 1991 um grupo de projeto da Sun, pesquisava formas de desenvolver uma nova gerao de computadores portteis.
A equipe liderada por James Gosling, inicialmente utilizou C++, decidiu que seria necessrio criar uma nova linguagem de programao. Assim, em 1990, Gosling projetou a linguagem Oak (carvalho em ingls) Em 1993 surge oportunidade de aplicao da nova linguagem em uma concorrncia de TV interativa. A SGI vence concorrncia e assume projeto. Em 1994 a Sun assume o projeto (SGI quebrou) e batiza a linguagem de Java Em maio de 1995 o navegador, rebatizado como HotJava, e a linguagem Java foram formalmente apresentadas pela Sun no SunWorld95. Ainda em 1996, a Sun de forma indita, disponibiliza gratuitamente o JDK 1.02 (Kit de Desenvolvimento Java) para as plataformas
Typedefs, Includes, Defines; Estruturas e Unies; Enums (a partir da verso 2.5 passou a existir); Funes independentes; Herana mltipla; Goto; Sobrecarga de operadores; Ajuste automtico de tipos;
Java 100% Orientada a Objeto So de ciclo de desenvolvimento rpido (tecnologia interpretada); So portveis (o mximo possvel) para mltiplas plataformas; So seguras e robustas (a Java Runtime Enviroment gerencia a memria); Suportam multi threading nas aplicaes grficas; So adaptveis mudana de ambiente (realizam dinamicamente carga de mdulos remotos); So seguras (JRE , Java Runtime Enviroment, possui mecanismos
Ambientes de Instalao/Configurao;
J2ME (Mobile/Wireless);
Java Card;
Portabilidade
m g aa eom u r .v Paj r a
m g as eom s u r .a Pac r l
Ci d ol o mr p a
Itreo n ra e td p r
Portabilidade
O Compilador
Os arquivos fontes .java so compilados pelo comando javac e convertidos em bytecodes em arquivos .class. Em tempo de execuo o programa Java carregado, checado e executado com o intermdio de um interpretador.
O Interpretador
O interpretador executa os bytecodes enviando os comandos interpretados para o hardware. A Sun denomina este ambiente como JRE Java Runtime Enviroment, responsvel em fornecer as APIs Java, a JVM (Java Virtual Machine) e outros componentes necessrios para rodar applets e aplicaes escritas em Java.
O Class Loader
Tem o propsito de carregar todas as classes necessrias para a execuo do programa, mantm as classes locais em namespaces separados dos arquivos carregados remotamente, limitando assim a ao de trojans (vrus de emails) .
Previne os programas de spoofing, uma vez que o layout de memria do arquivo executvel determinado somente aps o carregamento de todas as classes, ou seja, esse trabalho feito em tempo de execuo, protegendo o acesso no autorizado s reas restritas de cdigo na memria.
O Bytecode Verifer
O cdigo adere especificao da JVM (Java Virtual Machine); O cdigo no viola a integridade do sistema; O cdigo no causa stacks overflows ou underflows; Os tipos de parmetros para todos os cdigos operacionais esto corretos; No h converses ilegais de cdigo.
A Virtual Machine
A mquina virtual age como um intermediador entre o hardware e o programa Java. Um programa Java no acessa diretamente os dispositivos de entrada e sada, o sistema de arquivos ou mesmo a memria do computador. Em vez disso, ele pede que a Mquina Virtual o faa.
Para o desenvolvimento de aplicaes simples em Java, precisamos apenas de um JDK (Java Software Developers Kit) da verso Standard Edition e um editor de texto ASCII. O JDK e a documentao de suas bibliotecas podem ser baixadas diretamente do site as
O JDK possui o compilador Java javac, JVM java, um visualizador de applets appletviewer, as bibliotecas de desenvolvimento os pacotes java, um programa para documentao javadoc, um depurador jdb e uma verso do ambiente de excuo jre.
Expresses
Variveis Operadores Literais
As propriedades podem ser variveis Java, objetos de alguma outra classe e arrays de variveis ou objetos; Declaramos propriedades dentro do corpo da classe. As declaraes seguem as mesmas regras das variveis;
Em Java, quando declaramos uma propriedade mas no inicializamos, elas sero inicializadas automaticamente com zero ou vazio se forem tipo String;
Podemos declarar uma propriedade constante. Para tal usamos o qualificador final; Exemplos: static private int valor; public double a = 4; private long valor = 45; private String nome = Maria;
Os mtodos so os executores do servio. O conceito do mtodo ser uma derivao da idia das funes de C/C++. Formalmente funcionam como funes, recebendo argumentos, processando e retornando valores. As principais diferenas entre funes e mtodos que estes devem ser chamados sempre associados ao objeto a quem pertence e podem compartilhar propriedades com outros mtodos da mesma classe.
Declaraes
Podemos declarar variveis e objetos internamente aos mtodos. Como nas funes estas variveis no podem ser usadas fora do corpo do mtodo onde foram declaradas. No caso de variveis e/ou objetos internos ao mtodo no podemos usar alguns dos qualificadores como static, private e public. Exemplos: int a = 12; double x = 3.88; long valor; final double pi = 3.1415926535; boolean existe;
Expresses
As expresses em Java sempre retornam um valor. O valor retornado ter o tipo da varivel ou literal mais complexo encontrado na expresso. O operador cast, se usado, pode modificar o tipo do retorno na expresso.
Exemplos:
Textual: char
Lgico: boolean
Integral: byte, short, int, e long Ponto Flutuante: double e float
float
char short long double
32
16 16 64 64
Textual
Para quem conhece C/C++, podemos notar algumas diferenas. Por exemplo, o tipo char foi substitudo pelo tipo primitivo byte. O tipo char continua sendo um inteiro, mas sem sinal e agora com 16 bits, ou seja, em uma faixa de 0 a 216 -1. (0 ~ 65535)
Lgico (Booleano)
O tipo lgico boolean s capaz de assumir os valores literais true e false. No existe nenhuma outra relao de valores aceitveis, ou seja, falso e verdadeiro no podem ser representados por zero e valores diferentes de zero, como em C/C++.
Integrais (Inteiros)
Os quatro tipos de dados inteiros ou integrais so nmeros internamente representados em complemento de dois, armazenando valores dentro dos seguintes intervalos:
at
Ponto flutuante
Esses tipos esto em conformidade com a especificao IEEE 754 (Institute of Electrical and Electronic Engineers, 1985).
Para as expresses que no tem representao em nmeros (infinito, por exemplo), Java tem duas classes, Float e Double onde se definiu as constantes:
Float.NaN Float.NEGATIVE_INFINITY Float.POSITIVE_INFINITY Double.NaN Double.NEGATIVE_INFINITY Double.POSITIVE_INFINITY Obs: NaN significa: Not a Number.
Literais
Literais so partes constantes das expresses. Eles podem ser atribudos a variveis de tipo primitivo e strings ou podem aparecer em chamadas de mtodos como argumentos.
varivel = literal;
Literais boolean
Os nicos literais que podem ser atribudos ao tipo boolean so true e false. boolean verdadeiro = true; boolean falso = false; Como em VB e C++. Java no aceita zero para falso e diferente de zero para verdadeiro...
Literais char
Podemos representar um literal char entre aspas simples ou pelo seu valor Unicode.
A ( \ ou Esc) combinada com um caractere convencionado utilizada para representar um caractere sem representao visual. Abaixo alguns exemplos:
\n \r \t \b \f \ \ \\
Pula linha Retorno do carro Tabulao Retrocesso Avano de pgina Aspas simples Aspas duplas Barra invertida
Podemos expressar os literais integrais em decimal, octal ou hexadecimal. Veja alguns exemplos que representam o decimal 46: 46 (Decimal default Inteiro) 056 (Octal Literal com prefixo 0 (Muito cuidado !!!)) 0x2E (Hexadecimal Literal com prefixo 0x) 0X2e (Hexadecimal Literal com prefixo 0X ( indiferente usar X ou x)) Por default, literais integrais representam valores de 32 bits, caso queiramos indicar um literal integral 64 bits, temos de anexar o sufixo L maisculo ou minsculo expresso. Evitamos o L minsculo por ser facilmente confundido com o caracter 1 (um).
Para expressar um nmero de ponto flutuante um literal deve ter um ponto decimal ou a letra e, indicando conotao cientfica ou o sufixo f ou d, indicando respectivamente um literal float ou double. As letras e, f e d podem ser maisculas ou minsculas. O default de um literal de ponto flutuante sem sufixo double.
Literais String
Um Literal String pode ser definido como uma seqncia de caracteres entre aspas duplas.
Exemplo:
Ns abordaremos as Strings com mais detalhes nos textos sobre os pacotes java.lang e java.util. Os literais string so cadeias de caracteres armazenadas em memria e terminadas com o caracter '\0' (Zero de 16 bits sem sinal Literal char)
Exerccios...
Que declaraes so vlidas?
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. int i = 10; long k = 34; int a = 0L; float x = 12.7; char s = "h"; char d = '9'; double f = d; int mdia = 10; byte y = 'a' + 'b'; char proxima = 'a' + 1; String nome = 'Pedro pedreiro'; String z = "9800.99"; boolean st1 = 1; boolean st2 = false;
Palavras reservadas
Como as demais linguagens, o Java possui algumas palavras reservadas a sua sintaxe. Vamos a elas
const continue default do double else extends false final finally float for future generic goto if implements import inner instanceof int interface long native new null operator outer package private protecte d public rest return short static strictfp super switch synchronized this throw throws transient true try var void volatil e while
As palavras sublinhadas, apesar de reservadas, no so Java. Nenhuma delas pode ser usada para identificar classes, variveis, mtodos ou rtulos.
Variveis (locais)
Variveis so nomes/identificadores que endeream posies de memria onde se armazenam valores dos tipos descritos nas declaraes.
Declarando variveis
Para declararmos uma varivel temos de associar obrigatoriamente o tipo, o nome e opcionalmente um valor de inicializao.
Exemplos:
int meuInt; int meuInt1, meuInt2, meuInt3; int meuInt1 = 10, meuInt2; long valor = 234L; final double pi=3.1415926535;
Uma varivel membro (propriedade) instanciada e destruda nos mesmos tempos do objeto onde ela foi declarada. J uma varivel automtica (ou local a um mtodo), s existe durante a execuo do mtodo onde ela foi declarada.
Exemplo:
public class Escopo { private int x = 1; // Varivel Membro da classe public void primeiroMetodo() { int x=7, y=5; // Variveis Locais ao mtodo this.x = x + y; System.out.println(Varivel local x: + x); System.out.println(Varivel membro x: + this.x); segundoMetodo(10); } } // (Continua)
Exerccios...
Considere o programa abaixo... O que sai na tela?
public class Exercicio { private static int valor = 10; public static void main (String args[]){ int valor = 20; System.out.println("O dobro do total vale: " + 2*valor); metodoDobro(); metodoDobro(5); } public static void metodoDobro() { System.out.println("O dobro do total vale: " + 2*valor); } public static void metodoDobro(int valor) { System.out.println("O dobro do total vale: " + 2*valor); }
As variveis membros que no so inicializadas recebem automaticamente um valor inicial, semelhante aos elementos de um array.
byte 0 int 0 float 0.0f char \u0000 object reference null short 0 long 0L double 0d boolean false
As variveis locais aos mtodos NO so inicializadas automaticamente. Caso voc tente utilizar uma varivel local antes de sua inicializao, Java ir gerar uma mensagem de erro de compilao. A inicializao de variveis locais ou automticas uma
Vetores (Arrays)
Um vetor uma estrutura, com posies de armazenamento associadas a um nmero (ndice) que podem conter qualquer tipo de dado. Todos os elementos de um array so do mesmo tipo..
int inteiro []; // Array de tipo primitivo double bidim [][]; // Array bidimensional (Matriz)
int [] inteiro; // Array de tipo primitivo double [][] bidim; // Array bidimensional
int meuArrayInt[]; // Declarando ao compilador meuArrayInt = new int[10]; //Alocando em tempo de execuo int len = 10; int meuArrayInt[]; meuArrayInt = new int[len]; //Definindo o tamanho varivel int[] meuArrayInt = new int[10];//Os passos anteriores em uma // nica linha... int meuArrayInt[] = {0, 1, 9, 3, 3, 5, 1, 7, 8, 19};
Manipulando vetores
Arrays que armazenam objetos aps a alocao com new devem ter cada objeto armazenado devidamente instanciado ou podemos receber a exceo NullPointerException ao tentar acess-lo. Um erro comum tentar acessar o contedo de um array alm do seu limite de posies, como exemplo, tentar acessar a dcima primeira posio no meuArrayInt[]. Caso faamos isso a exceo ArrayOutOfBoundsException ser lanada.
public class MeuArrayTeste {
public static void main(String args[]){ int meuArrayInt[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; for (int i = 0; i < meuArrayInt.length; i++){ } } System.out.println(Valor: + meuArrayInt[i]); }
Exerccios..
No trecho de cdigo abaixo, o que est errado? O que vai sair na tela? String nomes[] = { "Maria", "jos", "Pedro"}; System.out.println(nomes[1]); System.out.println(nomes[2]); System.out.println(nomes[3]); char val [] = new char[100];
val[val.length] = 100;
char mat[][] = { {'J','A','V','A'}, {'S','A','N','T','O','S'}, {'C','A','V','A','L','O'}, {'P','A','T','A'}, }; System.out.println(""+mat[0][0]+mat[1][1]+ mat[2][2]+mat[3][3]);
Operadores Java
Os operadores Java so muito semelhantes aos existentes em C e C++, podemos dizer que os operadores de atribuio, aritmticos, compactos, lgicos e relacionais so idnticos e tm a mesma utilizao. um fantstico e poderoso set se operadores a disposio do programador.
* Multiplicao
/ Diviso
Os operadores de atribuio
Os tipos primitivos possuem sua representao na memria de maneira conhecida, ou seja, o tipo primitivo byte seria representado pelos 8 bits:
byte a = 9;
E um objeto? Como armazenado? Vamos pegar a linha abaixo da nossa classe TestaEscopo: Escopo teste = new Escopo();
Atribuindo primitivos
Java, utiliza o sinal de igualdade para a atribuio. O sinal = combinado a outros 11 operadores aritmticos formam 12 diferentes maneiras de atribuirmos valores em Java.
Atribuindo Inteiros
int a = 9; int b = a + 3; int c = a + b; a += c;
byte x = (byte) 9;
O 9 um literal do tipo int de 32 bits, lembra? Mas como o seu valor pode ser comportado em uma varivel do tipo byte, o compilador realiza a tarefa de converso para voc.
simples, temos de lembrar sempre da seguinte regra: Qualquer operao que envolva um tipo int, short, char ou byte, sempre resultar em um int. Na expresso acima, a soma do byte x com byte y resulta em um int e como sabemos no podemos atribuir um int de 32 bits a um byte de 8 bits. Para tanto, temos de fazer o seguinte cast:
Um literal de ponto flutuante sem sufixo implicitamente um double de 64 bits. Se voc tentar:
O compilador considera que voc est atribuindo um valor de 64 bits a um espao que comporta apenas 32 e no permitir essa atribuio sem a utilizao do sufixo f ou F.
Comparando atribuies...
Observe o seguinte cdigo:
int x = 9;
int x2 = x;
Comparando atribuies...
Fazendo:
d2 = new MinhaData(1,7,2007);
Mas, se fizermos:
teste2 = teste2 + va; // Teremos em teste2 a palavra Java
A varivel teste2 vai armazenar Java e a varivel teste? Ser que virou Java tambm?
Um novo objeto String ser criado na memria e a referncia ser associada a varivel teste2, deixando teste inalterada (como voc esperava!).
Operadores lgicos
Menor que Menor ou igual a Maior que Maior ou igual que Diferente de Igual a
And lgico palavra a palavra. Usado para conectar duas expresses lgicas: Verdadeiro apenas se ambas as expresses forem verdadeiras. Exemplos:
int a = 10, b = 5, c = 5; System.out.println (a > b && c >= b); // V && V => V Imprime: true System.out.println (a > b && a == b && (a * 3) > 6); // V && F && V Imprime: false
Or lgico palavra a palavra. Usado para conectar duas expresses lgicas: Verdadeiro se apenas uma das expresses for verdadeira.
Exemplos:
int a = 10, b = 5, c = 5; System.out.println(a>b || c<b); // V | | F => V Imprime: true System.out.println(a > b || a == b || (a*3) > 6 ); // V | | F | | V => V Imprime: true
Verifique o cdigo abaixo. public class NegBoo { public static void main( String args[] ) { boolean teste = true; System.out.println(!teste); //Imprime: false System.out.println( teste); //Imprime: true } }
Em uma expresso lgica mltipla, muitas vezes podemos adiantar o resultado da expresso antes mesmo que esta chegue ao fim. Quando este fato ocorre, dizemos que ocorreu curto circuito e o Java no prossegue com as comparaes j que conhece o resultado final da expresso.
Exemplos:
Este conceito pode ser usado para evitar eventuais erros em tempo de execuo. Veja o exemplo: public class TesteCurtoCircuito { public static void main (String [] args) { Horista Fun1 = new Horista ( 15.85,"Jose","Silva"); Mensalista Fun2 = new Mensalista (4578.55,"Adam","Smith"); Funcionario Fun; if (args[0] == "H") Fun = Fun1; else if (args[0] == "M") Fun = Fun2; else Fun = null;
}
}
Aumentam ou diminuem uma varivel em uma unidade, o importante que podemos fazer isso antes ou depois de utiliz-la. Analise o seguinte cdigo: String args[] ) { // // // // // // // Imprime 9 Imprime 9 depois incrementa O que sai aqui? Decrementa e imprime 9 E aqui? Imprime 10 e decrementa Imprime 9
public class IncDec { public static void main( int x = 9; System.out.println( x ); System.out.println(x++); System.out.println( x ); System.out.println(--x); System.out.println(++x); System.out.println(x--); System.out.println( x ); } }
Os operadores bit a bit & | ^ ~ << sinal); >> sinal); >>> E lgico (AND); Ou lgico (OR); Or exclusivo (XOR); Not bit a bit (complemento); Rotao esquerda (mantm o
Resultado: 0xA5A0
O OR bit a bit ( | )
Os bits so operados com | um a um: Exemplo:
Resultado: 0xF5FF
So operadores que permitem deslocar os bits para esquerda ou direita o nmero de vezes que for necessrio; Existem trs operadores de deslocamento:
<< - Shift para esquerda preservando o sinal >>> - Shift para direita todos os bits
Nota: O sinal de um nmero inteiro sempre representado por seu bit mais significativo (o
Exemplo:
short a = 0x6AF4; a << 2; Este bit vai morrer! 0110 1010 1111 0100 00 1010 1011 1101 0000
Resultado: 0xABD0
Deslocamento a direita
Exemplo:
Resultado: 0x1ABD
E se o valor de a fosse mpar?
Por exemplo: ~ 0000 0000 0000 0000 0000 0000 0000 1010 Resulta: 1111 1111 1111 1111 1111 1111 1111 0101
public class InvBit { public static void main( String args[] ) { int x = 10; System.out.println( x } } ); // Imprime 10 System.out.println( ~x ); // Imprime -11 (?)
Expresses reduzidas
a+=10; a-=10; a*=10; a/=10; a<<=10; a>>=10; a^=10; a&=10; a|=10; a%=10;
Equivale a:
a=a+10; a=a-10; a=a*10; a=a/10; a=a<<10; a=a>>10; a=a^10; a=a&10; a=a|10; a=a%10;
O operador ternrio ? :
exp1
? exp2 : exp3
Exemplos:
? aprovado : reprovado );
O operador cast
Podemos dizer que em Java temos duas formas de converso, as implcitas e as explcitas. Vamos analisar o cdigo abaixo:
public class Conversao{ public static void main( String args[] ) { double x = 0.0; int y = 1; x = y; // Converso implcita, atribumos um int para um double System.out.println ( x ); y = (int) x; // Converso explcita, informamos ao compilador que System.out.println ( y ); // o valor double x ser comportado // sem problemas no int y } } Imprime:
1.0 1
Exerccios..
Considere que... short a=10, b=20; O que sai na tela em cada caso?
System.out.println(a > b?"a":"b"+" maior!"); System.out.println("Novo valor de a: " + (a+=b)); System.out.println(""+ (a & 0x0005)); System.out.println(""+ (a | 0x0005)); System.out.println(""+ (~a & a)); System.out.println(""+ (a >>> b)); System.out.println(""+ (a <<= 1)); System.out.println(""+ (a <<= 1));
Instrues de Java
As instrues de Java so poucas e a maioria idnticas de C/C++. Condicionais: if /else e switch/break Controle de Lao: for, for each, while e do while
return
Instruo if/else
Desvia o fluxo de execuo de um programa de acordo com o retorno de uma expresso booleana. Os ifs podem ser encadeados indefinidamente.
Exemplos:
if (a > b) max = a; else max = b;
if (altura >= 1.75) resultado = alto; else if (altura < 1.65) resultado = baixo; else resultado = mdio;
Instruo switch
Usamos o switch para substituir uma seqncia de ifs desde que obedeam algumas condies.
Exemplo:
char op = 'S'; switch (op) { case 'S': case 's':System.out.println("Opo selecionada = 's' ou 'S'"); break; case 'N': case 'n':System.out.println("Opo selecionada = 'n' ou 'N'"); break; default : System.out.println("Digite apenas 'S' ou 'N'"); } Imprime: Opo selecionada = 's' ou 'S'
Instruo for
Possibilita o controle de laos de repetio (loops). Testa a condio antes de executar o bloco.
Sintaxe:
for (Exp1 ; Exp2 ; Exp3) { <Comandos> }
Exp1 uma expresso que executada antes de iniciar o loop propriamente dito. Normalmente usamos a Exp1 para criar e/ou inicializar a varivel de controle. Exp2 a expresso responsvel pelo controle do nmero de repeties. Em Java, Exp2 sempre uma expresso booleana. Enquanto o retorno de Exp2 for verdadeiro o lao no termina. Exp3 s executada no final do loop. Normalmente usamos esta expresso para modificar o contedo da varivel de controle.
Caso seja usado o recurso de declarar uma ou mais variveis na Exp1 do for, estas variveis sero locais ao lao for.
Exemplo: public class TesteEscopoFor { public static int i = 10; public static void main (String args[]) { for (int i = 1, j = 5; i < 3; i++, j--) { System.out.println ("Valor interno de i: " + i ); System.out.println ("Valor interno de j: " + j ); } System.out.println ("Valor externo de i: " + i ); // System.out.println ("Valor externo de j: " + j ); // No compila }
Exemplo: public class TesteForEach { public static void main (String args[]) { String semana[]={"Dom","Seg","Ter","Qua","Qui","Sex","Sb"} ; for(String dia: semana) System.out.printf("%s,",dia); } }
Imprime:
Dom,Seg,Ter,Qua,Qui,Sex,Sb,
Instruo while
while ( <Exp> ) { <comandos> }
Exp uma expresso booleana. O lao while executado enquanto o resultado da expresso Exp retornar true;
Notas:
Usamos o lao while quando necessrio testar uma condio antes de executar alguma instruo. As chaves so necessrias apenas se existirem mais
Instruo do/while
do { <comandos> } while ( <Exp> );
Exemplo:
Exemplo:
double soma = 0F; int interacoes = 0;
while (interacoes < 10000) { soma += Math.random( ); interacoes++; if (soma > 1000) break; //Aborta o lao caso soma
ultrapasse 1000
Imprime:
Instruo continue
Exemplo: int soma = 0; int interacoes = 0; while (soma < 1000) { int denominador = (int)(Math.random()*100.0)50; if (denominador == 0) continue; soma += (50 / denominador); interacoes++; } System.out.println("Interaes: " + interacoes); Imprime: Interaes: 3463 Finished executing
Evitando o break...
Exemplo:
Evitando o continue...
Exemplo: int soma = 0; int interacoes = 0; while (soma < 1000) { int denominador = (int)(Math.random()*100.0)-50; if (denominador != 0) { soma += (50 / denominador); interacoes++; } } System.out.println("Interaes: " + interacoes); Imprime: Interaes: 3463 Finished executing
i_laco: for (int i=0 ; i < 10 ; i++) { for (int j=0 ; j < 10 ; j++) { if (Math.random() > 0.5) continue i_laco; System.out.println("Valor de i: "+i+" Valor de j: "+j); } }
Instruo return
Exemplos: public double getSalario( ) { return this.salario; } public String getNomeCompleto( ) { return this.nome + " " + this.sobrenome; } public double getSalario( ) { if (this.salario > 10 * this.salarioMinimo) return this.salario * 0.95; else return this.salario; // return salario * 0.80; // Esta linha jamais seria executada }
Classes empacotadoras
(wrappers)
Classes que emulam os tipos primitivos:
Exerccios...
1.
2.
Fazer um programa que calcula e mostra na tela a soma de todos os nmeros pares, mas no mltiplos de 3, existentes no intervalo (inclusive) entre 100 e 1000. Altere o programa acima, escrevendo um mtodo que recebe como argumento os limites do intervalo e retorna a soma. Caso o intervalo recebido seja invlido, retorne -1 e trate isso no exerccio.
Assinatura:
int somaIntervalo(final int _ini, final int _fim);
Finalmente !!!!!
Programando em Java
Na programao em Java voc pode:
Criar novas classes; Estender novas classes (sub) de classes (super) j existentes; Criar programas manuseando objetos criados a partir de classes que voc criou, estendeu ou que j existiam.
Ateno:
O Mtodo Construtor
Os construtores so mtodos especiais usados para ajudar a construir o objeto no momento de sua criao. Os mtodos construtores so usados principalmente para inicializar as propriedades.
O mtodo construtor no retorna nada (nem mesmo void!). O mtodo construtor tem o mesmo nome da classe.
public float getArea() { return this.lado * this.lado; public float getPerimetro() { return 4F * this.lado;
Mtodos finalizadores
Usamos o mtodo finalizador para realizar tarefas do tipo: Fechar arquivos, liberar canais, desbloquear tabelas etc. O mtodo finalizador roda imediatamente antes do momento em que o objeto eliminado da memria pelo coletor de lixo. Como no sabemos o momento exato que o coletor de lixo o far, normalmente tambm no podemos precisar o momento que o mtodo finalize ser executado. possvel forar a execuo do finalize, chamando o mtodo System.gc() logo depois de destruir a referncia ao objeto.
Exemplo de finalize
public class TesteQuadrado { public static void main (String args[]) { Quadrado q = new Quadrado(10); System.out.println("rea do quadrado: + q.getArea()); System.out.println("Diagonal: " + q.getDiagonal()); q = null; System.gc(); } } Imprime: rea do quadrado: 100.0 Diagonal: 14.142135623730951 Fim do quadrado... Finished executing Nota: O mtodo finalize() foi escrito dentro da definio da superclasse QuadradoBase (3 slides atrs)
Finalize (continuao)
O momento em finalize realmente executado desconhecido. Sabemos que o finalize necessariamente roda antes do coletor de lixo liberar a memria do objeto. No exemplo, foramos o coletor de lixo rodar chamando o mtodo esttico da classe System: gc(). (Garbage Collector). Assim, o finalize roda ainda a tempo de ser mostrado na sada do
Encapsulamento
a tcnica de controlar o acesso de terceiros as propriedades e mtodos das classes. Quando criamos uma varivel membro em nossa classe, muitas vezes (quase sempre) precisamos ter controle de 100% de seu contedo. Se o usurio de nossa classe pudesse acessar livremente as propriedades isso poderia comprometer a segurana de nosso cdigo...
Exemplo de encapsulamento:
public class Circulo { public double raio, area, perimetro;
System.out.println("rea:............" + c1.area );
System.out.println("Permetro........" + c1.perimetro ); c1.area = 100; //Acessando diretamente a propriedade??? c1.raio = 5; System.out.println("Crculo de raio: " + c1.raio); System.out.println("rea:............" + c1.area); }
System.out.println("Permetro........" + c1.perimetro);
rea:............314.15926535
Permetro........62.83185307 Crculo de raio: 5.0 rea:............100 Permetro........62.83185307
Finished executing
System.out.println("rea:............"+c1.getArea());
System.out.println("Permetro........"+c1.getPerimetro(
Sobrecarga
um recurso da POO que permite a criao de mtodos de uso mais intuitivo. Com menor necessidade de treinamento por parte dos usurios da linguagem.
Exemplo de Sobrecarga
public class MostraTipo { static private int numeroChamadas = 0; static public String tipo (final char a) { numeroChamadas++; return "char"; } static public String tipo (final int a) { numeroChamadas++; return "int"; } static public String tipo (final long a) { numeroChamadas++; return "long"; }
O executvel
public class TesteSobrecarga {
static public void main (String args[]) { MostraTipo t1 = new MostraTipo(); // Criando objeto String tipo = t1.Tipo(88F); // Usando mtodo Tipo com um float
System.out.println (tipo);
String a = "Mane"; long b = 12344L; int c = 45; float d = 3F; double e = 5D; byte f = -8; char g = 65; (continua)
O executvel (continuao)
Circulo C1 = new Circulo(1); //Criando um objeto Crculo para teste System.out.println(a +" um " + MostraTipo.tipo(a));
O executvel (continuao)
Imprime: float Mane um string 12344 um long 45 um int 3.0 um float 5.0 um double -8 um int A um char Total: 8 chamadas Finished executing
Exerccios..
Copie a classe Circulo (exemplo correto de encapsulamento) e sobrecarregue mais dois construtores:
1.
2.
Sem argumento e que inicializa o raio do crculo com 1 (um) (crculo trigonomtrico); Com um argumento inicializando o raio por meio de uma string.
Fazer um programa de teste criando um crculo para cada um dos trs construtores sobrecarregados.
Overriding (sobrescrita)
Como na sobrecarga, overriding permite criao de classes e pacotes de uso mais fcil e intuitivo, sem perda segurana e facilitando a reusabilidade. Overriding muitas vezes confundido com sobrecarga.
Temos overriding quando existe um mtodo em uma superclasse de mesmo nome mas com argumentos idnticos. Para que haja overriding necessrio que estejamos trabalhando em um projeto com herana.
Exemplo de Overriding
public abstract class Quadrilatero { protected String ID; protected double lado1; protected double lado2; public Quadrilatero(final double _lado1, final double _lado2) { this.lado1 = _lado1; this.lado2 = _lado2; } public double getArea() { return this.lado1 * this.lado2 ; }
(Continua)
Exemplo de Overriding
public double getPerimetro( ) { return 2 * (this.lado1 + this.lado2); } public double getDiagonal( ) { return Math.sqrt(this.lado1 * this.lado1 + this.lado2 * this.lado2); } public String getTipoQuadrilatero( ) { return this.ID; }
Exemplo de Overriding
A subclasse Quadrado public class Quadrado extends Quadrilatero { public Quadrado (final double _lado) {
Exemplo de Overriding
A subclasse Retangulo public class Retangulo extends Quadrilatero { public Retangulo (final double _lado1, final double _lado2) { super(_lado1,_lado2); // Repassando argumentos para a superclasse this.ID = "Retngulo"; } }
Exemplo de Overriding
Finalmente a classe de teste:
public class TesteOverriding { static public void main (String args[]) { Quadrado Fig01 = new Quadrado (1); Retangulo Fig02 = new Retangulo (3,4); System.out.println("Diagonal do " + Fig01.getTipoQuadrilatero() + ": " + Fig01.getDiagonal()); System.out.println("Diagonal do " + Fig02.getTipoQuadrilatero() + ": " + Fig02.getDiagonal()); } }
Exemplo de Overriding
Imprime:
Finished executing
Os perigos da sobrescrita!
Os mtodos sobrescritos devem executar sempre servios similares em funcionalidade mas com difrenas de implementao. Mtodos que fazem coisas diferentes devem possuir nomes diferentes. Exemplo de PERIGO: // Na super classe public void setMontaComboUnidade() { // Monta combo de unidades sem filtro ...... } // Na subclasse sobrescrevendo a super... public void setMontaComboUnidade() { // Monta combo de unidades por perfil de usurio ..... }
Os perigos da sobrescrita!
No exemplo, os mtodos sobrescritos no fazem a mesma coisa de forma diferente...
Exerccios...
Transcreva o exemplo (completo) de overriding e execute o teste. Altere as propriedades lado1 e lado2 da superclasse Quadrilatero para private. Retire o construtor da super classe Quadrilatero e acrescente os mtodos getLado1(), setLado1(), getLado2() e setLado2(). Faa as modificaes necessrias nas classes Quadrado e Retangulo.