2

到達できないコードを記述すると、Java コンパイラがエラーを出します。例えば

public void go()
{
    return;
    System.out.println("unreachable");
}

ただし、どこからも到達できない匿名クラスで新しいメソッドを定義すると、コンパイラは文句を言いません。それはあなたがそれをすることを可能にします、なぜですか?例えば、

class A
{
   public void go()
   {
     System.out.println("reachable - A");
   }
}
class B
{
   public static void main(String [] args)
   {
     A a = new A() {
              public void go()
              {
                System.out.println("reachable - B");
              }
              public void foo()
              {
                System.out.println("unreachable - B");
              }
           };
     a.go(); // valid
     a.foo(); // invalid, compiler error
  }
}
4

4 に答える 4

5

まず第一に、Eclipsefoo()ローカルで使用されていないことを my に通知します。ただし、他の回答者が指摘した理由により、これは警告でありエラーではありません。

に到達する方法があることに注意してくださいfoo()

new A() {
      public void go()
      {
        System.out.println("reachable - B");
      }
      public void foo()
      {
        System.out.println("unreachable - B");
      }
}.foo();

式の型はではnew A() {}なくA、実際には の匿名サブクラスであるため、これは機能しAます。そして、そのサブクラスには publicfooメソッドがあります。

同じ型の変数を持つことはできないため、変数foo()からこの方法でアクセスすることはできません。

于 2011-01-21T08:14:55.177 に答える
5

これは、実際には、クラス内のどこでも呼び出されないプライベート メソッドを作成できるようにすることと同じです。これはまったく同じ意味で到達不能なコードではなく、リフレクションによってアクセスできます。

これは合理的に警告を発するようなものです (特に、警告を非常にきめ細かく調整できる IDE では) が、エラーであってはならないと思います。

于 2011-01-21T08:09:26.050 に答える
4

foo()原則として、リフレクションを介してメソッドを呼び出すことができるaため、常に到達できないとは限りません。

後にこれを試してくださいa.go();

Method m = a.getClass().getDeclaredMethod("foo");
m.invoke(a);
于 2011-01-21T08:09:14.137 に答える
0
public void go()
{
   foo();
   System.out.println("reachable - B");
}

public void foo()
{
   System.out.println("unreachable - B");
}

foo メソッドに到達する別の方法は、クラスの別のメソッドを使用することです。質問する前にこれを理解しておくべきでした。ごめん。

于 2011-01-21T12:50:29.273 に答える