Você está na página 1de 52

Desenvolvimento Orientado a

Objetos com Java


Captulo 2
Tipos, Variveis e Operadores
Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries.

Licena para uso e distribuio


Este material est disponvel para uso nocomercial e pode ser derivado e/ou distribudo,
desde que utilizando uma licena equivalente.
Atribuio-Uso No-ComercialCompatilhamento pela mesma
licena, verso 2.5
http://creativecommons.org/licenses/by-nc-sa/2.5/deed.pt
Voc pode copiar, distribuir, exibir e executar a obra, alm de criar obras
derivadas, sob as seguintes condies: (a) voc deve dar crdito ao autor
original, da forma especificada pelo autor ou licenciante; (b) voc no pode
utilizar esta obra com finalidades comerciais; (c) Se voc alterar, transformar, ou
criar outra obra com base nesta, voc somente poder distribuir a obra resultante
sob uma licena idntica a esta.

Maio 2006

Desenvolvimento Orientado a Objetos com Java

Objetivos deste captulo


Comearemos com os conceitos de Java que so
similares programao estruturada:
Tipos primitivos, variveis, constantes, operadores,
expresses, comentrios, etc.
Veremos que so muito semelhantes C e C++ e
outras linguagens que conhecemos;

Evoluiremos a discusso para tipos compostos e


apresentaremos os conceitos de classe e objeto
em Java;
Estabeleceremos as diferenas de tratamento
entre tipos primitivos e objetos.
3
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipos primitivos
Existem 8 tipos de dados bsicos para valores
inteiros, reais, caracteres e lgicos;
So chamados primitivos porque:
No so objetos;
So armazenados na pilha.

Java no OO pura por causa deles;


Existem por motivos de eficincia;
So completamente definidos na especificao
Java (nome, tamanho, etc.).
4
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipos primitivos inteiros


Tipo
byte
short
int
long

Tamanho
Alcance
1 byte
-128 a 127
2 bytes -32.768 a 32.767
4 bytes -2.147.483.648 a 2.147.483.647
8 bytes

-9223372036854775808 a
9223372036854775807

/* Cuidados com o alcance do tipo: */


byte b = 127;
System.out.println("b = " + b); // b = 127
b++;
System.out.println("b = " + b); // b = -128
5
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipos primitivos reais


Tambm conhecidos como ponto flutuante.
Tipo
float
double

Tamanho
Alcance
4 bytes aprox. 3.402823 E+38F
8 bytes aprox. 1.79769313486231 E+308

// A separao decimal feita com .


float f = 1.0f / 3.0f;
double d = 0.1e1 / 3.; // 0.1e1 = 0,1 x 101
// Note a diferena na preciso.
System.out.println(f); // 0.33333334
System.out.println(d); // 0.3333333333333333
6
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Preciso de ponto flutuante


A preciso se refere ao nmero de casas
38
decimais, no ao tamanho (ex.: 3.4 x 10 );
Quando a preciso fundamental, devemos usar
a classe BigDecimal e no os tipos primitivos.
double d = 1.230000875E+2;
System.out.println(d); // 123.0000875
// Converte de double para float.
float f = (float)d;
System.out.println(f); // 123.000084
7
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipo primitivo caractere


Para caracteres, Java usa o tipo char:
Segue o padro Unicode;
Ocupa 2 bytes;
Representa 32.768 caracteres diferentes;
Permite a construo de software internacionalizado;
Depende tambm do suporte do SO.

Representao entre aspas simples:


'a', '5', '\t', '\u0061', etc.

8
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Um caractere um inteiro
Por sua representao interna ser um nmero
inteiro (cdigo Unicode), um char pode
funcionar como um inteiro:
char c = 'a';
System.out.println("c: " + c); // c: a
c++;
System.out.println("c: " + c); // c: b
c = (char)(c * 100 / 80);
System.out.println("c: " + c); // c: z
int i = c;
9
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Caracteres especiais
Representao de caracteres usando \:
Cdigo

