Parametros

Pessoal

Tenho uma duvida sobre OO e queria saber se voces podem me ajudar.

Estou aprendendo sobre passagem de objeto como atributo de uma classe…só que não me entra na cabeça qual a diferença entre passar um atributo normal (ex: int valor) e passar uma classe como paramentro ex: (Ponto2D p2).??

se alguem conseguir me ajudar fico grato. :slight_smile:

Como assim diferença?

Tipo primitivo (int,double) são passado copia do valor.
Passando a referencia de um objeto como parametro, é passado copia da referencia ao objeto.

vc passa um objeto dessa classe.

Ex:

class Pessoa{
		private String nome;
		private int idade;
		
		//metodos getters e setters
	}

Pessoa p1 = new Pessoa();
p1.setNome("João Jose");
p2.setIdade(25);

exibirIdadeNome(p1);

public void exibirIdadeNome(Pessoa p){

 //aqui dentro metodo, vc tem o objeto pessoa, então vc pode recuperar idade, nome, todos os atributos do objeto do tipo Pessoa.
}

[quote=asousaj]Tipo primitivo (int,double) são passado copia do valor.
Passando a referencia de um objeto como parametro, é passado copia da referencia ao objeto.[/quote]

No caso, só praver seu entendi… todos os atributos que estão na classe que tá sendo passada como paramentro pode ser usada no método?

[quote=mktcarlos85]
No caso, só praver seu entendi… todos os atributos que estão na classe que tá sendo passada como paramentro pode ser usada no método?[/quote]
Os atributos “visiveis” do objeto SIM poderão ser usados no método.

Se entende ingles dá uma olhada nesse link, tem uma boa explicação.
http://www.javaranch.com/campfire/StoryCups.jsp

Bons estudos!

Bom vamos lá… na prática, passar um tipo primitivo e um objeto é a mesma coisa.

em Java não exista passagem de parâmetro por referência (embora pareça existir), só existe passagem por valor, portanto você envia uma cópia daquilo que você tem, mas o que isso quer dizer na prática?

Vamos fazer uns testes e ver até aonde você pode brincar com isso.[code]public class Teste{

public static void main(String[] args){

	int num = 1;
	System.out.println("Antes do método = "+num);
	alterarNumero(num);
	System.out.println("Depois do método = "+num);

}

private static void alterarNumero(int num){
	num = 4;
	System.out.println("Durante o método = "+num);
}

}[/code] Se rodar esse código vai ver que durante o método, o valor é alterado, porém quando é finalizada sua execução, a variável num ainda aponta para o valor antigo, isso ocorre porque você passou simplesmente uma cópia do valor 1 e a variável num de dentro do método, não é a mesma que existe fora dele.

Agora com objetos é a mesma coisa, você envia uma cópia da referência do objeto, e é importante enfatizar que é uma cópia da referência.

Se 2 variáveis de referência apontam para o mesmo objeto, qualquer alteração feita nos atributos do objeto pode ser visualizada pelas 2 variáveis.

Veja o código a seguir:[code]public class Teste{

public static void main(String[] args){

	Pessoa p = new Pessoa();
	p.setNome("Rodrigo");
	System.out.println("Antes do método = "+p.getNome());
	alterarNome(p);
	System.out.println("Depois do método = "+p.getNome());

}

private static void alterarNome(Pessoa p){
	p.setNome("João");
	System.out.println("Durante o método = "+p.getNome());
}

}[/code]Se você executar esse código vai ver que o nome continua diferente após a execução do método, isso ocorre porque as 2 variáveis de referência apontam para o mesmo objeto, mesmo sabendo que o p de dentro do método não é o mesmo que o p de fora, ambos apontam para a mesma coisa, portanto podem alterá-lo a vontade.

E quanto ao fato de ser cópia, por que ele é relevante?

