Parâmetros de um método

Pessoal, estou com uma dúvida : o Java passa parâmetros por valor. Então isso significa que quando envio uma variável pelo parâmetro na verdade estou enviando uma cópia dela,certo?
Então por que quando envio um vetor de inteiros os valores são alterados, diferentemente de quando envio um inteiro sozinho? Isso tem a ver com o vetor ser na verdade um objeto ao inves de um tipo primitivo?

class ABC {		
	static void somaUmVetor(int[] a){
	a[0]+=1;
	a[1]+=1;		
	}
	
	static void somaUm(int a){
	 a+=1;
	}
}

public class testaMudanca{
	
	public static void main(String [] args){
		
		int valorUnitario = 1;
		int[] vetor = new int[2];
		vetor[0] = 2;
		vetor[1] = 3;
		
		ABC.somaUmVetor(vetor);		
		ABC.somaUm(valorUnitario);
			
		System.out.println(valorUnitario);		
		System.out.println(vetor[0]);
		System.out.println(vetor[1]);
	}
}

Agradeço a ajuda.

Exatamente, objetos em java são passados por copia de referencia, ou seja, se vc alterar seu estado dentro de um método (sendo que vc o passou por parametro), ele continuara alterado fora dele.

Complementando…

o Java passa parâmetros SOMENTE por valor.

visite este link:

http://www.guj.com.br/posts/list/46065.java#241584

fw

[quote=Dieval Guizelini]Complementando…

o Java passa parâmetros SOMENTE por valor.

visite este link:

http://www.guj.com.br/posts/list/46065.java#241584

fw[/quote]

Errata a passagem de parametros em Java é pela cópia da referência isso se refere a objetos.
Já tipos primitivos(int , float , long e etc) a passagem por valor.

é isso flavio os vetores ou arrays como queria chamar eles sao passagem de valor por referencia ou seja alterou o objeto altera o que ta no metodo tb. Porque no fundo no fundo os arrays sao objetos, qdo vc faz isso

int[]array = new int [2];

isso na verdade é um objeto, mas a questao ai eh que ele recebe elementos inteiros, ou elementos que pode ser convertido para um int. mias isso ai nunca é um tipo primitivo.
E se vc passar um tipo primitivo vc passa apenas a copia dos bits… nao tem nada ver com o objeto que original. Faça um teste abra o word digite o que quiser copie e cole em outra pagina do word altere o primeiro texto e veja se o segundo altera? claro que nao… agora vá no excel crie uma tabela e crie um grafico dessa tabela altere a tabela e veja se ografico tb no muda?
percebe como funciona?

ehhe espero ter ajudado…

[quote=ramilani12][quote=Dieval Guizelini]Complementando…

o Java passa parâmetros SOMENTE por valor.

visite este link:

http://www.guj.com.br/posts/list/46065.java#241584

fw[/quote]

Errata a passagem de parametros em Java é pela cópia da referência isso se refere a objetos.
Já tipos primitivos(int , float , long e etc) a passagem por valor.[/quote]
ramilani12, você está equivocado com relação a este conceito.
Cópia de referência não é passagem de parametros por referência.

Veja esta situação:

1. public void metodoX() { 2. ClasseQualquer obj = new ClasseQualquer(); 3. ClasseQualquer obj2 = obj; 4. metodoY( obj ); 5. if( obj == obj2 ) 6. System.out.println("O objeto é o mesmo"); 7. } 8. 9. public void metodoY(ClasseQualquer param1 ) { 10. param1 = new ClasseQualquer(); 11. }

Observe que na linha 2, a variável obj é mantida no stack e a instância (o objeto propriamente dito) no heap. A variável possui o endereço do objeto no heap.
Na linha 3, fazemos com que o endereço de obj seja compartilhado com obj2. Ou seja, obj2 aponta para o mesmo endereço que obj.

na linha 4 passamos o objeto como parâmetro certo?
Errado, o que estamos passando é a referência ao objeto. Ou seja, tudo que ocorrer com o objeto representado por param1 estará ocorrendo também com o obj, isto porque é o mesmo objeto.

Mas não podemos considerar isto como passagem por referência, porque simplesmente não podemos “realocar” este objeto. No exemplo, a nova instância (criada na linha 10) ficará a disposição do gc assim que o método encerrar. Pela mesma razão não é possível, por exemplo, criar um método que “amplie” um array. Porque a nova array será um novo objeto e ficará a disposição do gc assim que o método for finalizado.

Se preferir a documentação oficial da SUN, veja este trecho:

[quote]Reference data type parameters, such as objects, are also passed into methods by value. This means that when the method returns, the passed-in reference still references the same object as before. However, the values of the object’s fields can be changed in the method, if they have the proper access level. [/quote] (negrito meu)

ou visite a página:

http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html

Boa sorte gente.

fw

Valeu pela ajuda,pessoal!

[quote=ramilani12][quote=Dieval Guizelini]Complementando…

o Java passa parâmetros SOMENTE por valor.

visite este link:

http://www.guj.com.br/posts/list/46065.java#241584

fw[/quote]

Errata a passagem de parametros em Java é pela cópia da referência isso se refere a objetos.
Já tipos primitivos(int , float , long e etc) a passagem por valor.[/quote]

Não entendi o que você quis dizer.

Variáveis no Java são sim passadas SOMENTE por valor.

Ocorre que, uma variável que referencia um objeto é, na verdade, apenas uma referência a esse objeto.

int i = 3;
// neste caso, a variável i recebe o valor 3.
// quando essa variável for passada a algum método, o método
// receberá o valor 3, <=> 3.

int[] i = { 1, 2, 3 };
// neste caso, a variável i contém APENAS uma REFERÊNCIA ao
// objeto que representa um Array na memória
// ou seja, o valor da variável não passa de uma referência
// reitero: o VALOR da variável é uma REFERÊNCIA

// quando eu passar essa variável para um método,
// seguindo as regras do Java, apenas o valor da variável
// será passado ao método
// então, o VALOR da variável é uma REFERÊNCIA
// e, portanto, qualquer alteração no Array feita dentro do método
// afetará também o array i[], pois tanto i[] quanto a variável dentro
// do método proposto conterão referências ao mesmo objeto
// na memória, que é { 1, 2, 3 }

“<=>” = “só e somente só”;