Significado

\n

Quebra de linha (newline ou linefeed)

\r

Retorno de carro (carriage return)

\b

Retrocesso (backspace)

\t

Tabulao (horizontal tabulation)

\f

Nova pgina (form feed)

\'

Aspas simples (apstrofo)

\"

Aspas

\\

Barra invertida (\)


10

Maio 2006

Desenvolvimento Orientado a Objetos com Java

Cadeias de caracteres
Algumas linguagens definem um tipo primitivo
string para cadeias de caracteres;
Java no possui um tipo primitivo string;
Em Java, strings so tipos compostos (objetos).

11
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipo primitivo lgico (booleano)


Valores verdadeiro (true) ou falso (false);
No existe equivalncia entre valores lgicos e
valores inteiros;
Em C, 0 false e qualquer outro valor true.
boolean b = true;
if (b) System.out.println("OK!"); // OK!
int i = (int)b; // Erro de compilao!
i = 1;
if (i) System.out.println("??"); // Idem!
12
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Declarao de variveis
Para declarar uma varivel, preciso dar-lhe um
nome e determinar seu tipo;
Opcionalmente, pode atribuir-lhe um valor
inicial;
Voc pode declarar vrias variveis de mesmo
tipo na mesma linha, separando com vrgula.
int i;
float f = 3.141592f;
char a = '\u0061', b = 'b', c, d = 'd';
boolean b1, b2 = true;
13
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipos de variveis
Variveis que pertencem classe como um todo;
Variveis que pertencem objetos (instncias) da
classe (atributos definidos para a classe);
Variveis locais.
public class Variavel {
public static int c = 10; // De classe.
public int i;
// De instncia.
public int func() {
int n = 5;
// Local.
i = 2 * n;
return (i + c);
}
}
14
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Escopo de varivel
Variveis podem ser declaradas em qualquer
ponto do programa;
O escopo define onde a varivel visvel (onde
podemos ler/atribuir seu valor);
O escopo de uma varivel vai do { anterior
sua declarao at o prximo }.
int i = 10;
if (i > 0) {
int j = 15;
System.out.println(i + j); // 25
}
j = i + j; // Erro: varivel fora de escopo!
15
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Nomes de variveis
Deve ser iniciado por uma letra, _ ou $;
Seguido de letras, nmeros, _ ou $;
Podem ter qualquer tamanho;
No podem ser igual a uma palavra reservada;
Java case sensitive.
Nomes Vlidos
a1
total
$_$$
_especial
preo
Maio 2006

Nomes Invlidos
1a
total geral
numero-minimo
tico&teco
void

Desenvolvimento Orientado a Objetos com Java

16

Palavras reservadas
abstract

continue

for

new

switch

assert

default

goto

package

synchronized

boolean

do

if

private

this

break

double

implements

protected

throw

byte

else

import

public

throws

case

enum

instanceof

return

transient

catch

extends

int

short

try

char

final

interface

static

void

class

finally

long

strictfp

volatile

const

float

native

super

while

17
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Converses entre tipos numricos


Tipos numricos podem se misturar em
operaes, seguindo as seguintes regras:
Se um dos operandos for double e o outro no, ser
convertido para double;
Seno, se um dos operandos for float e o outro
no, ser convertido para float;
Seno, se um dos operandos for long e o outro no,
ser convertido para long;
Nos demais casos, os operandos sero sempre
convertidos para int, caso j no o sejam.
18
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Converses entre tipos numricos


byte b = 2; short s = 4; int i = 8;
long l = 16; float f = 1.1; double d = 9.9;
d = s + l + d;
long
double
// i + b resulta em int, convertido pra long;
l = i + b;
// Erro: b + s resulta em int!
s = b + s;
19
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Converses entre tipos numricos