Ele é relevante no caso a seguir:[code]public class Teste{

public static void main(String[] args){

	Pessoa p = new Pessoa();
	p.setNome("Rodrigo");
	System.out.println("Antes do método = "+p.getNome());
	alterarNome(p);
	System.out.println("Depois do método = "+p.getNome());

}

private static void alterarNome(Pessoa p){
	p = new Pessoa();
	p.setNome("João");
	System.out.println("Durante o método = "+p.getNome());
}

}[/code] Se for atribuído um novo valor à variável, eles não apontam mais para o mesmo objeto, ou seja, você pode alterar os atributos do objeto passado por parâmetro à vontade, e essa alteração será refletida no objeto de fora, agora se em algum momento for atribuído um novo valor à variável de referência dentro do método, esse novo objeto não é mais o mesmo que existe fora do escopo do método.

Espero que tenha ajudado.

[quote=digaoneves]Bom vamos lá… na prática, passar um tipo primitivo e um objeto é a mesma coisa.

em Java não exista passagem de parâmetro por referência (embora pareça existir), só existe passagem por valor, portanto você envia uma cópia daquilo que você tem, mas o que isso quer dizer na prática?

Vamos fazer uns testes e ver até aonde você pode brincar com isso.[code]public class Teste{

public static void main(String[] args){

	int num = 1;
	System.out.println("Antes do método = "+num);
	alterarNumero(num);
	System.out.println("Depois do método = "+num);

}

private static void alterarNumero(int num){
	num = 4;
	System.out.println("Durante o método = "+num);
}

}[/code] Se rodar esse código vai ver que durante o método, o valor é alterado, porém quando é finalizada sua execução, a variável num ainda aponta para o valor antigo, isso ocorre porque você passou simplesmente uma cópia do valor 1 e a variável num de dentro do método, não é a mesma que existe fora dele.

Agora com objetos é a mesma coisa, você envia uma cópia da referência do objeto, e é importante enfatizar que é uma cópia da referência.

Se 2 variáveis de referência apontam para o mesmo objeto, qualquer alteração feita nos atributos do objeto pode ser visualizada pelas 2 variáveis.

Veja o código a seguir:[code]public class Teste{

public static void main(String[] args){

	Pessoa p = new Pessoa();
	p.setNome("Rodrigo");
	System.out.println("Antes do método = "+p.getNome());
	alterarNome(p);
	System.out.println("Depois do método = "+p.getNome());

}

private static void alterarNome(Pessoa p){
	p.setNome("João");
	System.out.println("Durante o método = "+p.getNome());
}

}[/code]Se você executar esse código vai ver que o nome continua diferente após a execução do método, isso ocorre porque as 2 variáveis de referência apontam para o mesmo objeto, mesmo sabendo que o p de dentro do método não é o mesmo que o p de fora, ambos apontam para a mesma coisa, portanto podem alterá-lo a vontade.

E quanto ao fato de ser cópia, por que ele é relevante?

Ele é relevante no caso a seguir:[code]public class Teste{

public static void main(String[] args){

	Pessoa p = new Pessoa();
	p.setNome("Rodrigo");
	System.out.println("Antes do método = "+p.getNome());
	alterarNome(p);
	System.out.println("Depois do método = "+p.getNome());

}

private static void alterarNome(Pessoa p){
	p = new Pessoa();
	p.setNome("João");
	System.out.println("Durante o método = "+p.getNome());
}

}[/code] Se for atribuído um novo valor à variável, eles não apontam mais para o mesmo objeto, ou seja, você pode alterar os atributos do objeto passado por parâmetro à vontade, e essa alteração será refletida no objeto de fora, agora se em algum momento for atribuído um novo valor à variável de referência dentro do método, esse novo objeto não é mais o mesmo que existe fora do escopo do método.

Espero que tenha ajudado.[/quote]

Cara…que aula !!!

entendi sim!!! muito obrigado !!!

ai fico fácil agora srsrsr

ABS :smiley: