2

私はJavaを学び始めたばかりで、通常のクラスのメソッドを呼び出すにはオブジェクトが必要ですが、静的クラスの場合、オブジェクトを呼び出す必要はなく、クラス参照を使用してそれを行うことができることがわかりました。しかし、コーディング中に、本当に混乱するコードに出くわしました。コードは。

public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
String result = actionInvocation.invoke();

ここで私の疑問は、クラス ActionInvocation の参照 actionInvocation がある 3 行目にあり、新しいキーワードを使用していないため、メソッド invoke() にアクセスするために actionInvocation を使用した 4 行目を確認します。new キーワードを使用せずにこれを行うにはどうすればよいですか? また、ActionInvocation が抽象インターフェイスであることも確認しました。

4

5 に答える 5

1
public String intercept(ActionInvocation actionInvocation) 

プログラムの任意の場所でこのメソッドを呼び出すには、

タイプのオブジェクトを作成する必要があり、ActionInvocationそのメソッドを呼び出すことができるのはあなただけです。

そこまでくれば、中の話はいつも通り。

要するに、

このメソッドを呼び出してここに来て処理を行う前に作成されたオブジェクト。

于 2013-08-14T12:31:51.840 に答える
1

それは完全に素晴らしいコードです。インスタンスは別のActionInvocation場所で作成され、メソッドに渡されますintercept(...)。実際ActionInvocation actionInvocationには、 を拡張または実装するクラスのオブジェクトへの単なる参照ですActionInvocation。つまり、そのオブジェクトの実際のクラスは、 のサブクラス/実装である可能性がありActionInvocationます。

この背後にある概念はポリモーフィズムと呼ばれます。特定のクラスのオブジェクトは、そのスーパークラスのオブジェクトでもあり、実装されたインターフェイスを介して参照される可能性があります。

例:

次のようなオブジェクトがあるとします。

Integer someInt = new Integer(1);

someInt次のメソッドにパラメーターとして渡すことができます。

void doSomething( Integer i) { ... }
void doSomething( Number n) { ... }} //because Integer extends Number
void doSomething( Object o) { ... } //because all objects extend Object
void doSomething( Comparable c) { ...} //because Integer implements Comparable (note that I left out generics here for simplicity)

null他の人がすでに述べたように、オブジェクトとして渡すこともできることに注意してくださいactionInvocation

于 2013-08-14T12:37:54.417 に答える
1

actionInvocationnewプログラムの別の場所で(で)初期化されます。

于 2013-08-14T12:31:07.133 に答える