Como funciona o sistema?as.impressão () trabalho?
já trabalho com Java há bastante tempo, e estava a pensar como funciona a função System.out.print()
.
Sendo uma função, tem uma declaração algures no Pacoteio . Mas como os desenvolvedores Java fizeram isso, uma vez que esta função pode levar em qualquer número de argumentos e qualquer tipo de argumento, não importa como eles são organizados? p. ex.:
System.out.print("Hello World");
System.out.print("My name is" + foo);
System.out.print("Sum of " + a + "and " + b + "is " + c);
System.out.print("Total USD is " + usd);
não importa qual seja o tipo de dados das variáveis {[[2]} ou como elas são passadas, System.out.print()
nunca joga erro.
7 answers
System.out
é apenas um exemplo de PrintStream
. Você pode verificar seu JavaDoc . A sua variabilidade baseia-se na sobrecarga do método (múltiplos métodos com o mesmo nome, mas com parâmetros diferentes).
Este fluxo de impressão está a enviar o seu resultado para o chamado saída-padrão.
Na sua pergunta, menciona uma técnica chamada funções variádicas (ou varargs ). Infelizmente isso é não é suportado por
PrintStream#print
, por isso deves estar a confundir isto com outra coisa. No entanto, é muito fácil implementá-los em Java. Basta verificar a documentação.
E se você está curioso como Java sabe concatenar variáveis não-string "foo" + 1 + true + myObj
, é principalmente responsabilidade de um compilador Java.
Quando não há nenhuma variável envolvida na concatenação,o compilador simplesmente concatenata a cadeia. Quando há uma variável envolvida, a concatenação é traduzido para StringBuilder#append
corrente. Não há instrução de concatenação no código byte resultante; ou seja, o operador +
(quando se fala de concatenação de string) é resolvido durante a compilação.
Todos os tipos em Java podem ser convertidos para string (int
via methods in Integer
class, boolean
via methods in Boolean
class, objects via their own #toString
,...). Você pode verificar o código fonte do StringBuilder se você estiver interessado.
Eu próprio estava curioso. e verificado (usando javap ) em que o meu exemplo System.out.println("foo" + 1 + true + myObj)
compila. O resultado:
System.out.println(new StringBuilder("foo1true").append(myObj).toString());
Mesmo que pareça como se System.put.print...()
tomasse um número variável de argumentos, isso não acontece. se você olhar de perto, a cadeia de caracteres é simplesmente concatenada e você pode fazer o mesmo com qualquer cadeia de caracteres. A única coisa que acontece é que os objetos que você está passando, são implicitamente convertidos para uma string por java chamando o método toString()
.
Se você tentar fazer isso vai falhar:
int i = 0;
String s = i;
System.out.println(s);
A razão é, porque aqui a conversão implícita não é feita.
No entanto, se o alterar a
int i = 0;
String s = ""+i;
System.out.println(s);
Funciona e isto é o que acontece quando se usa System.put.print...()
também.
Se quiser implementar um número variável de argumentos em java para mimimc algo como C printf
, pode declará-lo assim:
public void t(String s, String ... args)
{
String val = args[1];
}
O que acontece aqui é que uma série de cadeias é passada para dentro, com o comprimento dos argumentos fornecidos. Aqui Java pode fazer a verificação do tipo para você.
Se queres mesmo uma impressão, então tens de o fazer assim:
public void t(String s, Object ... args)
{
String val = args[1].toString();
}
Então você teria apresentar ou interpretar os argumentos em conformidade.
Acho que estás confuso com o printf(String format, Object... args)
método. O primeiro argumento é o texto de formato, que é obrigatório, descanso você pode passar um número arbitrário de Object
s.
Não existe tal sobrecarga para ambos os métodos print()
e println()
.
É tudo sobre Método de sobrecarga .
Existem métodos individuais para cada tipo de dados no método println()
Se passar o objecto:
Imprime um objecto e termina a linha. Este método chama na primeira String.value of (x) to get the printed object's string value, then behaves as then invokes print(String) and then println ().
Se passar o tipo primitivo:
Correspondente primitivo chamadas do método do tipo
Se passar o texto:
O método println(String x) correspondente chama
Você pode converter qualquer coisa para uma String, desde que você escolha o que imprimir. O requisito era bastante simples, uma vez que Objet.toString()
Pode devolver um texto mudo por omissão: package.classname + @ + object number
.
Se o seu método de impressão retornasse uma serialização XML ou JSON, o resultado básico de toString() não seria aceitável. Mesmo que o método tenha sucesso.
Aqui está um exemplo simples para mostrar que Java pode ser burro
public class MockTest{
String field1;
String field2;
public MockTest(String field1,String field2){
this.field1=field1;
this.field2=field2;
}
}
System.out.println(new MockTest("a","b");
Vai imprimir algo package.Mocktest@3254487
! Mesmo que você só tenha dois membros de cordas e isto poderia ser implementado para imprimir
Mocktest@3254487{"field1":"a","field2":"b"}
(ou praticamente como aparece no debbuger)
System.out.println(1+2+"hello"+3+4);
deve sair 3hello7
em vez de 3hello34
public static void main(String args[]) {
System.out.println("String" + 8 + 8); //String88
System.out.println(8 + 8+ "String"); //16String
}