Converses de um tipo menor para um tipo
maior ocorrem automaticamente;
Podemos forar converses no sentido contrrio,
sabendo das possveis perdas;
Utilizamos o operador de coero (cast):
double x = 9.997;
int nx = (int)x;
System.out.println(nx); // 9
nx = (int)Math.round(x);
System.out.println(nx); // 10
20
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Constantes
Para declarar constantes, basta usar a palavrachave final:
public class Constantes {
public static void main(String[] args) {
final double CM_POR_POLEGADA = 2.54;
CM_POR_POLEGADA = 2.55; // Erro!
double larguraPol = 13.94;
double larguraCm =
larguraPol * CM_POR_POLEGADA;
System.out.println(larguraCm);
}

}
21

Maio 2006

Desenvolvimento Orientado a Objetos com Java

Constantes
A conveno que seu nome seja escrito com
letras maisculas;
mais comum encontrar constantes como
membros de classes ao invs de propriedades de
instncia ou variveis locais.
public class MinhaClasse {
public static final int CONSTANTE = 100;
private static final int CONST_INTERNA = 1;
/* ... */
}
22
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Comentrios
Ignorados pelo compilador;
Usados pelo programador para melhorar a
legibilidade do cdigo;
Existem trs tipos:
Comentrios de uma linha: // ...;
Comentrios de mltiplas linhas: /* ... */;
Comentrios JavaDoc: /** ... */ utilizados pela
ferramenta javadoc para criar uma documentao
HTML das classes, atributos e mtodos.
A ferramenta javadoc vem com o JDK;
Mais informaes na apostila.
Maio 2006

Desenvolvimento Orientado a Objetos com Java

23

Comentrios
/** <i>Documentao da classe</i>.
* @author Fulano da Silva
* @see java.io.File
*/
public class FileData extends File {
/** Documentao de atributo. */
private double tamanho;
/* Comentrio
de mltiplas linhas. */

public void excluir() {


int x = 1; // Comentrio de uma linha.
}

Maio 2006

24
Desenvolvimento Orientado a Objetos com Java

Operadores
Smbolos especiais que recebem um ou mais
argumentos e produzem um resultado;
Os operadores Java trabalham somente com
tipos primitivos (e wrappers), exceto:
=, == e != podem ser aplicados a objetos;
+ e += podem ser aplicados a strings.

25
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Operadores Aritmticos
+

Adio

a + b

Subtrao

a b

Multiplicao

a * b

Diviso

a / b

Resto da diviso inteira

a % b

(Unrio) Inverso de sinal

-a

(Unrio) Manuteno de sinal

+a

++

Incremento unrio

++a ou a++
26

Maio 2006

Desenvolvimento Orientado a Objetos com Java

Precedncia de operadores
Podemos combinar expresses:
x = a + b * 5 c / 3 % 10;

Ateno precedncia de operadores!


1) b * 5;
2) c / 3;
3) (resultado de c / 3) % 10;
4) Da esquerda para a direita.

Podemos usar parnteses para modific-la:


x = (a + b) * (5 (c / 3)) % 10;

Na dvida, utilize parnteses.


Maio 2006

Desenvolvimento Orientado a Objetos com Java

27

Operadores relacionais
==

Igual

a == b

!=

Diferente

a != b

>

Maior que

a > b

>=

Maior que ou igual a

a >= b

<

Menor que

a < b

<=

Menor que ou igual a

a <= b

Observaes:
Os parmetros devem ser de tipos compatveis;
No confunda = (atribuio) com == (igualdade).
28
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Operadores lgicos
&&

AND (E)

a && b

&

AND sem curto-circuito

a & b

||

OR (OU)

a || b

OR sem curto-circuito

a | b

XOR (OU Exclusivo)

a ^ b

Observaes:
S operam sobre valores lgicos;
Podem ser combinados em expresses grandes.
29
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Curto-circuito
int x = 10, y = 15, z = 20;
// (z > y) no avaliado.
if ((x > y) && (z > y)) { /* ... */ }
// (z == y) no avaliado.
if ((x == 10) || (z == y)) { /* ... */ }
// Ambos so avaliados.
if ((x > y) & (z > y)) { /* ... */ }
// Ambos so avaliados.
if ((x == 10) | (z == y)) { /* ... */ }
30
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Operador de atribuio
Usado para alterar o valor de uma varivel:
x = 10 * y + 4;

