SISTEMAS DE INFORMAÇÃO
1 1
1 SISTEMAS DE 1
INFORMAÇÃO
1 SISTEMAS DE 1
INFORMAÇÃO
1 1
1
Professoras:
Ariane Machado Lima Fátima L.S. Nunes
A Memória e as
variáveis
SISTEMAS DE INFORMAÇÃO
2 2
2 SISTEMAS DE 2
INFORMAÇÃO
2 SISTEMAS DE 2
INFORMAÇÃO
2 2
2
O que vimos até agora
• Conceitos de POO usando Java
• Comandos de seleção (if...else, switch)
• Comandos de repetição (while, do...while)
• Variáveis int, double e boolean
• Caracteres e cadeias de caracteres
SISTEMAS DE INFORMAÇÃO
3 3
3 SISTEMAS DE 3
INFORMAÇÃO
3 SISTEMAS DE 3
INFORMAÇÃO
3 3
3
O que veremos nesta aula
• Aprofundamento na organização da memória do computador
• O que são variáveis
• Como Java trabalha com variáveis
• Passagem de parâmetro por valor x
passagem de parâmetro por referência
SISTEMAS DE INFORMAÇÃO
4 4
4 SISTEMAS DE 4
INFORMAÇÃO
4 SISTEMAS DE 4
INFORMAÇÃO
4 4
4
• Matemático húngaro que desenvolveu modelos de
computação que levou à arquitetura do computador moderno.
• ?
1945
John Von Neumann
Relembrando a história
SISTEMAS DE INFORMAÇÃO
5 5
5 SISTEMAS DE 5
INFORMAÇÃO
5 SISTEMAS DE 5
INFORMAÇÃO
5 5
5
• Matemático húngaro que desenvolveu modelos de
computação que levou à arquitetura do computador moderno.
• O programa deve ser guardado no mesmo lugar que os dados: na
memória.
1945
John Von Neumann
Relembrando a história
SISTEMAS DE INFORMAÇÃO
6 6
6 SISTEMAS DE 6
INFORMAÇÃO
6 SISTEMAS DE 6
INFORMAÇÃO
6 6
6
1945
Relembrando arquitetura do computador
ULA
UC
Registradores CPU
Memória
Disco Fita Impressora
Vídeo Teclado
Barramento de Sistema
Dispositivos de Entrada/Saída
Dispositivos de Entrada/Saída
SISTEMAS DE INFORMAÇÃO
7 7
7 SISTEMAS DE 7
INFORMAÇÃO
7 SISTEMAS DE 7
INFORMAÇÃO
7 7
7
Memória
Comumente chamada de memória principal ou RAM
(Random Access Memory – memória de acesso aleatório).
Usada para armazenar os programas a serem executados pelo computador e os dados
manipulados por esses programas.
Consiste em uma sequência finita de unidades de armazenamento de dados, cada qual com o seu endereço.
Normalmente implementada como um conjunto de
registradores implementados por flip-flops (circuitos
que armazenam um bit).
SISTEMAS DE INFORMAÇÃO
8 8
8 SISTEMAS DE 8
INFORMAÇÃO
8 SISTEMAS DE 8
INFORMAÇÃO
8 8
8
Memória
Principal: RAM
acesso mais rápido
dados perdidos quando computador é desligado
Secundária:
discos rígidos ou flexíveis, CD, DVD, pendrive
acesso mais lento
persistência – dados permanentes
SISTEMAS DE INFORMAÇÃO
9 9
9 SISTEMAS DE 9
INFORMAÇÃO
9 SISTEMAS DE 9
INFORMAÇÃO
9 9
9
O que acontece quando acessamos o DrJava?
DrJava também é um programa (ambiente para programação)
Programa do ambiente é carregado do disco para memória principal
Código DrJava Código DrJava Código DrJava ...
Código DrJava 0000
0001 0002 0003
....
F...FF
SISTEMAS DE INFORMAÇÃO
10 10
10 SISTEMAS DE 10
INFORMAÇÃO
10 SISTEMAS DE 10
INFORMAÇÃO
10 10
10
O que acontece quando acessamos o DrJava?
DrJava também é um programa (ambiente para programação)
Programa do ambiente é carregado do disco para memória principal
0000 0001 0002 0003
....
FFFF
endereços
Endereços
Espaços de armazenamento
Código DrJava Código DrJava Código DrJava ...
Código DrJava
SISTEMAS DE INFORMAÇÃO
11 11
11 SISTEMAS DE 11
INFORMAÇÃO
11 SISTEMAS DE 11
INFORMAÇÃO
11 11
11
O que acontece quando acessamos o DrJava?
Todas as informações que digitamos no ambiente são armazenadas na memória
0000 0001 0002 0003
....
1010 F...FF
endereços
Código DrJava Código DrJava Código DrJava ...
Código DrJava
Classe GeradorDePrimos (continua com o código)
SISTEMAS DE INFORMAÇÃO
12 12
12 SISTEMAS DE 12
INFORMAÇÃO
12 SISTEMAS DE 12
INFORMAÇÃO
12 12
12
O que acontece quando acessamos o DrJava?
Quando acionamos opção Salvar , os dados da memória principal são copiados para o disco
0000 0001 0002 0003
....
1010 F...FF
endereços
Código DrJava Código DrJava Código DrJava ...
Código DrJava
Classe GeradorDePrimos (continua com o código)
GeradorDePrimos.java
SISTEMAS DE INFORMAÇÃO
13 13
13 SISTEMAS DE 13
INFORMAÇÃO
13 SISTEMAS DE 13
INFORMAÇÃO
13 13
13
Como é a memória
Cada endereço armazena um byte (8 bits): números de 0 a 255
Combinando 2 posições adjacentes, é possível armazenar números de 16 bits
00000001 0002 0003
....
1010 F...FF
endereços
1ª parte do número 16 bits2ª parte do número 16 bits
SISTEMAS DE INFORMAÇÃO
14 14
14 SISTEMAS DE 14
INFORMAÇÃO
14 SISTEMAS DE 14
INFORMAÇÃO
14 14
14
Exemplo
int : ocupa 4 bytes
Exemplo: int contadorDeAluno;
0000 0001 0002 0003
....
1010 F...FF
endereços
Espaço reservado para a variável
contadorDeAluno
00000000
SISTEMAS DE INFORMAÇÃO
15 15
15 SISTEMAS DE 15
INFORMAÇÃO
15 SISTEMAS DE 15
INFORMAÇÃO
15 15
15
Armazenamento na memória
Usando bytes adjacentes e outros tipos de codificação, é possível armazenar qualquer tipo de informação:
números negativos e positivos
textos
imagens
etc
Tamanho da memória reflete no endereçamento
Exemplo:
1GigaByte = 2
30bytes = 1.073.741.824 bytes
0000 0001 0002 0003
....
230-2 230-1
SISTEMAS DE INFORMAÇÃO
16 16
16 SISTEMAS DE 16
INFORMAÇÃO
16 SISTEMAS DE 16
INFORMAÇÃO
16 16
16
Variáveis em Java
Nomes associados a dados em um programa de computador
Java: atributos de objetos e classes, parâmetros de métodos e variáveis locais
Quando um programa é executado, cada variável é associada, em tempo de execução, a um determinado endereço de memória
0000 0001 0002 0003
....
1010 F...FF
endereços
Espaço reservado para a variável contadorDeAluno
int contadorDeAluno;
00000000
SISTEMAS DE INFORMAÇÃO
17 17
17 SISTEMAS DE 17
INFORMAÇÃO
17 SISTEMAS DE 17
INFORMAÇÃO
17 17
17
Variáveis em Java
Quando atribuímos um valor para a variável, o valor ocupa o espaço reservado
0000 0001 0002 0003
....
1010 F...FF
endereços
00001010
Espaço reservado para a variável contadorDeAluno
contadorDeAluno = 10;
SISTEMAS DE INFORMAÇÃO
18 18
18 SISTEMAS DE 18
INFORMAÇÃO
18 SISTEMAS DE 18
INFORMAÇÃO
18 18
18
Variáveis em Java
Importante:
Variável de tipo primitivo (byte, short, int, float, double, boolean e char) tem comportamento diferente de
variáveis associadas a tipos abstratos (objetos complexos como Strings, arrays ou objetos
pertencentes a classes definidas pelo programador)
Dados de tipos primitivos ocupam pouco espaço na
memória → é fácil guardar as posições de memória
correspondentes a eles
SISTEMAS DE INFORMAÇÃO
19 19
19 SISTEMAS DE 19
INFORMAÇÃO
19 SISTEMAS DE 19
INFORMAÇÃO
19 19
19
Variáveis em Java
Importante:
Variável de tipo primitivo (byte, short, int, float, double, boolean e char) tem comportamento diferente de
variáveis associadas a tipos abstratos (objetos complexos como Strings, arrays ou objetos
pertencentes a classes definidas pelo programador)
Dados de tipos primitivos ocupam pouco espaço na memória → é fácil guardar as posições de memória correspondentes a eles
Assim, se a e b são variáveis do mesmo tipo:
a = b copia em a o valor que está em b
copia o conteúdo!
SISTEMAS DE INFORMAÇÃO
20 20
20 SISTEMAS DE 20
INFORMAÇÃO
20 SISTEMAS DE 20
INFORMAÇÃO
20 20
20
Variáveis em Java
Importante:
Dizemos que a e b armazenam diretamente o seu conteúdo
00000001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
ocupado anteriormente ocupado anteriormente
ocupado anteriormente
int a; Espaço reservado
para variável a
00000000
SISTEMAS DE INFORMAÇÃO
21 21
21 SISTEMAS DE 21
INFORMAÇÃO
21 SISTEMAS DE 21
INFORMAÇÃO
21 21
21
Variáveis em Java
Importante:
Dizemos que a e b armazenam diretamente o seu conteúdo
00000001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
ocupado anteriormente ocupado anteriormente
ocupado anteriormente
00000010
int b = 2; Espaço reservado
para variável a
Espaço reservado para variável b
00000000
SISTEMAS DE INFORMAÇÃO
22 22
22 SISTEMAS DE 22
INFORMAÇÃO
22 SISTEMAS DE 22
INFORMAÇÃO
22 22
22
Variáveis em Java
Importante:
Dizemos que a e b armazenam diretamente o seu conteúdo
00000001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
00000010
a = b; Espaço reservado
para variável a
Espaço reservado
para variável b
SISTEMAS DE INFORMAÇÃO
23 23
23 SISTEMAS DE 23
INFORMAÇÃO
23 SISTEMAS DE 23
INFORMAÇÃO
23 23
23
Variáveis em Java
Por isso: dizemos que a mudança em um parâmetro de tipo primitivo dentro de um método não se reflete fora dele: variáveis locais
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
int y = 1;
obj.fazAlgo(y);
Espaço reservado para variável y void fazAlgo (int x)
{
(…) x++;
(…) }
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
SISTEMAS DE INFORMAÇÃO
24 24
24 SISTEMAS DE 24
INFORMAÇÃO
24 SISTEMAS DE 24
INFORMAÇÃO
24 24
24
Variáveis em Java
Por isso: dizemos que a mudança em um parâmetro de tipo primitivo dentro de um método não se reflete fora dele: variáveis locais
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
int y = 1;
obj.fazAlgo(y);
Espaço reservado para variável y void fazAlgo (int x)
{
(…) x++;
(…) }
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
00000010
Espaço reservado
para variável x
SISTEMAS DE INFORMAÇÃO
25 25
25 SISTEMAS DE 25
INFORMAÇÃO
25 SISTEMAS DE 25
INFORMAÇÃO
25 25
25
Variáveis em Java
Por isso: dizemos que a mudança em um parâmetro de tipo primitivo dentro de um método não se reflete fora dele: variáveis locais
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
int y = 1;
obj.fazAlgo(y);
Espaço reservado para variável y void fazAlgo (int x)
{
(…) x++;
(…) }
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
00000011
Espaço reservado
para variável x
SISTEMAS DE INFORMAÇÃO
26 26
26 SISTEMAS DE 26
INFORMAÇÃO
26 SISTEMAS DE 26
INFORMAÇÃO
26 26
26
Variáveis em Java
Por isso: dizemos que a mudança em um parâmetro de tipo primitivo dentro de um método não se reflete fora dele: variáveis locais
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
int y = 1;
obj.fazAlgo(y);
Espaço reservado para variável y void fazAlgo (int x)
{
(…) x++;
(…) }
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
SISTEMAS DE INFORMAÇÃO
27 27
27 SISTEMAS DE 27
INFORMAÇÃO
27 SISTEMAS DE 27
INFORMAÇÃO
27 27
27
Variáveis em Java
Passagem de parâmetro por VALOR: o argumento é avaliado e COPIADO para o parâmetro
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
int y = 1;
obj.fazAlgo(y);
Espaço reservado para variável y void fazAlgo (int x)
{
(…) x++;
(…) }
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
SISTEMAS DE INFORMAÇÃO
28 28
28 SISTEMAS DE 28
INFORMAÇÃO
28 SISTEMAS DE 28
INFORMAÇÃO
28 28
28
Variáveis em Java
Passagem de parâmetro por VALOR: o argumento é avaliado e COPIADO para o parâmetro
int y = 1;
obj.fazAlgo((y*4) % 3);
void fazAlgo (int x) {
(…) x++;
(…)
} Avaliado!!!!
SISTEMAS DE INFORMAÇÃO
29 29
29 SISTEMAS DE 29
INFORMAÇÃO
29 SISTEMAS DE 29
INFORMAÇÃO
29 29
29
NÃO em Java!!!!! - Ex: C++
Passagem de parâmetro por REFERÊNCIA: o
parâmetro é um apelido (“atalho”) para o argumento (os dois apontam para o mesmo endereço em
memória!!!)
SISTEMAS DE INFORMAÇÃO
30 30
30 SISTEMAS DE 30
INFORMAÇÃO
30 SISTEMAS DE 30
INFORMAÇÃO
30 30
30
NÃO em Java!!!!! - Ex: C++
Passagem de parâmetro por REFERÊNCIA: o
parâmetro é um apelido (“atalho”) para o argumento (os dois apontam para o mesmo endereço em
memória!!!)
int y = 1;
obj.fazAlgo(y);
void fazAlgo (int& x) {
(…) x++;
(…) }
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
Espaço reservado para variável y
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
SISTEMAS DE INFORMAÇÃO
31 31
31 SISTEMAS DE 31
INFORMAÇÃO
31 SISTEMAS DE 31
INFORMAÇÃO
31 31
31
NÃO em Java!!!!! - Ex: C++
Passagem de parâmetro por REFERÊNCIA: o
parâmetro é um apelido (“atalho”) para o argumento (os dois apontam para o mesmo endereço em
memória!!!)
int y = 1;
obj.fazAlgo(y);
void fazAlgo (int& x) {
(…) x++;
(…) }
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
Espaço reservado para variável y
ocupado anteriormente ocupado anteriormente
00000010 ocupado anteriormente
x
SISTEMAS DE INFORMAÇÃO
32 32
32 SISTEMAS DE 32
INFORMAÇÃO
32 SISTEMAS DE 32
INFORMAÇÃO
32 32
32
NÃO em Java!!!!! - Ex: C++
Passagem de parâmetro por REFERÊNCIA: o
parâmetro é um apelido (“atalho”) para o argumento (os dois apontam para o mesmo endereço em
memória!!!)
int y = 1;
obj.fazAlgo(y);
void fazAlgo (int& x) {
(…) x++;
(…) }
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
Espaço reservado para variável y
ocupado anteriormente ocupado anteriormente
00000011 ocupado anteriormente
x
SISTEMAS DE INFORMAÇÃO
33 33
33 SISTEMAS DE 33
INFORMAÇÃO
33 SISTEMAS DE 33
INFORMAÇÃO
33 33
33
NÃO em Java!!!!! - Ex: C++
Passagem de parâmetro por REFERÊNCIA: o
parâmetro é um apelido (“atalho”) para o argumento (os dois apontam para o mesmo endereço em
memória!!!)
int y = 1;
obj.fazAlgo(y);
void fazAlgo (int& x) {
(…) x++;
(…) }
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
Espaço reservado para variável y
ocupado anteriormente ocupado anteriormente
00000011 ocupado anteriormente
SISTEMAS DE INFORMAÇÃO
34 34
34 SISTEMAS DE 34
INFORMAÇÃO
34 SISTEMAS DE 34
INFORMAÇÃO
34 34
34
Java não possui passagem por
referência!!!
SISTEMAS DE INFORMAÇÃO
35 35
35 SISTEMAS DE 35
INFORMAÇÃO
35 SISTEMAS DE 35
INFORMAÇÃO
35 35
35
Variáveis em Java
Como já dissemos, variáveis de tipo primitivo armazenam o próprio conteúdo
Isso não acontece com tipos abstratos (objetos complexos)!
Como o nome diz, podem ser complexos e ocuparem muito espaço de memória.
Então, a linguagem Java não guarda nas variáveis
uma cópia do objeto, mas o endereço de memória no qual o objeto está armazenado
Por isso, diz-se que variáveis associadas a objetos
são referências a estes objetos
SISTEMAS DE INFORMAÇÃO
36 36
36 SISTEMAS DE 36
INFORMAÇÃO
36 SISTEMAS DE 36
INFORMAÇÃO
36 36
36
Objetos em Java
GeradorDePrimos gerador;
null
• O conteúdo da variável gerador está armazenado no endereço 0006;
• armazena a referência para um objeto da classe (tipo) GeradorDePrimos;
• valor default de uma referência: null
0006
SISTEMAS DE INFORMAÇÃO
37 37
37 SISTEMAS DE 37
INFORMAÇÃO
37 SISTEMAS DE 37
INFORMAÇÃO
37 37
37
Objetos em Java
234
...
objeto da classe GeradorDePrimos
• O conteúdo da variável gerador está armazenado no endereço 0006;
• armazena a referência para um objeto da classe (tipo) GeradorDePrimos;
0006
GeradorDePrimos gerador;
gerador = new GeradorDePrimos();
0234
SISTEMAS DE INFORMAÇÃO
38 38
38 SISTEMAS DE 38
INFORMAÇÃO
38 SISTEMAS DE 38
INFORMAÇÃO
38 38
38
Variáveis em Java
No momento que um objeto é usado:
interpretador Java (JVM) o localiza a partir de
uma referência para ele armazenada em uma variável
variável com referência também está
armazenada em um endereço de memória.
234
...
objeto da classe GeradorDePrimos 0002
0234
gerador
SISTEMAS DE INFORMAÇÃO
39 39
39 SISTEMAS DE 39
INFORMAÇÃO
39 SISTEMAS DE 39
INFORMAÇÃO
39 39
39
Variáveis em Java
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
ocupado anteriormente ocupado anteriormente ocupado anteriormente
0003
Espaço reservado para m a partir daqui
Matematica m = new Matematica()
referência para m guardada neste
endereço
SISTEMAS DE INFORMAÇÃO
40 40
40 SISTEMAS DE 40
INFORMAÇÃO
40 SISTEMAS DE 40
INFORMAÇÃO
40 40
40
Variáveis em Java
Isto pode gerar algumas surpresas!!!
class Produto { double preco;
int codigo;
void preco (double p) { preco = p;
}
void codigo (int c) { codigo = c;
}
double retornaPreco () { return preco;
}
int retornaCodigo () { return codigo;
} }
> Produto arroz = new Produto();
> arroz.preco(10);
> Produto feijao = arroz;
> feijao.preco(42);
Qual é o preço do arroz?
SISTEMAS DE INFORMAÇÃO
41 41
41 SISTEMAS DE 41
INFORMAÇÃO
41 SISTEMAS DE 41
INFORMAÇÃO
41 41
41
Variáveis em Java
Isto pode gerar algumas surpresas!!!
class Produto { double preco;
int codigo;
void preco (double p) { preco = p;
}
void codigo (int c) { codigo = c;
}
double retornaPreco () { return preco;
}
int retornaCodigo () { return codigo;
} }
> Produto arroz = new Produto();
> arroz.preco(10);
> Produto feijao = arroz;
> feijao.preco(42);
> arroz.retornaPreco() 42.0
Por que isso ocorreu ???
SISTEMAS DE INFORMAÇÃO
42 42
42 SISTEMAS DE 42
INFORMAÇÃO
42 SISTEMAS DE 42
INFORMAÇÃO
42 42
42
Variáveis em Java
Isto pode gerar algumas surpresas!!!
> Produto arroz = new Produto();
> arroz.preco(10);
000000010002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
ocupado anteriormente ocupado anteriormente
arroz
Espaço reservado para arroz a
0002partir daqui
referência para arroz
guardada neste endereço
SISTEMAS DE INFORMAÇÃO
43 43
43 SISTEMAS DE 43
INFORMAÇÃO
43 SISTEMAS DE 43
INFORMAÇÃO
43 43
43
Variáveis em Java
Isto pode gerar algumas surpresas!!!
> Produto feijao = arroz;
> feijao.preco(42);
> arroz.retornaPreco() 42.0
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
ocupado anteriormente ocupado anteriormente
arroz
0002
0002
Espaço reservado para arroz a partir daqui
referência para arroz guardada neste endereço
referência para feijao
guardada neste endereço
SISTEMAS DE INFORMAÇÃO
44 44
44 SISTEMAS DE 44
INFORMAÇÃO
44 SISTEMAS DE 44
INFORMAÇÃO
44 44
44
Variáveis em Java
Isto pode gerar algumas surpresas!!!
> Produto feijao = arroz;
> feijao.preco(42);
> arroz.retornaPreco() 42.0
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 ...
F....FF
ocupado anteriormente ocupado anteriormente
arroz
0002
0002
Espaço reservado para arroz a partir daqui
referência para arroz guardada neste endereço
referência para feijao guardada neste endereço
Esta linha faz com que feijao e arroz passam a ser referência para
o mesmo objeto (mesmo endereço) na memória. Funciona
como se houvesse dois apelidos
para a mesma pessoa.
SISTEMAS DE INFORMAÇÃO
45 45
45 SISTEMAS DE 45
INFORMAÇÃO
45 SISTEMAS DE 45
INFORMAÇÃO
45 45
45
Variáveis em Java
Portanto:
com objetos complexos, qualquer atribuição significa dar nome diferente para o mesmo objeto;
o que alterar para um objeto, será refletido no outro;
isso explica porque alterações em objetos
complexos dentro de um método podem se
propagar para fora – o que não acontece com
variáveis de tipos primitivos!
SISTEMAS DE INFORMAÇÃO
46 46
46 SISTEMAS DE 46
INFORMAÇÃO
46 SISTEMAS DE 46
INFORMAÇÃO
46 46
46
Variáveis em Java
Portanto:
essa diferença também fica evidente quando fazemos comparações (operador ==):
para tipos primitivos: a == b?
para objetos complexos: obj1 == obj2 ?
SISTEMAS DE INFORMAÇÃO
47 47
47 SISTEMAS DE 47
INFORMAÇÃO
47 SISTEMAS DE 47
INFORMAÇÃO
47 47
47
Variáveis em Java
Portanto:
essa diferença também fica evidente quando fazemos comparações (operador ==):
para tipos primitivos: verifica valores dos mesmos
para objetos complexos: compara as
referências.
SISTEMAS DE INFORMAÇÃO
48 48
48 SISTEMAS DE 48
INFORMAÇÃO
48 SISTEMAS DE 48
INFORMAÇÃO
48 48
48
Variáveis em Java
Portanto:
essa diferença também fica evidente quando fazemos comparações (operador ==):
para tipos primitivos: verifica valores dos mesmos
> int a = 10;
> int b = 3 * 4;
> a == b false
> a = 12;
> a == b
true
SISTEMAS DE INFORMAÇÃO
49 49
49 SISTEMAS DE 49
INFORMAÇÃO
49 SISTEMAS DE 49
INFORMAÇÃO
49 49
49
Variáveis em Java
Portanto:
essa diferença também fica evidente quando fazemos comparações (operador ==):
para objetos complexos: compara as referências.
> String s1 = "Oi alunos queridos”;
> String s2 = "Oi alunos queridos”;
> s1 == s2 false
> s1 = s2;
> s1 == s2
true
SISTEMAS DE INFORMAÇÃO
50 50
50 SISTEMAS DE 50
INFORMAÇÃO
50 SISTEMAS DE 50
INFORMAÇÃO
50 50
50
Método equals
recebe como entrada uma String
Retorna true se Strings forem iguais
> String s1 = "Oi alunos queridos"
> String s2 = "Oi alunos queridos"
> s1 == s2 false
> s1.equals(s2)
true
SISTEMAS DE INFORMAÇÃO
51 51
51 SISTEMAS DE 51
INFORMAÇÃO
51 SISTEMAS DE 51
INFORMAÇÃO
51 51
51
Variáveis em Java
alterações em objetos complexos dentro de um método podem se propagar para fora – o que não acontece com variáveis de tipos primitivos!
Por que PODEM?
SISTEMAS DE INFORMAÇÃO
52 52
52 SISTEMAS DE 52
INFORMAÇÃO
52 SISTEMAS DE 52
INFORMAÇÃO
52 52
52
Variáveis Java
String s1 = “Bom dia“;
String s2 = s1;
s1 = “Boa noite“;
Quanto vale s2?
SISTEMAS DE INFORMAÇÃO
53 53
53 SISTEMAS DE 53
INFORMAÇÃO
53 SISTEMAS DE 53
INFORMAÇÃO
53 53
53
String s1 = “Bom dia“;
String s2 = s1;
s1 = “Boa noite“;
Quanto vale s2?
ocupado anteriormente ocupado anteriormente
Objeto String : cadeia “Bom dia”
...
...
0002 ...
s1 ~ 0126
...0002
0126
Variáveis Java
SISTEMAS DE INFORMAÇÃO
54 54
54 SISTEMAS DE 54
INFORMAÇÃO
54 SISTEMAS DE 54
INFORMAÇÃO
54 54
54
String s1 = “Bom dia“;
String s2 = s1;
s1 = “Boa noite“;
Quanto vale s2?
ocupado anteriormente ocupado anteriormente
Objeto String : cadeia “Bom dia”
...
...
0002 ...
...
s1 ~ 0126
00020002
0126
s2 ~ 1644
1644Variáveis Java
SISTEMAS DE INFORMAÇÃO
55 55
55 SISTEMAS DE 55
INFORMAÇÃO
55 SISTEMAS DE 55
INFORMAÇÃO
55 55
55
Passagem por valor x por referência
String s1 = “Bom dia“;
String s2 = s1;
s1 = “Boa noite“;
ocupado anteriormente ocupado anteriormente
Objeto String : cadeia “Bom dia”
...
Objeto String : cadeia “Boa noite”
0034
0002
Quanto vale s2?
s1 ~ 0126 s2 ~ 1644
0002
0126
1644 0034
SISTEMAS DE INFORMAÇÃO
56 56
56 SISTEMAS DE 56
INFORMAÇÃO
56 SISTEMAS DE 56
INFORMAÇÃO
56 56
56
Em uma chamada de método:
class SeiLaOQue {
void metodoQueRecebeString (String y) {
y = “Nova String”;
} }
String x = “Velha String”;
SeiLaOQue obj = new SeiLaOQue();
obj.metodoQueRecebeString(x);
System.out.println(x);
O que será impresso?
SISTEMAS DE INFORMAÇÃO
57 57
57 SISTEMAS DE 57
INFORMAÇÃO
57 SISTEMAS DE 57
INFORMAÇÃO
57 57
57
Em uma chamada de método:
class SeiLaOQue {
void metodoQueRecebeString (String y) {
y = “Nova String”;
} }
String x = “Velha String”;
SeiLaOQue obj = new SeiLaOQue();
obj.metodoQueRecebeString(x);
System.out.println(x);
O que será impresso? Velha String
SISTEMAS DE INFORMAÇÃO
58 58
58 SISTEMAS DE 58
INFORMAÇÃO
58 SISTEMAS DE 58
INFORMAÇÃO
58 58
58
Em uma chamada de método:
class SeiLaOQue {
void metodoQueRecebeString (String y) {
y = “Nova String”;
} }
String x = “Velha String”;
SeiLaOQue obj = new SeiLaOQue();
obj.metodoQueRecebeString(x);
System.out.println(x);
equivale a
String x = “Velha String”;
String y = x;
y = “Nova String”;
System.out.println(x);
SISTEMAS DE INFORMAÇÃO
59 59
59 SISTEMAS DE 59
INFORMAÇÃO
59 SISTEMAS DE 59
INFORMAÇÃO
59 59
59
Em uma chamada de método:
class SeiLaOQue {
void metodoQueRecebeString (String y)
{
y = “Nova String”;
} }
String x = “Velha String”;
SeiLaOQue obj = new SeiLaOQue();
obj.metodoQueRecebeString(x);
System.out.println(x);
equivale a
String x = “Velha String”;
String y = x;
y = “Nova String”;
System.out.println(x);
Referências são passadas
por valor!!!
(x é copiada para
a nova variável y)
SISTEMAS DE INFORMAÇÃO
60 60
60 SISTEMAS DE 60
INFORMAÇÃO
60 SISTEMAS DE 60
INFORMAÇÃO
60 60
60
Em Java, TUDO É PASSADO POR VALOR!!!!
• Embora o que seja passado como parâmetro seja chamado de “referência” do objeto, essa referência é passada por valor!!! (uma cópia da referência é feita)
• Um objeto nunca é passado como parâmetro em Java (o que é passado é a sua
referência)!
SISTEMAS DE INFORMAÇÃO
61 61
61 SISTEMAS DE 61
INFORMAÇÃO
61 SISTEMAS DE 61
INFORMAÇÃO
61 61
61
Resumindo
• Quando um “objeto passado como
parâmetro” pode ser alterado dentro do
método?
SISTEMAS DE INFORMAÇÃO
62 62
62 SISTEMAS DE 62
INFORMAÇÃO
62 SISTEMAS DE 62
INFORMAÇÃO
62 62
62
Resumindo
• Quando um objeto, cuja referência foi
passada como parâmetro de um método, pode ser alterado dentro desse método?
– Quando seus métodos (que alteram seus atributos) são invocados dentro do método,
USANDO A REFERÊNCIA QUE FOI PASSADA COMO
PARÂMETRO!!!
SISTEMAS DE INFORMAÇÃO
63 63
63 SISTEMAS DE 63
INFORMAÇÃO
63 SISTEMAS DE 63
INFORMAÇÃO
63 63
63
Exercício 1
Se eu tenho duas variáveis do tipo int, a e b,
como eu faço para trocar seus valores?
SISTEMAS DE INFORMAÇÃO
64 64
64 SISTEMAS DE 64
INFORMAÇÃO
64 SISTEMAS DE 64
INFORMAÇÃO
64 64
64
Exercício 2
Simule o seguinte código (teste de mesa):
> TesteTroca teste = new TesteTroca();
> int a = 1;
> int b = 2;
> teste.troca(a, b);
> System.out.println (“a = “ + a + “ e b = “ + b);
class TesteTroca{
void troca (int x, int y) {
int temp = x;
x = y;
y = temp;
}
}
SISTEMAS DE INFORMAÇÃO
65 65
65 SISTEMAS DE 65
INFORMAÇÃO
65 SISTEMAS DE 65
INFORMAÇÃO
65 65
65
Exercício 3
Simule o seguinte código (teste de mesa):
> TesteTroca teste = new TesteTroca();
> int a = 1;
> int b = 2;
> teste.troca(a, b);
> System.out.println (“a = “ + a + “ e b = “ + b);
class TesteTroca{
void troca (int a, int b) {
int temp = a;
a = b;
b = temp;
}
}
SISTEMAS DE INFORMAÇÃO
66 66
66 SISTEMAS DE 66
INFORMAÇÃO
66 SISTEMAS DE 66
INFORMAÇÃO
66 66
66
Exercício 4
Como seria possível fazer um método em Java
que troca os valores de 2 inteiros ?
SISTEMAS DE INFORMAÇÃO
67 67
67 SISTEMAS DE 67
INFORMAÇÃO
67 SISTEMAS DE 67
INFORMAÇÃO
67 67
67