2

我刚开始学习java,我发现,要调用普通类的方法,我们需要对象,但对于静态类,我们不需要任何对象来调用,我们可以使用类引用来做到这一点。但是在编码时,我遇到了一些让我很困惑的代码。代码是。

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

这里我的疑问是在第 3 行我们有一个类 ActionInvocation 的引用 actionInvocation 并且我们没有使用任何新关键字,现在检查第 4 行我们使用 actionInvocation 来访问方法 invoke()。如果不使用 new 关键字,这怎么可能?我还检查了 ActionInvocation 是抽象接口。

4

5 回答 5

2

new关键字仅用于构造对象。一旦它被创建,它就可以在方法、其他类和可以存储或传输对象的其他地方之间传递。

您正在制作一个MyInterceptor接受ActionInvocation对象的方法。该对象可以作为 null 传递,也可以在其他地方创建。您可以执行非空检查(通过actionInvocation!=null)以确保您确实传递了一个对象。

此外,您应该记住,您自己可以创建对象而无需new在您的类中使用。有这样的方法称为工厂,您可以在其中调用静态方法,例如ByteBuffer.allocateDirect(内部使用关键字new来创建 ByteBuffer 的实例。

于 2013-08-14T12:29:11.843 回答
1

actionInvocation在程序的另一个地方初始化(用new)。

于 2013-08-14T12:31:07.133 回答
1
public String intercept(ActionInvocation actionInvocation) 

要在程序中的任何位置调用此方法,

您需要创建一个 type的对象ActionInvocation,然后只有您可以调用该方法。

一旦你通过了,里面的故事就很平常了。

简而言之,

该对象在调用此方法并来这里做这些事情之前创建。

于 2013-08-14T12:31:51.840 回答
1

You will need a little more understanding of how inheritance and interfaces work to understand this. But the overall logic here is that the method is assuming that object of type ActionInvocation is already instantiated, which might not be the case. Anyways you can look at the calling code for method intercept where an object being passed here must have been instantiated by using new.

By the way ActionInvocation is interface so any "subclass" of this interface can call this method. Have a look at the inheritance terminology to understand what that means.

于 2013-08-14T12:34:07.343 回答
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永远不会为空(这很可能记录在 API 文档中)。

于 2013-08-14T12:37:54.417 回答