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

时间:2016-04-01 20:48:50

标签: java

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

  

如何获得以下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。所以我正式难倒。

4 个答案:

答案 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解决方案的变体。