使用类构造函数处理Java对象引用

Hay*_*dos 22 java

这是一个我无法完成的考试问题.

如何只通过编辑MyClass构造函数中的代码来获取以下java代码来打印false

public class MyClass{        
    public MyClass(){
    }

    public static void main(String[] args) {            
        MyClass m = new MyClass();
        System.out.println(m.equals(m));
    }
}
Run Code Online (Sandbox Code Playgroud)

不允许覆盖equals方法,或更改main方法中的任何代码.代码必须在程序崩溃的情况下运行.

根据我的研究,在实例化类时,不能将Java对象引用设置为null.所以我正式难过.

fla*_*kes 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));
}
Run Code Online (Sandbox Code Playgroud)

或Paul Boddington的简化版本:

PrintStream p = System.out; 
System.setOut(new PrintStream(p) { 
    @Override
    public void println(boolean b) { 
        p.println(false); 
    }
});
Run Code Online (Sandbox Code Playgroud)

  • @flkes进一步缩短它:`System.setOut(new PrintStream(System.out){@Override public void println(boolean b){super.println(false);}});`不需要`p`变量. (3认同)
  • @JohnnyWiller我觉得很聪明,这总是一个迹象表明我过于复杂的事情大声笑 (2认同)
  • 该死的你几分钟就打败了我!你可以简化一下.它可以是`final PrintStream p = System.out; System.setOut(new PrintStream(p){public void println(boolean b){p.println(false);}});` (2认同)

ars*_*jii 14

我想,沿着这些方向的东西:

public MyClass() {
    System.out.println(false);
    System.exit(0);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在Java Puzzlers中发现了一个与你的拼图非常相似的拼图,除了在那个问题中唯一的限制是你不能覆盖 equals,这基本上使得解决方案重载它而只是返回false.顺便提一下,我的上述解决方案也作为该难题的替代答案.

  • 如果*那个*是考试所要求的答案,这是一个糟糕的考试. (3认同)