假设我们有这样一个类:
class XCopy {
public static void main(String[] args) {
int orig = 42;
XCopy x = new XCopy();
int y = x.go(orig);
System.out.println(orig + " " + " y);
}
}
我知道缺少 go
方法,但没关系。这应该工作吗?看起来是这样,但我只是无法在脑海中想象类里面的 self 参照是如何运作的;它有任何副作用吗?为什么这行得通?这不是某种无限递归循环吗?
不管怎样,我就是想不通这是怎么回事;提前致谢。
最佳答案
我了解到您正在查看此内容并认为这是鸡和蛋类型的问题,但根本不是。
如果这是您的第一门 OO 语言,您可能会对 Java 的术语感到困惑。 Java 有一种叫做“静态方法”的东西。你的 main(String[]) 方法是一个静态方法。这些static 方法实际上只是普通的旧函数。另一方面,面向对象的方法被称为“实例方法”或简称为“方法”。人们通常对术语很草率。
在 Java 中,函数(即静态方法)必须与类定义在同一位置,并使用该类的名称来标识它。但是,它仍然只是一个普通的旧功能。有时,一个类只有一堆松散相关的函数/静态方法。就像 Math 类有一堆关于数学的函数。有时像字符串这样的更面向对象的类会在面向对象方法中加入一些静态方法/函数。
在您的程序中,您的 main 函数与您的类无关。但是作为一个小例子,将它放在那里仍然非常好。
当 Java 启动时,总是在某处的主函数中启动(您可以告诉它主函数在哪个类中)。
因此,当您的程序运行时,JVM 会选择您的主函数作为有效的主函数。它运行该功能。它只是一个函数,不需要任何对象。调用 main 不会创建任何对象。
现在,当您在 main(String[]) 中时,您碰巧在这里创建了一个对象:
XCopy x = new XCopy();
现在您在 main 函数的局部作用域中有了一个由引用(对象指针)x 指向的 XCopy 类型的新对象。如果 XCopy 有一个构造函数,它就会被调用。
因此,如果您想在脑海中描绘它,让我用一种虚构的语言为您编写它,它具有更清晰、更直观的语法!
这里是:
Namespace XCopy
{
function void main(String[])
{
int orig = 42;
XCopy x = new XCopy();
int y = x.go(orig);
System.out.println(orig + " " + " y);
}
}
Class XCopy
{
method int go(int i)
{
....
return whatever;
}
}
在使用其他语言语法的同一程序中,您可以看到您有一个函数、一个类和一个方法,并且您有该类的一个实例。
希望对您有所帮助!!
关于java - 引用自身的类如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140971/