Parametros

7 respostas
carlosaandrade

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:

7 Respostas

Rodrigo_Sasaki

Como assim diferença?

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.

caio_ferreira

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.
}
carlosaandrade

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.

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?

asousaj

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?

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!

Rodrigo_Sasaki

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.
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);
	}

}
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:
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());
	}

}
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:
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());
	}

}
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.

carlosaandrade
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.
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);
	}

}
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:
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());
	}

}
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:
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());
	}

}
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.

Cara.....que aula !!!!

entendi sim!!!!! muito obrigado !!!!

ai fico fácil agora srsrsr

ABS :D

Criado 10 de setembro de 2012
Ultima resposta 10 de set. de 2012
Respostas 7
Participantes 4