2017-10-24 2 views
1

に新しいメソッドを追加する例を次に示します。匿名class.Weがクラスmethods.Thisをオーバーライドするためにそれを使用することができますについて私が知っている既存のクラス

public class User { 
    private final String name; 
    public User(final String name){ 
     this.name=name; 
    } 
    public void sayHello(){ 
     System.out.println("Hello : "+name); 
    } 
    public static void main(String[] args) { 
     User s = new User("CHORT"){ 
     @Override 
     public void sayHello(){ 
      System.out.println("HELLO FROM ANONYMOUS CLASS"); 
     } 
    }; 

    } 
} 

しかし、私は、次のcontructionも(正しいで強調されていないことに気づきました私のIDEA)

public class User { 
    private final String name; 
    public User(final String name){ 
     this.name=name; 
    } 
    public void sayHello(){ 
     System.out.println("Hello : "+name); 
    } 
    public static void main(String[] args) { 
     User s = new User("CHORT"){ 

     public void sayHello2(){ 
      System.out.println("HELLO FROM ANONYMOUS CLASS"); 
     } 
    }; 

    } 
} 

しかし、私は、メソッドsayHello2を呼び出したいとき、IDEAは、このcontructionの目的exist.Whatでいないことを私に示して?

答えて

4

まず、質問のタイトルが間違っています。あなたは "既存のクラスに新しいメソッドを追加"しませんでした。既存のクラスを拡張する匿名クラスにメソッドを追加しました。

匿名クラスには、通常のクラスが行うすべてのメソッドを含めることができます。彼らは、拡張するクラスのメソッドまたは実装するインタフェースだけを含む必要はありません。

したがって、匿名クラスにsayHello2を定義することは完全に有効ですが、匿名クラス本体の外側からそのメソッドを呼び出すことはできないため、非常に役に立たなくなります。

(それはとにかく外から呼び出すことができないため、あなたはそれprivate行うことができます)あなたが匿名クラス本体内から呼び出すない一方、それが有用であることができます。

User s = new User("CHORT") { 
    @Override 
    public void sayHello() { 
     sayHello2(); 
    } 
    private void sayHello2() { 
     System.out.println("HELLO FROM ANONYMOUS CLASS"); 
    } 
}; 

EDIT:私が考えていたもう一つのことは、おそらく反射を使ってsayHello2を外部から呼び出すことができますが、どうしてそうしたいのか分かりません。

関連する問題