2016-04-01 5 views
22

これは私が完了できなかった試験問題でした。クラスコンストラクタを使用してJavaオブジェクトリファレンスを操作する

どのようにあなたがMyClassのコンストラクタ内のみ 編集コードによってを印刷するには、次のJavaコードを得るのですか?

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に設定することはできません。だから私は正式に困っている。

+13

'System.out.println(false);';) – Reimeus

+0

さて、 'equals()'メソッドとは何ですか? – Gendarme

+0

これはJava Puzzlersのパズルだと思います。私は間違いなく前にそれを見た。 –

答えて

14

私は推測するこれらの線に沿って何か、:

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

EDIT:その質問に唯一の制限は、あなたがいないということでした除いて、私は、Java Puzzlersにあなたに非常に似てパズルを見つけましたと等しくなります。これは基本的に解決策をに設定して、となり、単にfalseを返します。ちなみに、上記の私の解決策も、そのパズルに対する代替の答えとして与えられました。

+3

もし* that *が試験の答えだったら、それは悪い試験です。 – Raedwald

17

これは厳しいものでした。

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

それともポールBoddingtonの簡易版:

PrintStream p = System.out; 
System.setOut(new PrintStream(p) { 
    @Override 
    public void println(boolean b) { 
     p.println(false); 
    } 
}); 
+4

haha​​hahah私はこの答えに笑った –

+2

@JohnnyWiller私は常に私が事をovercomplicatingだと思っている兆候である賢い感じる – flakes

+0

あなたの創造性を証明に入れて良い方法 –

4

別の解決策は、文字列リテラル"true"に遭遇されることが必要であるため、最初の行が必要な

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クラス内のthis questionを参照してください。

+0

'println(boolean b)'を呼び出すときに、静的コードを読み込む必要があります。非常に興味深い – flakes

+0

Javaを 'intern()'に 'String(" true ")'をプールに入れる必要があるようです。同じ効果を達成するために、 'String t =" true "'のようなことをやってしまう可能性があります。 –

+1

@BorisTheSpider奇妙なことに、うまくいきません。 * right * '' true ''リテラル、つまり' PrintStream'クラスのものに遭遇しなければならないようです。これがどれほど奇妙であるかの真の程度については、リンクされた質問を参照してください。 –

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ソリューションのバリエーションです。

関連する問題