-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpass-valor-referencia.java
60 lines (54 loc) · 2.23 KB
/
pass-valor-referencia.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
//Variáveis locais como primitivas e referências de objetos são criadas na memória Stack
//Os objetos são criados na memória Heap.
//variaveis de tipos primitivos: passagem por valor
//arrays de tipos primitivos, coleções: passagem por referencia
class Teste {
public static void main(String[] args) {
int[] a = new int[2];
a[0]=1;
a[1]=2;
Arrays.stream(a).forEach(System.out::println);//1,2
t1(a);
IntStream intStream = IntStream.of(a);
intStream.forEach(System.out::println);//3,2
List<Integer> i = new ArrayList<>();
i.addAll(Arrays.asList(1,2,3,4));
i.stream().forEach(System.out::println);//1,2,3,4
t2(i);
i.stream().forEach(System.out::println);//45,2,3,4,90
t3(i);
i.stream().forEach(System.out::println);//45,2,3,4,90
}
public static void t1(int[] b){
b[0] = 3;
}
public static void t2(List<Integer> i){//parametro i é uma cópia da lista original mas que aponta pro mesmo objeto na memoria heap, portanto as mudancas refletem na lista original
i.set(0,45);
i.add(90);
}
//Neste caso, utilizamos o operador “new” para alterar a referência da i. i agora aponta para um novo objeto e, portanto, qualquer alteração feita neste objeto não afetará o objeto original da lista de numeros.
public static void t3(List<Integer> i){
i = new ArrayList<>();
i.add(45);
i.add(90);
}
//atribuição direta a um objeto recebido por parâmetro não altera o valor original, só altera fora da função se mudar os atributos do objeto
public static void t4(Integer num){
num = 45;
}
public static void teste(){
Main m = new Main();
m.idade = 40;
System.out.println(m.idade);//40
teste2(m);
System.out.println(m.idade);//40
}
public static void teste2(Main m){
m = new Main(); //m agora aponta pra um outro endereço então qualquer mudança não afeta o objeto fora dessa função, se tirasse essa linha e deixasse só a debaixo, então ia mudar o objeto original
m.idade = 80;
}
}