Java 有方法初始化这样的事情吗?

Java 有方法初始化这样的事情吗?,java,Java,据我所知,这是一个变量声明的示例: int variable; 这是变量初始化的一个示例: variable = 2; 我们可以一起声明和初始化变量,如下所示: int variable = 2; 对于方法,我们有类似的构造: abstract int method(int param); 及 但我们将前者称为方法原型,将后者称为声明 编辑: 另一个例子如下: static int differentMethod(int param); public static void main

据我所知,这是一个变量声明的示例:

int variable;
这是变量初始化的一个示例:

variable = 2;
我们可以一起声明和初始化变量,如下所示:

int variable = 2;
对于方法,我们有类似的构造:

abstract int method(int param);

但我们将前者称为方法原型,将后者称为声明

编辑:

另一个例子如下:

static int differentMethod(int param);

public static void main (String[] args) {
...
}

static int differentMethod(int param) {
...
}
编辑2:忽略上面的例子,因为它在Java中不受支持(但在C中存在类似的东西)


有方法初始化这样的事情吗?

很有趣。理论上,存在方法初始化

方法初始化可能意味着将方法视为第一类对象,并在运行时为它们指定特定的值。是的,您正在将该方法初始化为一个,稍后,您将其更改为另一个。就像一个物体

目标C有障碍。 C有函数指针

在java中,通过匿名内部类部分支持这样的操作

以下是一篇维基百科文章:
变量存储在内存中,也就是说,它们有一些值,这些值存储在某个内存地址。注意:该值可由我们稍后更改。现在让我们看看方法,每个方法都存储在某个地方。当我们调用该方法时,解析其地址,然后执行存储在该地址的指令。但是,当我们更改变量的值时,请注意,存储方法的地址的值不能由我们更改。它是内部处理的。因此,没有方法初始化这样的事情。

java中的所有方法都包含在一个类中,因此当类被加载时,它的方法也被加载到内存中。有一个名为
PermGen
的部分存储所有方法(也包括静态方法和静态变量),PermGem是堆的一部分

您提到的方法原型用于接口和抽象类中。
请注意,强制在具体类中实现这些方法,因为conrete类是其中运行conde的类,当该类在代码中使用(初始化)时,其方法将加载到内存中执行。

您可以使用

所以您将得到类似于方法指针的东西,可以稍后初始化。java中不能有指向函数的指针,所以必须将其包装在对象中

编辑:示例

    interface IntFunction {
        int function(int param);
    }

    public IntFunction method;

    void initializer() {
        method = new IntFunction() {

            @Override
            public int function(int param) {
                return param + 10;
            }
        };
    }


    void use() {
        int b = method.function(50);
    }
编辑2:直接字节码操作


您可以在运行时使用字节码操作技术,如javassist.org do,因此您可以根据自己的需要对类执行任何操作,例如在运行时初始化方法,但这并不是一种干净的方式。

从您的角度来看,应该在何时何地调用方法初始化,如果它存在的话?我会编辑我的文章,但也有这样的情况,当你在类的顶部声明方法以便以后定义它时。我想当你定义这个方法的主体时,它会被认为是它的初始化。阅读重载、抽象、接口或越狱……你的例子是用C语言编写的。Java不是C语言,不支持这种设计。可能有接口,但Java中不允许这种情况。@PearSquirrel:“……也有在类的顶部声明方法以便以后定义它的情况。”Java中不允许。在Java中,这既不必要也不可能。在可能发生变化的情况下使用“初始化”一词是有意义的,例如变量。将变量设置为某个初始值,以后可以指定不同的初始值。我想我的问题证明了后续问题的正确性,“有方法分配这样的事情吗?”。我的结论是“否”,因为方法和变量在语法上有很多相似之处,但没有一对一的关系。是的,也没有所谓的方法赋值。您所能做的就是方法声明,然后是它的实际实现,然后调用它。更实际地考虑一下,
initialization
assignment
是否真的对方法有用?我的结论是没有,它们没有,因为至少据我所知,方法不存储可以在运行时更改的值。(虽然静态最终变量可以初始化,尽管只能初始化一次……我想这是因为任何实际可以运行的代码都不会有没有主体的方法。)是的,您完全正确,方法是可以选择对变量进行操作的语句块,但方法本身包含的语句在运行时无法更改。因此,综上所述,方法不具备初始化和赋值功能。:)希望一切都会好起来,酷!不过,这叫做“使用匿名内部类”,而不是初始化方法。我想我们可以重新创建该行为,但没有特定的功能可以调用“方法初始化”。您可以使用字节码操作,如我的回答“编辑2”中所述。是的,我同意稍后会有定义方法体的行为(通过匿名内部类)。我认为我们不讨论方法初始化或赋值,因为它们不像变量初始化或赋值那样直观。功能可能存在,但更容易命名为其他名称。我认为考虑这种情况的一个好方法是将类作为一个整体与变量进行比较,而不仅仅是将方法与变量进行比较。基本类型与类一样,既有状态也有行为,尽管它们的功能更简单。行为是在声明时定义的(比如类声明和方法声明),它们的状态是在初始化时确定的(比如对象初始化)。当我这样想的时候,一切都变得更有意义。类是复杂的数据类型,这是真的。但是您的语句
基本类型,比如类
    interface IntFunction {
        int function(int param);
    }

    public IntFunction method;

    void initializer() {
        method = new IntFunction() {

            @Override
            public int function(int param) {
                return param + 10;
            }
        };
    }


    void use() {
        int b = method.function(50);
    }