Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以编写一个Java printf语句来打印语句本身?_Java_Printf_Quine - Fatal编程技术网

是否可以编写一个Java printf语句来打印语句本身?

是否可以编写一个Java printf语句来打印语句本身?,java,printf,quine,Java,Printf,Quine,是否可以有一个Javaprintf语句,它的输出就是语句本身 下面是一些示例片段: // attempt #1 public class Main { public static void main(String[] args) { System.out.printf("something"); } } 这将打印某些内容 因此,尝试#1的输出并不完全是尝试#1中的printf语句。我们可以试试这样的方法: // attempt #2 public class Main { public s

是否可以有一个Java
printf
语句,它的输出就是语句本身

下面是一些示例片段:

// attempt #1
public class Main {
public static void main(String[] args) {

System.out.printf("something");

}
}
这将打印
某些内容

因此,尝试#1的输出并不完全是尝试#1中的
printf
语句。我们可以试试这样的方法:

// attempt #2
public class Main {
public static void main(String[] args) {

System.out.printf("System.out.printf(\"something\");");

}
}
现在输出是
System.out.printf(“某物”)

现在,trument#2的输出与输出#1中的语句匹配,但我们回到了以前的问题,因为我们需要trument#2的输出与trument#2中的语句匹配


那么,是否可以编写一行打印自己的
printf
语句呢

public class Main {
public static void main(String[] args) {

System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");

}
}
输出()是:

此输出与
printf
语句匹配

可能会有更短的解决方案

另见
    • %[argument\u index$]转换

System.out是一个静态PrintStream实例,可由inovking System.out.setOut(PrintStream s)用任何PrintStream替换。 因此,只需编写PrintStream的子类并重写必要的方法。 下面只是一个非常简单的示例。最好覆盖更多的方法

    public class VerbosePrintStream extends PrintStream{

        public VerbosePrintStream (PrintStream ps){
            super(ps, true);
        }

        @Override
        public void println(String x) {
            super.println("System.out.println(\""+x + "\");");
        }

    }
现在我们测试上述类:

VerbosePrintStream vps = new VerbosePrintStream(System.out);
    System.setOut(vps);
    System.out.println("test string");

这是一个更一般的概念的变体。@ire_和_curses:yes,这就是为什么我给它加上这样的标签。主要区别在于要求使用一行程序
printf
,因此不能在显式局部变量中存储任何内容。抱歉,我没有注意到您的标记。有趣的是,我们的想法是使用上面的基本代码框架,没有任何声明,局部变量或类型,没有其他语句,只要编写满足上述条件的
printf
语句即可。
VerbosePrintStream vps = new VerbosePrintStream(System.out);
    System.setOut(vps);
    System.out.println("test string");