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

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


在这里我的疑问是,在第三行中,我们为类ActionInvocation有一个引用actionInvocation,我们没有使用任何新关键字,现在检查了在第四行中,我们使用actionInvocation来访问方法invoke()。不使用new关键字怎么办?我还检查了ActionInvocation是抽象接口。

最佳答案

那是完美的代码。 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绝不会为null(这很可能在API文档中进行了说明)。

关于java - 我们可以使用类的引用来调用方法吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18231743/

10-08 21:58