Métodos podem ser declarados para receber variáveis do tipo primitiva e/ou variáveis do tipo objeto.
Passando Variáveis do Tipo Objeto
Ao passar uma variável de referência para um método, o que é passado é a referência (endereço de memória do objeto), e não o objeto em si. Ou seja, não será passado o próprio objeto e sim uma cópia do conteúdo dele (do endereço de memória). Consequentemente, os dois objetos estarão acessando o mesmo lugar na memória. Isso quer dizer que se uma propriedade for alterada em um objeto afetará o outro, já que as duas variáveis apontam pro mesmo endereço de memória (objeto).
Entretanto, há uma exceção: caso o objeto dentro do método ganhe uma nova instância, será criado um novo endereço na memória e suas mudanças não mais afetarão o objeto original.
class Retangulo {
int ladoA;
int ladoB;
}
public class Forma {
public static void main(String[] args) {
Retangulo retangulo = new Retangulo();
retangulo.ladoA = 5;
retangulo.ladoB = 10;
setRetangulo(retangulo);
//imprime 5
System.out.println(retangulo.ladoA);
setRetangulo2(retangulo);
//imprime 6
System.out.println(retangulo.ladoA);
}
/* um método com variável de referência como
* parâmetro recebe o endereço de memória
* do objeto que está sendo passado; isso
* quer dizer que os dois passarão a referenciar
* o mesmo objeto no heap */
static void setRetangulo(Retangulo ret) {
ret.ladoA = 6;
}
/* quando o parâmetro é instanciado novamente
* ele recebe outra referência, e suas
* alterações não mais afetarão o outro objeto*/
static void setRetangulo2(Retangulo ret) {
ret = new Retangulo();
ret.ladoA = 7;
}
}
Obs.: Strings são tratadas de forma diferente. Quando são passadas por parâmetro em um método, é sempre outra referência, ou seja, uma não afeta a outra.
Passando Variáveis to Tipo Primitiva
Nesse caso é feita uma cópia do valor e criada uma nova variável com esse mesmo valor. Isso quer dizer que se a nova variável receber um novo valor dentro do método não afetará a variável original.
public class Forma2 {
public static void main(String[] args) {
int valor = 3;
setValor(valor);
//imprime 3
System.out.println(valor);
}
/* um método com variável primitiva como
* parâmetro recebe o conteúdo (representação
* em bits da literal) da variável que está
* sendo passada; isso quer dizer que serão
* independentes, um não afetará o outro */
static void setValor(int v) {
v = 10;
}
}
Fonte: SCJP Sun Certified Programmer for Java 6 Study Guide
0 comentários:
Postar um comentário