tangguo

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

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));
    }
}

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

根据我的研究,实例化类时不能将Java对象引用设置为null。所以我正式陷入了困境。


阅读 361

收藏
2020-10-26

共2个答案

小编典典

太难了!

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); 
    }
});

或是AJ Neufeld的更简单建议:

System.setOut(new PrintStream(System.out) { 
    @Override
    public void println(boolean b) { 
        super.println(false); 
    }
});
2020-10-26
小编典典

按照这些思路,我会猜测:

public MyClass() {
    System.out.println(false);
    System.exit(0);
}

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

2020-10-26