Você está na página 1de 145

Programao Orientada a Objetos

POO - Java

Paradigmas de programao

Mquina Procedural

Cobol, Fortran, Basic

Estruturada

C, Pastal, Clipper

Orientada a objetos

C++, Java, C#, VB.Net

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

Apontar Escrever Apagar (Caso tenha borracha)

A Classe Lapiseira

Atributos (propriedades) da lapiseira:


Todas propriedades do lpis e mais... Dimetro do grafite Clipe Tem ou no

Procedimentos (mtodos) da lapiseira:


Todos do lpis e mais ... Sistema de avano do grafite.

Sistema de alimentao de novos grafites.

A Hierarquia da Vida
Seres Vivos
Animais
Vertebrados
Mamferos

Primatas
Homens

A Classe dos Mamferos


Algumas propriedades:

Tamanho, cor, quantidade, forma, dimenses, massa;

Alguns mtodos:

Viso, olfato, audio, locomoo, reproduo, tato,


circulao, digesto, amamentao;

Principais Caractersticas da OO

Classes Herana

Simples Mltipla

Polimorfismo Encapsulamento

Os atributos e procedimentos podem ser:


Pblicos Privados Protegidos

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

Camada de Negcios Camada de Controle Camada de Apresentao


Web Console Banco de Dados Relacional Banco de Dados OO Serializao e persistncia de objetos

Camada de Persistncia

Java trouxe solues para todos estes dilemas


Java mais simples e mais seguro que C++. Java, ao contrrio de C++, no permite uma linha

sequer que no seja POO.

Java , de longe, a tecnologia de programao mais porttil que se pode conceber.

possvel desenvolver sistemas para WEB


praticamente 100% em Java, tanto para rodar no servidor quanto no cliente.

Um detalhe realmente muito importante: Java uma tecnologia 100% gratuita.

A Tecnologia Java

Segundo a Sun, a Tecnologia Java :


Uma linguagem de Programao Um ambiente de Desenvolvimento Um ambiente de Aplicao Um ambiente de Distribuio

similar em sintaxe ao C++ e similar em semntica ao SmallTalk


utilizada para desenvolver aplicaes para a arquitetura Cliente Servidor, para ambientes Mveis e para a Internet.

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

Coisas de C++ que Java no trouxe inicialmente


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;

Caractersticas Das Aplicaes Java


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

A Tecnologia Java e Composta de

Uma Linguagem de Programao; Ambientes de Desenvolvimento; Ambientes de Aplicao;

Ambientes de Instalao/Configurao;

Est organizada nas seguintes reas


J2SE (Core/Desktop); J2EE (Enterprise/Server);

J2ME (Mobile/Wireless);
Java Card;

Java Web Services;


XML (eXtensible Markup Language)...

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

O Class Loader (continuao)

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

Realiza testes antes de rodar o aplicativo, verificando se:


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.

Todas as classes importadas por meio da rede passam

pela verificao do Bytecode Verifier.

A Virtual Machine

A JVM determina o que os programas Java podem ou no fazer.

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.

O JDK (Java Software Developers Kit)

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 e alguns IDEs

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.

Abaixo algumas das IDEs livres mais utilizadas:


Eclipse - www.eclipse.org JEdit - www.jedit.org JCreator LE - www.jcreator.com GEL - www.gexperts.com

A Sintaxe da Linguagem Java


Classes e Interfaces
Propriedades Mtodos Declaraes

Expresses
Variveis Operadores Literais

Comandos Chamadas de mtodos

Propriedades, Instncias ou Variveis Membro

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;

Mtodos, Procedimentos, Funes Membro

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:

Lgica: a > b Aritmtica real: 12 * 5F + (a++) % x Aritmtica inteira: (byte) a + \30 + 4;

Alfanumrica: Total faturado: + total

Tipos de dados primitivos

O Java possui oito tipos de dados primitivos, subdivididos em:

Textual: char

Lgico: boolean
Integral: byte, short, int, e long Ponto Flutuante: double e float

O Tamanho em bits dos tipos primitivos