Vrias atribuies podem ser feitas em conjunto:


x = y = z = 0;

O lado direito da atribuio sempre calculado


primeiro, seu resultado armazenado na
varivel do lado esquerdo:
int x = 5;
x = x + 2;
31
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Operadores binrios
Operam em variveis inteiras, bit a bit:
&

AND (E)

OR (OU)

XOR (OU Exclusivo)

NOT (NO)

>>

Deslocamento de bits para a direita

<<

Deslocamento de bits para a esquerda

32
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Atribuio composta
Une-se um operador binrio com o sinal de
atribuio:
Expresso
x += y
x -= y
x *= y
x /= y

Equivale a
x = x + y
x = x - y
x = x * y
x = x / y

Expresso
x &= y
x |= y
x ^= y
x >>= y

Equivale a
x = x & y
x = x | y
x = x ^ y
x = x >> y

33
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Incremento e decremento
Somar / subtrair 1 de uma varivel inteira to
comum que ganhou um operador s para isso:
++x e x++ equivalem a x = x + 1;
--x e x-- equivalem a x = x 1.

Quando parte de uma expresso maior, a forma


prefixada diferente da ps-fixada:
int x = 7;
int y = x++; // y = 7, x = 8.
x = 7;
y = ++x;

// y = 8, x = 8.
34

Maio 2006

Desenvolvimento Orientado a Objetos com Java

Operador ternrio
Forma simplificada de uma estrutura if else
(que veremos no prximo captulo);
Produz um valor de acordo com uma expresso:
<expresso> ? <valor 1> : <valor 2>
Se <expresso> for true, o resultado <valor 1>,
do contrrio o resultado <valor 2>.
int x = 7;
int y = (x < 10) ? x * 2 : x / 2;
System.out.println("y = " + y); // y = 14
35
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Precedncia de operadores
As expresses so avaliadas segundo uma
ordem de precedncia dos operadores:
1 . [] ()

8 &

2 ++ -- ~ instanceof
new - (unrio)

9 ^
10 |

3 * / %

11 &&

4 + -

12 ||

5 >> << >>>

13 ?:

6 < > <= >=

14 = += -= *= /= ...

36
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipos compostos
Tipos primitivos armazenam somente
informaes muito simples;
Por exemplo, se quisermos armazenar
informaes sobre alunos:
nome, matrcula, idade, disciplinas cursadas, etc.

necessrio criar estruturas compostas por tipos


primitivos e outras estruturas.
nome
matrcula
idade
disciplinas

nome
carga horria

nome
...
carga horria
37

Maio 2006

Desenvolvimento Orientado a Objetos com Java

Registros e classes
Linguagens estruturadas usam o conceito de
registro:
Agregado de dados de tipos heterogneos, que
identifica seus elementos individuais por nome.

Linguagens orientadas a objeto usam o conceito


de classes e objetos:
Objetos so estruturas de dados compostas que
contm dados e funes (mtodos);
Pode armazenar internamente dados de tipos
primitivos ou outros objetos;
Objetos so instncias de classes.
38
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Objetos
Um objeto uma entidade que incorpora uma
abstrao relevante no contexto de uma
aplicao;
Podem ser coisas abstratas (ex.: uma reserva de
passagem area, um pagamento) ou concretas
(ex.: um documento, um produto);
Possui trs caractersticas principais:
Estado (estrutura de dados);

45

Comportamento (mtodos);
Identidade (cada objeto nico).

70
15

39
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Classes
Uma classe descreve um conjunto de objetos
com as mesmas propriedades, o mesmo
comportamento, os mesmos relacionamentos
com outros objetos e a mesma semntica;
Parecido com o conceito de tipo.
Casa
#
Cor;
Nmero;
Abrir Porta;
Fechar Porta;
Arquiteto.
Classe
Maio 2006

