Conceito e exemplos de passagem por valor e referência?

Bom dia pessoal, estou precisando fazer um trabalho para a faculdade em LP1, mas estou encontrando dificuldade. Preciso do conceito e exemplos de passagem por valor e referência (já li em vários lugares que não existe no java e em outros que existe. To confuso :confused: ) e seu uso como static ou não. Podem me ajudar por gentileza? (urgente :sweat: )

Cara esse assunto é nebuloso mesmo, aconselho dar uma olhada neste tópico aqui no fórum:

Acredito que a maior confusão sobre o assunto é que as pessoas confundem referência no Java com a referência do C/C++, o que é diferente já que no Java não lidamos diretamente com ponteiros e referências.

De uma olhada no link que passei, lá já tem várias opiniões interessantes sobre o assunto.

Links:

http://homepages.dcc.ufmg.br/~olmo/aula8-parametros.pdf

Obrigado amigo!

Valeu amigo!

1 curtida

Ok, mas porque e quando devo usar static ou não na passagem de parâmetros?

Coloque exemplos dessa static!

Basicamente, o static é usado quando não se quer em um classe por exemplo que seja feita uma instância.

Hum…valeu…clareou um pouco a ideia…:joy:

Java só permite passagem por valor. Qualquer outra coisa que digam é mito. Aqui tem mais detalhes.

O uso do static deve ser feito sempre e somente quando for necessário compartilhar algo entre todas as instâncias de objetos que uma determinada classe puder gerar. Logo, este recurso (atributo ou método) será o mesmo para cada objeto.

Considere o seguinte, uma classe chamada Foo que cria objetos foo. Todos estes objetos receberão um identificador ao serem criados. Este identificador nunca pode ser repetido ou ser duplicado. Logo, é preciso ter um controle centralizado destes identificadores.

Se eu fizesse isso:

public class Foo {
    int identificador;
}

Cada objeto poderia dar o valor que quisesse ao atributo identificador (independente de ser public, default, private ou protected).
Agora, quando eu faço:

public class Foo {
    static int identificador;
}

Eu digo ao compilador/JVM que aquele atributo sempre terá o mesmo valor para todos os objetos, pois ele pertence à classe.

Obrigado amigo pelas dicas e pela resposta!!

Uma pergunta, quando em um método, você passa um Objeto como argumento, essa passagem não seria por referência não? Visto que uma alteração no Objeto dentro do método alteraria o valor dele original.

Se você seguiu a orientação da resposta e acessou o link, foi redirecionado a uma thread do stackoverflow onde uma das respostas é bem clara: apenas passagem por valor. A mesma resposta complementa que "infelizmente decidiram chamar a posição de memória em que um objeto se encontra de “referência” e isso acaba causando toda a confusão.
Você está passando o valor do objeto, não sua referência. Você não tem algo como no C (ou C++), onde você poderia fazer algo como

int x = 10;
outraFuncao(&x);//está passando a referência da variável x, ou seja, sua posição de memória

//e na outraFuncao
int w = *x;//aqui está obtendo o valor existente na referência passada, ou seja, na posição de memória que armazena a variável x

Java não possui nada dessa natureza, pois, sua fundamentação foi estrutura para:
1 - Ser simples
2 - Manter a manipulação de baixo nível protegida

Além disso, uma referência de objeto no java é diferente de uma referência do C. A referência, no java, está relacionada a uma instância de um objeto específico, enquanto que, no C, pode ser entendida como a localização onde determinada variável está.
Compreendido?

sim,muito obrigado

Em Java os tipos primitivos são passados por valor e os tipos não primitivos são passados por cópia de referência.
Dessa forma você consegue alterar os membros da referência, mas não consegue alterar a referência em si, como é possível no C++ por exemplo.