Tipo boolean byte int Bits 8 (Usa apenas 1) 8 32

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:

08 bits byte -27

at

27-1 215-1 231-1 263-1

16 bits short -215 at 32 bits int -231 at 64 bits long -263 at

Ponto flutuante

Os dois tipos de pontos flutuantes em Java so:

32 bits float 1.40239846e-45 at 3.40282347e+38 64 bits double 4.94065645841246544e-324 at 1.79769313486231570e+308

Esses tipos esto em conformidade com a especificao IEEE 754 (Institute of Electrical and Electronic Engineers, 1985).

Ponto flutuante (Valores infinitos)

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.

Exemplo: System.out.println(Math.sqrt(-2.)); Imprime: NaN

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.

Exemplos: char c = \u03A6; ( expressa a letra grega char letra = b;

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

Literais Integrais (inteiros)

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

Literais de Ponto Flutuante

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.

Exemplos: 1.55E6 2.5454e-2 -32.999e7 -0.59e-17 4F 200D

Literais String

Um Literal String pode ser definido como uma seqncia de caracteres entre aspas duplas.

Exemplo:

String peixe = Santos F. C.;

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

Abstract assert boolean break byte case catch char class

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;

Variveis Membro e Automticas

As variveis em Java diferem em relao ao tempo da seguinte forma:

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)

Variveis Membro e Automticas


(Continuao)
public void segundoMetodo(int x) { int y = 8; // Varivel Local ao mtodo this.x = x + y; System.out.println(Argumento Mtodo x: +x); System.out.println (Varivel membro x:+this.x); } } public class TestaEscopo { public static void main( String[] args) { Escopo teste = new Escopo(); teste.primeiroMetodo(); } }

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

Variveis Membro x Variveis locais

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)

As seguintes declaraes tambm so vlidas:


int [] inteiro; // Array de tipo primitivo double [][] bidim; // Array bidimensional

Declarando e inicializando vetores


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

Declarando, alocando e inicializando em uma nica


linha. A quantidade de elementos atribudos determina o

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.

Operadores aritmticos + Adio - Subtrao

* Multiplicao
/ Diviso

% Resto (Diviso Inteira)

Operadores aritmticos (Continuao)


