Dúvida no raciocínio

Olá à todos,

Primeiramente peço desculpas pelo título confuso, esta é a minha primeira postagem no fórum e sou um iniciante em programação, logo quaisquer dicas de boas práticas tanto de postagem quanto de programação serão muito bem vindas!

Bom, seguindo ao problema, de fato eu não sei como resumir em um título a dúvida que tenho, pois eu tenho o seguinte código:

public class TesteArvore {

public static void main(String[] args) {
Arvore v1 = new Arvore();
System.out.println(v1.getNome());
v1.setNome(“Macieira”);
Arvore v2 = new Arvore();
v2.setNome(“Laranjeira”);
teste1(v1, v2);
System.out.println("valor v1: " + v1.getNome());
System.out.println("valor v2: " + v2.getNome());
}
public static void teste1(Arvore v1, Arvore v2) {
v1.setNome(“Acacia”);
v1=v2;
v1.setNome(“Eucalipto”);
v2=v1;
}

}

Especificamente me refiro à função teste1(Arvore v1, Arvore v2):

v1.setNome(“Acacia”);
v1=v2;
v1.setNome(“Eucalipto”);
v2=v1;

Na primeira parte do código eu sigo o seguinte passo a passo:

Cria instancia v1
faz 1º Syso que sai "null"
v1.setNome(“Macieira”)
Cria instancia v2
v2.setNome(“Laranjeira”)

Até ai tudo certo, v1 se chama macieira e v2 laranjeira, agora no teste em si eu não consigo decifrar o que acontece quando v1=v2, pois não importa quanto eu refaça, meu raciocínio chega a conclusão que ambas as arvores deveriam se chamar eucalipto.

v1.setNome(“acacia”) // aqui v1 se chama acacia
v1=v2 //pelo que eu entendi aqui v1 recebe todo o objeto v2 e
passa a se chamar laranjeira
v1.setNome(“eucalipto”) // e aqui o nome de v1 passa a ser eucalipto
v2=v1 //Por fim v2 recebe todo o objeto v1

Nesse momento ambos deveriam se chamar eucalipto, pela lógica que segui até aqui, porém ao rodar o programa o console demonstra os seguintes valores finais:

null
valor v1: Acacia
valor v2: Eucalipto

Será que alguém pode me iluminar nessa questão e mostrar o que eu estou perdendo aqui? Desde já agradeço qualquer ajuda e novamente peço desculpas por quaisquer erros de principiante que possam haver, reitero que esta é minha primeira postagem, então sejam compreensivos! :pray:

Bom dia amigo, tentei rodar aqui, pra que serve a classe Árvore aqui?

“Árvore v2 = New Árvore”

Cara, vou deixar você mesmo tirar tuas conclusões
Dá uma olhada

2 curtidas

Opa, tudo bem?
Então cara, na verdade esse segundo objeto é só para dificultar a questão mesmo :sweat:, e quanto à classe Árvore ela não “serve” basicamente pra nada, pois este código é só um exercício. Estou refazendo uma prova que tirei uma nota baixa, mas para todos os efeitos aqui está a classe:

public class Arvore {
private String nome;
public int a;
public static int b;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}

E aí, beleza? Pô, valeu mesmo pelo artigo acho que ele deu uma boa clareada nessa questão toda de pass-by-reference e pass-by-value, que eu nunca nem tinha visto! Hahahah valeu mesmo!
Mas só pra salientar dentro do meu contexto se eu entendi corretamente, o que gera o resultado final ao invés do previsto pelos meus primeiros cálculos é pq eu estava assumindo que a variável(variavel/objeto?) v1 e v2 dentro do método teste estavam assumindo diretamente os valores dos objetos originais v1 e v2 criados no main, quando na verdade esses v1 e v2 do método estavam agindo como uma espécie de ponteiro para manusear os valores através apenas dos getters e setters. Seria isso mesmo ou será que eu entendi algo errado? Nesse momento para mim é muito importante qualquer tipo de orientação de profissionais mais experientes, então agradeço de verdade pela ajuda!