15

45

70

Instncias (objetos)

Desenvolvimento Orientado a Objetos com Java

40

Instncias de classes
Objeto = Instncia de classe;
Paradigma OO norteia o desenvolvimento por
meio de classificao de objetos:
Modelamos classes, e no objetos;
Objetos so entidades reais executam algum papel
no sistema;
Classes so abstraes capturam a estrutura e
comportamento comum a um conjunto de objetos.

41
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Tipos compostos em Java


Java OO e, portanto, no possui registros, mas
sim classes e objetos;
Exceto os tipos primitivos j estudados, tudo em
Java um objeto, inclusive vetores e strings;
Primeiro escrevemos as classes, em seguida
criamos objetos, instncias das classes;
Em Java, comparado com C++ por exemplo,
tudo isso bastante simplificado.

42
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Uma classe Java


public class
public int
public int
public int

Coordenadas {
x;
y;
z;

public static void main(String[] args) {


Coordenadas coord = new Coordenadas();
coord.x = 10;
coord.y = 15;
coord.z = 18;
}
}

43
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Manipulao de objetos em Java


Em Java trabalhamos com referncias para
objetos, ao contrrio de C++ (manipulao
direta ou ponteiros);
Analogia:
A TV o objeto;
O controle a referncia;
Voc s carrega a referncia;
A referncia pode existir sem o objeto.

44
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Manipulao de objetos em Java


Uma string uma classe j definida pela API;
Se quisermos usar uma string, precisamos de
uma referncia, ou seja, uma varivel string:
String s;

Agora possumos uma referncia. No podemos


us-la at que o objeto real seja criado:
// s = "Ol Mundo!";
s = new String("Ol Mundo!");
System.out.println(s); // Ol Mundo!
45
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Atribuio de valores
Quando realizamos uma atribuio:
x = y;

Java faz a cpia do valor da varivel da direita


para a varivel da esquerda;
Para tipos primitivos, isso significa que alteraes em
x no implicam alteraes em y;
Para objetos, como o que copiado a referncia
para o mesmo objeto, alteraes no objeto que x
referencia altera o objeto que y referencia, pois o
mesmo objeto!
46
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Atribuio de valores primitivos


int x = 10;

x:

10

int y = x;

x:

10

y:

10

x:

10

y:

20

y = 20

47
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Atribuio de objetos
Coordenada c1;
c1 = new Coordenada();
c1.x = 10;
c1.y = 20;
c1.z = 30;
Coordenada c2;
// Erro comum:
// c2 = new Coordenada();

10
c1:

20
30

c1:

10
20

c2:

30

c2 = c1;
48
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Atribuio de objetos
c2.x = 50;

c1:

50
20

c2:

30

Tenha sempre em mente a diferena entre um


tipo primitivo e um objeto (referncia).

49
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Strings em Java
Java no possui tipo primitivo para cadeia de
caracteres, mas existe a classe String;
Esta classe tem tratamento especial:
Construo facilitada usando literais ("");
Operador de concatenao;
Converso automtica de tipos primitivos e objetos
para String;

50
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Strings em Java
// Equivale a new String("Ol, mundo!").
String mensagem = "Ol, mundo!";
// String vazia (tamanho 0).
String str = "";
// Concatenao.
str = "A mensagem : " + mensagem;
// Converso (c1 aquele objeto Coordenada).
int i = 10; float f = 3.14f;
str = "i = " + i + ", f = " + f;
str += ", c1 = " + c1;
51
Maio 2006

Desenvolvimento Orientado a Objetos com Java

Strings so imutveis
No podemos mudar o valor de um caractere da
string. Podemos somente criar outra string.
String str = "Ol";

str:

O l

str += " mundo!";

str:

O l

O l

m u n d o !

Uma nova string criada e a outra abandonada


para o coletor de lixo.
Lembre-se sempre: Strings so imutveis!
Maio 2006

Desenvolvimento Orientado a Objetos com Java

52