public class Aritimeticos { public static void main( String args[] ) { int a = 9, b = 4; System.out.println( a + b ); // Imprime 13 System.out.println( a - b ); // Imprime 5 System.out.println( a / b ); // Imprime 2 System.out.println( a % b ); // Imprime 1 //a = b / 0; // Gera o erro: java.lang.ArithmeticException: / by zero //a = b % 0; // Gera o erro: java.lang.ArithmeticException: / by zero double c = 9, d = 4; System.out.println( c / d ); // Imprime 2.25 System.out.println( c % d ); // Imprime 1.0 c = d / 0; // No d erro c = d % 0; // No d erro byte f = 64, g = 4; f = (byte) (f * g); // 64 * 4 = 256 ou 1 0000 0000 em binrio System.out.println(f); /* Imprime 0, pois um byte tem 8 bits e no cast perdemos o bit mais significativo, overflow: A responsabilidade toda nossa! */ } }

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;

=> 0000 1001.

E um objeto? Como armazenado? Vamos pegar a linha abaixo da nossa classe TestaEscopo: Escopo teste = new Escopo();

O que temos na rea de memria teste? O objeto teste?

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;

Parece fcil, mas temos de tomar certos cuidados, vejam:


byte x = 9; byte y = 2; byte z = x+y;

Essa ltima linha no ser compilada. Estranho ? Vamos analisar:

Atribuindo primitivos (continuao)


byte x = 9; byte y = 2; byte z = x+y;

Essa ltima linha no ser compilada. Na linha: byte x = 9;

O compilador executa uma converso da seguinte forma:

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.

Isso tambm se aplica s variveis short e char (menores do que o int).


Mas o que ocorreu na expresso byte z = x+y; ?

Atribuindo primitivos (continuao)

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:

byte z = ( byte )(x + y);

Atribuindo primitivos (Continuao)

Mais alguns exemplos:


byte x = 9; x += 2; // Sem problemas, o compilador realiza a converso // implicitamente para ns J em: byte x = 9; x = x + 2; // Teremos problemas, j que x + 2 resulta em um
int.

Novamente, teremos de usar o cast: byte x = 9; x = (byte) (x + 2); //


Correto mais trabalhoso!

Atribuindo ponto flutuante

Um literal de ponto flutuante sem sufixo implicitamente um double de 64 bits. Se voc tentar:

float x = 99.9; // Essa linha no compilar !

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.

float x = 99.9f; // No teremos mais problemas de compilao!!!

Atribuindo variveis de referncia


MinhaData d = new MinhaData (1, 7, 2007);

A parte em azul armazena na memria (declara), apenas a referncia ao objeto;


O operador new aloca em memria o espaco necessrio para o objeto MinhaData que ser criado; O operador = associa, com o endereo de memria, o objeto da classe MinhaData a varivel de referncia d;

MinhaData(1,7,2007) chama o contrutor da classe passando os argumentos dia, mes e ano.

Comparando atribuies...
Observe o seguinte cdigo:
int x = 9;

int x2 = x;

Onde java armazenou as variveis x e x2?


Agora este cdigo:
MinhaData d = new MinhaData (1, 7, 2007); MinhaData d2 = d; Qual a diferena entre os exemplos?

Comparando atribuies...

Fazendo:

d.dia = 2;//Estaremos alterando tambm d2.dia para 2


(!?!).

Caso modificssemos a linha:

d2 = new MinhaData(1,7,2007);

Resultaria em dois novos objetos MinhaData com duas referncias diferentes.

E atribuies com strings ?


Veja o seguinte fragmento de cdigo:
String teste = Ja; String teste2 = teste; As duas variveis referenciam o mesmo objeto?

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?

E atribuies com strings ?


Olha a Regra!

A Virtual Machine sempre criar um novo objeto em


qualquer alterao que faamos com uma String.

Ou seja, na linha: teste2 = teste2 + va;

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

Operador lgico de conexo: && (And)

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

Operador lgico de conexo: || (Or)

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

O operador de negao booleano: ! (Not)

O operador ! inverte o valor de uma expresso booleana.

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 } }

Conceito de Curto Circuito

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:

(3 < 5) && (5 < 4) && (a == 5) (4 < 3) || (5 > 2) || (7 < a) || (b != a)

Aplicando o curto circuito:

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;

if (Fun != null && Fun.getNome().equals("Jose") )


System.out.println("Valor a receber: R$ "+Fun.salario()); else System.out.println("Salrio no pode ser mostrado...");

}
}

Operadores de incremento e decremento

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

Rotao direita (mantm o


Rotao a direita de todos os

O AND bit a bit ( & )


Os bits so operados com & um a um: Exemplo: short a=0xA5FF, b=0xF5A0; & 1010 0101 1111 1111 1111 0101 1010 0000 1010 0101 1010 0000

Resultado: 0xA5A0

O OR bit a bit ( | )
Os bits so operados com | um a um: Exemplo:

short a=0xA5FF, b=0xF5A0; |


1010 0101 1111 1111 1111 0101 1010 0000 1111 0101 1111 1111

O XOR bit a bit ( ^ )


Os bits so operados com ^ um a um: Exemplo: short a=0xA5FF, b=0xF5A0; ^ 1010 0101 1111 1111 1111 0101 1010 0000 0101 0000 0101 1111

Resultado: 0xF5FF

Operadores de deslocamento (shift)

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 direita preservando o sinal

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

Deslocamento para esquerda (com perda)

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:

short a = 0x6AF4; a >> 2;


000110 1010 1111 0100 0001 1010 1011 1101

Resultado: 0x1ABD
E se o valor de a fosse mpar?

Operador de Inverso de Bits (Not bit a bit)

O operador ~ inverte os bits de tipos integrais, ou seja, converte 0 para 1 e 1 para 0.

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:

int maior = a > b ? a : b;


System.out.println(nota >=7

? 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

break, continue, break e continue rotulados

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.

Instruo for (exemplos)


int soma = 0; for (int i = 1 ; i < 100 ; i++) soma += i;

System.out.println("Soma de inteiros entre 1 e 99: " + soma);


Imprime: Soma de inteiros entre 1 e 99: 4950 int j=6; for (;j<9;) { System.out.println("Valor do contador: " + j++); } Imprime: Valor do contador: 6 Valor do contador: 7 Valor do contador: 8

Variveis declaradas em Exp1

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 }

O lao for each do Java 5

Usado para percorrer listas completas.

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 while (exemplo)


boolean teste = true; int i = 1, soma = 0; while (teste) { soma += (i++); if (i > 99) teste = false; } System.out.println("Soma de inteiros entre 1 e 99: " + soma); Imprime: Soma de inteiros entre 1 e 99: 4950 Finished executing

Instruo do/while
do { <comandos> } while ( <Exp> );
Exemplo:

int i = 0; do i++; while (i < 100); System.out.println("Valor de i no final: "+i);


Imprime:

Valor de i no final: 100 Finished executing

Instruo break (em laos)


Provoca interrupo de um lao qualquer (for, while e do/while)

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

} System.out.println("Interaes: " + interacoes);

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:

