Java有没有类似于Python的__call__的功能?

1 投票
2 回答
1746 浏览
提问于 2025-04-17 19:29

我刚开始学习Python,遇到了__call__这个方法。我明白了__init__什么时候被调用,以及__call__什么时候被调用,通过运行一个简单的例子:

class Constructor:
    def __init__(self, a):
        print "__init__ called"

    def __call__(self):
        print "__call__ called"

    def dummy(self):
        print "a dummy method called"

print "creating x obj"
x = Constructor(1)
print "calling x object"
x()

控制台输出:

creating x obj
__init__ called
calling x object
__call__ called

我有几个问题:

  1. 我之前是学Java的,我知道__init__对应Java的构造函数,Java有没有类似__call__的东西,能让我更好理解这个?
  2. 能不能给我一个简单的例子,说明__call__什么时候会有用?

2 个回答

3

不,Java里没有像 __call__ 这样的东西。你不能把一个对象当作方法来调用。你必须先创建一个方法,然后再去调用它:

class Constructor{
    Constructor(){
        System.out.println("Constructor called");
    }

    void doStuff(){
        System.out.println("do called");
    }

    public static void main(String[] args){
        System.out.println("Creatng x obj");
        x = new Constuctor();
        System.out.println("Calling x obj");
        x.doStuff();
    }
}
5

__call__ 就是让一个类可以像函数一样被调用。在C++中可以做到这一点,但在Java中不行。这样做的好处是可以创建一些叫做函数对象(有时也叫仿函数)。

在Python中,这种对象被称为可调用对象

简单来说,这意味着你可以把一个对象当作函数来使用。

这种概念的具体用法在这里不详细讲解,但网上有很多相关的信息,比如你可以查看一下维基百科

撰写回答