我刚刚开始学习java而且我发现,要调用普通类的方法我们需要对象但是对于静态类我们不需要任何对象来调用我们可以使用类引用来做到这一点。但是在编写代码时,我遇到了一些让我很困惑的代码。代码是。
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
String result = actionInvocation.invoke();
这里我怀疑是在第3行,我们有一个ActionInvocation类的引用actionInvocation,我们没有使用任何new关键字,现在检查第4行,我们使用actionInvocation来访问方法invoke()。如果不使用新关键字,这怎么可能?我还检查了ActionInvocation是抽象接口。
答案 0 :(得分:2)
new
关键字仅用于构造对象。一旦创建它,它就可以在方法,其他类以及可以存储或传输对象的其他地方之间传递。
您正在制作一个接受MyInterceptor
对象的ActionInvocation
方法。此对象可以作为null传递,也可以在其他地方创建。您可以执行非空检查(通过actionInvocation!=null
)以确保您确实传递了一个对象。
此外,您应该记住,您自己可以在课程中不使用new
创建对象。有一些称为工厂的方法,您可以在其中调用静态方法,例如ByteBuffer.allocateDirect(
,内部使用new
关键字来创建ByteBuffer的实例。
答案 1 :(得分:1)
actionInvocation
已在该计划的其他位置初始化(new
}。
答案 2 :(得分:1)
public String intercept(ActionInvocation actionInvocation)
要在程序中的任何位置调用此方法,
您需要拥有ActionInvocation
类型的已创建对象,然后才能调用该方法。
一旦你转到那里,里面的故事是平常的。
简而言之,
在调用此方法之前创建该对象并来到此处执行操作。
答案 3 :(得分:1)
您需要更多地了解继承和接口如何理解这一点。但是这里的总体逻辑是该方法假设已经实例化了ActionInvocation类型的对象,这可能不是这种情况。无论如何,您可以查看方法intercept
的调用代码,其中必须使用new实例化此处传递的对象。
顺便说一下ActionInvocation是接口,所以这个接口的任何“子类”都可以调用这个方法。看看继承术语,了解这意味着什么。
答案 4 :(得分: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文档)。