double soma = 0F; int interacoes = 0;


while (interacoes < 10000 && soma <= 1000) { soma += Math.random( ); interacoes++; } System.out.println("Interaes: " + interacoes); Imprime: Interaes: 2032 Finished executing

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

Instruo break rotulado


Exemplo: i_laco: for (int i=0;i<10;i++) { System.out.println ("Lao i: " + i); j_laco: for (int j=0;j<10;j++) { System.out.println ("Lao j: " + j); if (Math.random() > 0.5) break i_laco; for (int k=0;k<10;k++) { System.out.println ("Lao k: " + k); if (Math.random() > 0.5) break j_laco; } } } Nota: break rotulado no existe em C/C++

Instruo continue rotulado


Exemplo:

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

Nota: continue rotulado no existe em C/C++

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:

Usando as classes wrappers


Antes do java 5
Integer x1=new Integer(10); ou Integer x2=new Integer("10"); No uso: System.out.println("Soma: " + x1.intValue() + x2.intValue()); if (x1.compareTo(new Integer(5)) > 0) System.out.println(x1.toString() + " maior que 5");

A partir do Java 5 (autoboxing e unboxing)


Integer x1 = 10; ou Integer x2 = Integer.parseInt("10");
No uso: System.out.println("Soma: " + x1 + x2); if (x1 > 5) System.out.println(x1 + " maior que 5");

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

PROGRAMANDO (de verdade) EM JAVA

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:

As classes no so programas nem podem ser executadas.


Precisamos instanciar (construir) os objetos!

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.

Mtodo Construtor (Exemplo 1)


public class Quadrado { private float lado;

public //ConstrutorQuadrado(final float lado) { this.lado = lado; }


} }

