Analise o seguinte programa desenvolvido na linguagem Java: ...
Assinale a opção que corresponde à saída CORRETA gerada pelo programa:
Comentários
Veja os comentários dos nossos alunos
public static String linha1;
public String linha2;
public static void main (String[] args) {
Principal p1 = new Principal();
linha1 = "Linha 01";
p1.linha2 = "Linha 02";
String linha3 = "Linha 03";
System.out.println(linha1 + ' / ' + p1.linha2 + ' / ' + linha3);
-> Linha 01 / Linha 02 / Linha 03
p1.montaLinha();
System.out.println(linha1 + ' / ' + p1.linha2 + ' / ' + linha3);
-> Linha 04 / Linha 02 / Linha 03
}
public String montaLinha() {
Principal p2 = new Principal();
linha1 = "Linha 04";
p2.linha2 = "Linha 05";
String linha3 = "Linha 06";
String resultado = linha1 + ' / ' + p2.linha2 + ' / ' + linha3;
System.out.println(resultado);
-> Linha 04 / Linha 05 / Linha 06
return resultado;
}
}
A variável linha1 é uma variável estática (variável de classe). Ou seja, quando ela é alterada no método main e no método montaLinha, é a mesma variável.
Ele também quis confundir com a variável linha3. Elas são variáveis locais, logo são diferentes nos dois métodos.
Não perdi meu tempo testando este código em um compilador Java. Mas eu acho que o código não compila! O método montaLista() não é estático mas está acessando uma variável estática. Isso vai dar erro de compilação na linha "linha1='Linha 04' "
Wagner,
Testei no eclipse e o código compila. Realmente, isso é um assunto que causa dúvida.
Geraria erro se um método estático estivesse utilizando uma variável não estática, conforme abaixo:
1. public class Principal {
2. public String linha 3;
3. public static void main {
4. linha3 = "Linha 3"; // --> Erro de compilação aqui! Cannot make a static reference to the non-static field linha3.
5. Principal p1 = new Principal();
6. p1.linha3 = "Linha3"; // --> Não dá erro de compilação, mas emite warning aqui! The static field Principal.linha3 should be acessed in a static way
7. Principal.linha3 = "Linha3"; // --> Maneira correta de se fazer para acessar um atributo estático. Sem erro e sem warning.
8. }
9. }
Já o contrário não tem problema nenhum, isto é, ao acessar um atributo estático dentro de um método não estático não ocorre nenhum erro de compilação. Pode até ocorrer um warning, conforme exibido na linha 6 do código acima, mas erro de compilação nunca ocorrerá por estar acessando um atributo estático.
É importante notar que, nesse caso, só foi possível acessar o atributo estático linha1 diretamente de dentro do método montaLinha, porque este método está dentro da própria classe que possui a declaração de linha1. Se o método montaLinha estivesse em outra classe, somente poderíamos acessar linha1 através de:
Principal p = new Principal();
p.linha1 = "xxx"; // emite warning, mas compila.
OU
Principal.linha1 = "xxx";
Mas jamais poderíamos usar: linha1 = "xxx", uma vez que o método estando em outra classe não reconheceria a variável linha1, causando erro de compilação.
Tentarei ser clara na minha explicação mas me dêem um desconto pois não sou programadora!!!!
Primeira impressão: linha1 = "Linha01" , p1.linha2 = "Linha02" e linha3 = "Linha03"
Segunda impressão: linha1 = "Linha04" , p2.linha2 = "Linha05" e linha3 = "Linha06"
O método montaLinha altera linha1, que é estático para toda a classe. Com isso altera o de fora do método principal também
Por sua vez, p2.linha2 não tem nada a ver com p1.linha2. Assim, imprime Linha05 sem ter alterado em nada p1.linha2.
Lá linha3 é exclusivo do método, isto é, não altera em nada o linha3 de antes (que não é estático). Por isso não altera o linha3 do método principal.
Terceira impressão: linha1 = "Linha04" , p1.linha2 = "Linha02" e linha3 = "Linha03"
linha 1 foi alterado antes, lembram??? Aí continua como linha04.
p1.linha2 não foi alterado em nada. Continua Linha02
linha3não foi alterado em nada. Continua Linha03
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo