这是一个我无法完成的考试问题。
如何获得以下java代码以仅打印 false 编辑 MyClass 构造函数中的代码?
public class MyClass{ public MyClass(){ } public static void main(String[] args) { MyClass m = new MyClass(); System.out.println(m.equals(m)); } }
您不得覆盖 equals 方法,或更改任何方法 main方法中的代码。代码必须在没有程序的情况下运行 崩溃。
根据我的研究,在实例化类时,不能将Java对象引用设置为null。所以我正式难倒。
答案 0 :(得分:18)
那很难!!
public MyClass() {
System.setOut(new PrintStream(new FilterOutputStream(System.out) {
@Override
public void write(byte[] b, int off, int len) throws IOException {
if(new String(b).contains("true")) {
byte[] text = "false".getBytes();
super.write(text, 0, text.length);
}
else {
super.write(b, off, len);
}
}
}, true));
}
或Paul Boddington的简化版:
PrintStream p = System.out;
System.setOut(new PrintStream(p) {
@Override
public void println(boolean b) {
p.println(false);
}
});
答案 1 :(得分:14)
我猜这些方面的东西:
public MyClass() {
System.out.println(false);
System.exit(0);
}
编辑:我在Java Puzzlers找到了一个非常类似的拼图,除了那个问题,唯一的限制是你不能覆盖等于基本上使重载的解决方案反而只返回false
。顺便说一句,我的上述解决方案也作为该难题的替代答案。
答案 2 :(得分:4)
另一种解决方案是
public MyClass() {
new PrintStream(new ByteArrayOutputStream()).println(true);
try {
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
f.set("true", f.get("false"));
} catch (Exception e) {
}
}
需要第一行,因为在修改后备数组之前,必须在"true"
类中遇到字符串文字PrintStream
。请参阅this question。
答案 3 :(得分:1)
这是我的解决方案
public class MyClass {
public MyClass() {
System.out.println("false");
// New class
class NewPrintStream extends PrintStream {
public NewPrintStream(OutputStream out) {
super(out);
}
@Override
public void println(boolean b) {
// Do nothing
}
}
NewPrintStream nps = new NewPrintStream(System.out);
System.setOut(nps);
}
public static void main(String[] args) {
MyClass m = new MyClass();
System.out.println(m.equals(m));
}
}
基本上,这是@fikes解决方案的变体。