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().

Aqui está a minha dúvida:

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.

Para mim, nunca trabalhei em nenhum projecto em que a exigência fosse assim. Desde que, se eu tiver um requisito como este, eu realmente não sei como resolvê-lo.

Alguém me pode explicar como se faz?

Author: Tom, 2013-06-15

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());
 15
Author: Pavel Horal, 2017-09-07 15:10:44

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.

 3
Author: Devolus, 2013-06-15 08:05:07

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().

 0
Author: Bhesh Gurung, 2013-06-15 07:49:25

É 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

 0
Author: ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, 2013-06-15 07:54:36

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)

 0
Author: mahery rafara, 2013-06-15 09:36:04
Evidentemente, o compilador foi feito de uma forma confusa, embora os desenvolvedores do compilador achassem que adicionavam alguma esperteza. A verdadeira esperteza que eles devem realmente adicionar é olhar argumento inteiro e interpretar operador + consistentemente. Por exemplo, System.out.println(1+2+"hello"+3+4); deve sair 3hello7 em vez de 3hello34
 0
Author: Shoujie He, 2017-09-07 15:05:50
É um ponto muito sensível para entender como funciona o sistema.as.imprimir. Se o primeiro elemento é String então operador plus (+) funciona como Operador de Strig concate. Se o primeiro elemento for inteiro mais (+), o operador funciona como operador matemático.
public static void main(String args[]) {
        System.out.println("String" + 8 + 8); //String88
        System.out.println(8 + 8+ "String"); //16String
    }
 0
Author: Samet öztoprak, 2018-01-11 11:25:23