public float getArea() { return this.lado * this.lado; public float getPerimetro() { return 4F * this.lado;

Usando a classe Quadrado...


public class TesteQuadrado { public static void main(String args[]){ Quadrado qua = new Quadrado(5); System.out.println(Area: + qua.getArea());

Mtodo Construtor (Exemplo 2)


public abstract class QuadradoBase { protected double area, perimetro, diagonal; public QuadradoBase(final double _lado) { // Construtor this.area = _lado * _lado; this.perimetro = 4 * _lado; this.diagonal = _lado * Math.sqrt(2); } public double getArea() { return this.area; } public double getPerimetro() {return this.perimetro;} public double getDiagonal() {return this.diagonal; } protected void finalize () { System.out.println(Fim do quadrado...); } }

Chamando o construtor da super


public class Quadrado extends QuadradoBase { private double lado; public Quadrado (final double _lado) { super(_lado); // Chamando o construtor da super classe this.lado = _lado; } public void setLado(final double _lado) { this.area = _lado * _lado; this.perimetro = 4 * _lado; this.diagonal = _lado * Math.sqrt(2); this.lado = _lado; } }
Ateno: Quando uma classe estende outra que possui um construtor com argumentos, ele dever, necessariamente, chamar o construtor da superclasse.

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;

private final double PI = 3.1415926535;


public Circulo (final double _raio) { // Construtor this.raio = _raio; calculaArea(); calculaPerimetro(); } public void calculaArea() { this.area = PI * this.raio * this.raio; } public void calculaPerimetro () { this.perimetro = 2 * PI * this.raio; } }

Usando a classe Crculo


public class TesteEncapsulamento {
static public void main (String args[]) { Circulo c1 = new Circulo(10); System.out.println("Crculo de raio: " + c1.raio );

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

O que sai impresso na tela


Crculo de raio: 10.0

rea:............314.15926535
Permetro........62.83185307 Crculo de raio: 5.0 rea:............100 Permetro........62.83185307

Finished executing

A Classe crculo usando encapsulamento


public class Circulo {

private double raio, area, perimetro; public final double PI = 3.1415926535;


public Circulo (final double _raio) { // Construtor this.raio = _raio; calculaArea(); calculaPerimetro(); } public void calculaArea() { area = PI * this.raio * raio; } public void calculaPerimetro () { perimetro = 2 * PI * this.raio; }

A classe crculo usando encapsulamento (Continuao)


public void setRaio (double _raio) { if (_raio > 0) { // Raio deve ser maior que zero. this.raio = _raio; calculaArea(); calculaPerimetro(); } else System.out.println (Raio deve ser maior que zero); } public double getRaio () { return this.raio; } public double getArea () { return this.area; } public double getPerimetro () { return this.perimetro; } }

Testando novamente a classe crculo


public class TesteEncapsulamento {
static public void main (String args[]) { Circulo c1 = new Circulo (10); System.out.println("Crculo de raio: "+c1.getRaio()); System.out.println("rea:............"+c1.getArea()); System.out.println("Permetro........"+c1.getPerimetro( )); c1.setRaio(5); //c1.area = 100; System.out.println("Crculo de raio: "+c1.getRaio());

System.out.println("rea:............"+c1.getArea());
System.out.println("Permetro........"+c1.getPerimetro(

O que sai impresso na tela

Crculo de raio: 10.0


rea:............314.15926535 Permetro........62.83185307 Crculo de raio: 5.0 rea:............78.5398163375 Permetro........31.415926535 Finished executing

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"; }

Exemplo de Sobrecarga (Cont.)


static public String tipo (final double a) { numeroChamadas++; return "double"; } static public String tipo (final float a) { numeroChamadas++; return "float"; } static public String tipo (final String a) { numeroChamadas++; return "string"; } static public int getNumeroChamadas() { return MostraTipo.numeroChamadas;

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

System.out.println(b +" um " + MostraTipo.tipo(b));


System.out.println(c +" um " + MostraTipo.tipo(c)); System.out.println(d +" um " + MostraTipo.tipo(d)); System.out.println(e +" um " + MostraTipo.tipo(e)); System.out.println(f +" um " + MostraTipo.tipo(f)); System.out.println(g +" um " + MostraTipo.tipo(g)); System.out.println("Total:" + MostraTipo.getNumeroChamadas() + " chamadas."); // System.out.println(MostraTipo.tipo(C1)); }

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

super(_lado,_lado); //Repassando argumentos para a superclasse


this.ID = "Quadrado"; }

public double getPerimetro() {


return 4 * this.lado1; } public double getDiagonal() { return this.lado1 * Math.sqrt(2); }

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:

Diagonal do Quadrado: 1.4142135623730951 Diagonal do Retngulo: 5.0

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

Fazem coisas diferentes!!!


Neste caso sugerimos: // Na super classe (Fica o mtodo genrico) public void setMontaComboUnidade() { // Monta combo de unidades sem filtro ...... } // Na subclasse no sobrescrevemos a super... public void setMontaComboUnidadePerfil() { // Monta combo de unidades por perfil de usurio ..... }

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.

Você também pode gostar