Fundamentals - mais uma pergunta

16 respostas
R

Qual a saída ? e a explicação.

public class TestArg {

	int a ;
	int b;
	
	public void f(){
		a = 0;
		b = 0;
		int []c ={0};
		g(b,c);
		System.out.println( "a = " + a + " b = " + b  + " c = " + c[0]);
		
	}
	
	public void g(int b, int []c){
		a = 1;
		b = 1;
		c[0] = 1;
	}
	
	public static void main(String[] args) {
		TestArg test = new TestArg();
		test.f();
	}
	
}

A - 0 0 0
B - 0 0 1
C - 0 1 0
D - 1 0 0
E - 1 0 1

16 Respostas

anderson.bonavides

Letra E.

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 :slight_smile:

francislon

Realmente, o anderson.bonavides tem razão :slight_smile:
Sorry.

R

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

public class TestArg {  
     
       int a ;  
       int b;  
         
       public void f(){  
           a = 0;  
           b = 0;  
           int []c ={0};  
           g(b,c);  
           System.out.println( "a = " + a + " b = " + b  + " c = " + c[0]);  
             
       }  
         
       public void g(int b, int []c){  
           a = 1;  
           b = 1;  
           c[0] = 1;
           c = {4};
       }  
         
       public static void main(String[] args) {  
           TestArg test = new TestArg();  
          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 = int c[] = {5}

invalido = int c[];

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!!!

adriano_si

Valew cara…

Criado 25 de fevereiro de 2008
Ultima resposta 28 de fev. de 2008
Respostas 16
Participantes 6