publicclassTestArg{inta;intb;publicvoidf(){a=0;b=0;int[]c={0};g(b,c);System.out.println("a = "+a+" b = "+b+" c = "+c[0]);}publicvoidg(intb,int[]c){a=1;b=1;c[0]=1;}publicstaticvoidmain(String[]args){TestArgtest=newTestArg();test.f();}}
Explicação: A variavel a e b da classe são globais estão visivel a todo bloco. Porém existe uma variável local b que confunde a logica do programa. Ela recebe o valor 1 e preste novamente atenção a variavel local do método g tem o valor 1 porem a variavel global da classe ainda tem o valor zero. Sobre o array de inteiros não lembro muito bem mas quado vc passa uma variável vc passa a copia e ambos apontam para o mesmo objeto no heap porém quando vc altera um valor altera pros dois já que apontam para o mesmo local.
Axo que é isso qualquer coisa é só perguntar. Vlw t+
francislon
A resposta é a letra D.
Vejamos:
No main você apenas chama o metodo f();
No f você atribui os seguintes resultados às variaveis de instancia:
a = 0;
b = 0;
int []c ={0};
Logo neste momento nossas variaveis de instancia tem os valores citados acima.
Depois nós enviamos os valores da variavel ‘b’ e ‘c’ para o metodo g(). No metodo g nós modificamos os valores das variaveis novamente. Porém percebamos que modificamos apenas a variavel de instancia ‘a’, os atributos ‘b’ e ‘c’ modificados são apenas de escopo local.
Retornando o controle do programa ao metodo f(), nós imprimiremos os valores a = 1(modificado no metodo g), b = 0(sem modificação no metodo g) e c = 0(tb sem modificação no metodo g).
Se eu estiver errado me corrijam
francislon
Realmente, o anderson.bonavides tem razão
Sorry.
R
rogsousap
A resposta correta é a E, valeu pela explicação.
LPJava
é isso anderson pq array sao objetos. sempre objeto…
Entao como ele alterou ali o array dentro do escopo flete no que foi passado no args do metodo o restante é a velha pegadinha de escopo… o exame é recheado de pegadinha de escopo… de class, variaveis etc… muitas nao chega a compilar porem tem umas que tem o resultado dessa forma… essas questoes nao pode demorar muito nela na primeira vez… pq chega dar ate dor de cabeça… e vc nao pode ficar com dor de cabeça… nas primeiras questoes no exame senao vai prejudicar as demais… vc olha… analisa e marca a que achar na segunda revisao… vc vai e analisa com mais calma… so uma dica para quem vai fazer o exame…
anderson.bonavides
\o/
marlon_patrick
o que devemos ter em mente é que…
em JAVA parametros de metodos são sempre por valor…uma simples copia que não altera
a variavel passada como parametro…
então…não importa o que façamos com elas nos metodos…saindo deles…retomam o valor que tinha antes da chamada do metodo…
até mesmo para variáveis de referencia a objetos…
preste atenção…
a variável não pode ser alterada, ou seja,saindo do método, não importa o que tenha feito la dentro ela estará apontando
para o mesmo objeto que apontava antes da chamada…
isso não significa que o objeto não possa ser alterado, ou seja…se o estado do objeto sefrer alterações…essas serão mantidas msm depois do fim do metodo.
adriano_si
não é a D não ?? se o objeto recebe uma cópia, recebe uma cópia da Referência ao objeto que está no Heap, esse objeto de Array do Heap está com o valor 0… quando passo o valor 1, o elemento[0] do Array, de dentro do método g(), esse valor também é alterado no Objeto ??? me perdi agora…
marlon_patrick
Cara…vê a ultima coisa que eu falei a cima…
um array é um objeto…
ele foi passado como parametro…e lá dentro o ESTADO DO OBJETO sofreu alteração…
então…esta alteração terá efeito mesmo depois do metodo acabar…
o que não teria efeito quando o metodo acabasse era se c[] recebesse outro array…passasse a apontar para outro objeto array dentro do metodo…e depois que sair do metodo continuar apontando para o array que recebeu no metodo…
se fosse o caso de c[] ter recebido outro array dentro do metodo…
então quando o metodo acabasse c[] voltaria a apontar pro array criado no primeiro metodo.
adriano_si
Entendiii....
Então pelo que você disse
publicclassTestArg{inta;intb;publicvoidf(){a=0;b=0;int[]c={0};g(b,c);System.out.println("a = "+a+" b = "+b+" c = "+c[0]);}publicvoidg(intb,int[]c){a=1;b=1;c[0]=1;c={4};}publicstaticvoidmain(String[]args){TestArgtest=newTestArg();test.f();}}
Mesmo que eu colocasse o
c={4};
A saída seria a mesma... certo ??
marlon_patrick
Exatamente…
agora…
so mais uma dica…
c={4}…não é válido…só podemos usar essa sintaxe para criação de um array na hora da declaração
valido=intc[]={5}invalido=intc[];c={10};
blza??
adriano_si
Uou… outro assunto…
Não é criado localmente ao ser criado no parâmetro ??
marlon_patrick
adriano_si:
Uou… outro assunto…
Não é criado localmente ao ser criado no parâmetro ??
não entendi a pergunta…
explica melhor…
adriano_si
O Array int[] c; não é declarado na lista de Parâmetros ?? ou não é válido esse tipo de criação ???
marlon_patrick
Para ser válido é necessário que se delcare e inicialize o array na mesma hora.
Declarar…e depois tentar inicializar dessa maneira vai dar erro…
joga isso no Eclipse que ele te fala tudo!!!