当前位置: 首页 > 知识库问答 >
问题:

使用类构造函数操作Java对象引用

祁和通
2023-03-14

这是一道我无法完成的试题。

如何仅通过编辑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。所以我正式被难倒了。

共有3个答案

袁雅逸
2023-03-14

另一个解决方案是

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

之所以需要第一行,是因为在修改支持数组之前,PrintStream类中必须遇到字符串literal“true”。看这个问题。

裴俊智
2023-03-14

我猜大致是这样的:

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

编辑:我在Java拼图中发现了一个与你的拼图非常相似的拼图,除了这个问题,唯一的限制是你不能覆盖equals,这基本上使解决方案重载它,只返回false。顺便说一句,我上面的解决方案也是这个谜题的另一个答案。

宋成天
2023-03-14

太难了!!

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); 
    }
});
 类似资料:
  • 问题内容: 这是我无法完成的考试问题。 如何通过仅在MyClass构造函数中编辑代码来获取以下Java代码以打印false? 不允许您覆盖equals方法或更改main方法中的任何代码。该代码必须在程序不崩溃的情况下运行。 根据我的研究,实例化类时不能将Java对象引用设置为null。所以我正式陷入了困境。 问题答案: 太难了! 或Paul Boddington的简化版本: 或是AJ Neufel

  • 类 类是对某一事物的抽象描述,具体地讲,类是C++中的一种构造的数据类型。它即可包含描述事物的数据,又可包含处理这些数据的函数,类在程序运行时是被用作样板来建立对象的。所以要建立对象,首先必须定义类。 定义类 定义一个类的一般格式为: class 类名{     private:         成员表1;     public:         成员表2;     protected:     

  • 在hibernate的xml方法中,创建hibernate SessionFactory对象时使用

  • 问题内容: 假设我们有一个类型为变量的变量,它返回一个整数数组: 使用Java 8泛型,可以使用如下构造函数引用来初始化此变量: Java编译器如何将其转换为字节码? 我知道对于其他类型,例如,它可以使用指向String构造函数的指令,这只是一种具有特殊含义的方法。 看到有构造数组的特殊说明,这对数组如何工作? 问题答案: 您可以通过反编译Java字节码来发现自己: 编译器对数组lambda()进

  • 问题内容: 我有这样的事情: 如您所见,超类的init方法是抽象的,并在创建对象后由构造函数自动调用。 当我需要创建这种类型的对象且其结构不会及时更改时,我很好奇我是否会遇到这样的代码问题。 有什么更好的办法吗?它可以在Java中运行,但是可以在C ++和ActionScript中运行吗? 谢谢你的答案。 问题答案: 请勿从构造函数中调用过多的方法。 引用 有效Java 2nd Edition,条

  • 生成类对象时,其成员可以用类的构造函数初始化。构造函数是与类同名的成员函数。程序员提供的构造函数在每次生成类对象(实例化)时自动调用。构造函数可以重载.提供初始化类对象的不同方法。数据成员应在类的构造函数中初始化或在生成对象之后设置其数值。 常见编程错误 6.7 类的数据成员只能在类定义中初始化。 常见编程错误 6.8 试图声明构造函数的返回类型和返回植是个语法错误。 编程技巧 6.5 适当时候(