Java 引用到自身的类是如何工作的?
假设我们有这样一个类:Java 引用到自身的类是如何工作的?,java,oop,class,object,Java,Oop,Class,Object,假设我们有这样一个类: 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方法,但没关系。这样行吗?看起来是这样,但我无法在脑海中想象课堂上的自
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
方法,但没关系。这样行吗?看起来是这样,但我无法在脑海中想象课堂上的自我参照是如何运作的;它有副作用吗?为什么这样做有效?这不是某种无限递归循环吗
不管怎样,我就是搞不清楚这到底是怎么回事;提前感谢。为什么会再次发生
main()
不会在其自身的任何地方调用,因此不会递归。类在其自身成员的范围内,因此您可以创建它的实例
例如,一个makeCopy()
方法;它需要创建自己类型的另一个对象的实例
不要认为方法是“在”类/对象内部的,而从内部调用方法的行为是令人尴尬的;方法只是一个带有隐式
这个参数的函数。主方法是静态的,这意味着它的代码可以独立于存在Xcopy实例的事实来访问。因此,不存在冲突或递归循环。它有自己的内存空间,它不同于为每个类实例分配的内存空间。主()是静态的,因此可以将其视为类的一部分,而不是实例的一部分。它被OS+JVM调用并创建一个类的实例。该类恰好是定义main()的类,但这并不重要。
通过调用
XCopy x = new XCopy();
实际上,您正在调用XCopy的空构造函数,而不是再次调用main方法
因此,这些电话看起来像:
JVM calls XCopy.main();
main method creates new instance of XCopy by calling XCopy's empty constructor
XCopy constructor ends
main method ends -> program ends
想象一个不同的班级:
public class Person {
private String name;
private Person favorite;
public Person(String name) { setName(name); }
public void setFavorite(Person favorite) {this.favorite = favorite;}
public Person getFavorite() { return favorite; }
public void setName(String name) {this.name = name;}
public String getName() { return name; }
public static void main(String args[]) {
Person a = new Person("Alex");
Person b = new Person("Becky");
Person c = new Person("Chris");
Person d = new Person("David");
a.setFavorite(b);
b.setFavorite(c);
c.setFavorite(c);
}
}
亚历克斯最喜欢的人是贝基。贝基最喜欢的人是克里斯。但克里斯是个自恋者;他最喜欢的人是他自己。大卫没有最喜欢的人。可悲的是,没有人认为大卫是他们最喜欢的人
当你将自引用的概念应用于具有真实语义的事物时,这种结构是可能的,这难道没有意义吗?注意,设置自引用不会创建副本。这个节目里只有一个克里斯
只要你不采取行动说,“我要问每个人他们最喜欢的人是谁。然后我要问那个人他们最喜欢的人是谁。在找到大卫之前,我是不会停下来的。因为这样,你就有机会永远循环。我想你看到这一点,认为这是鸡和蛋的问题,但这根本不是问题
如果这是您的第一种OO语言,您可能会对Java的术语感到困惑。Java有一种叫做“静态方法”的东西。您的main(String[])方法是一个静态方法。这些静态方法实际上只是简单的旧函数。另一方面,面向对象的方法称为“实例方法”或“方法”。人们常常对术语马虎
在Java中,函数(即静态方法)必须与类定义在同一位置,并使用该类的名称来标识它。但是,它仍然只是一个简单的旧函数。有时一个类只有一堆松散相关的函数/静态方法。就像数学课上有一大堆关于数学的函数。有时,一个更像是OO类的string会在OO方法中加入一些静态方法/函数
在你的程序中,你的主函数与你的类无关。但作为一个小例子,把它放在这里仍然是非常好的
当Java在中启动时,总是在某个地方的主函数中启动(您可以告诉它主函数在哪个类中)
因此,当程序运行时,JVM会选择主函数作为有效的主函数。它运行函数。它只是一个函数,不需要任何对象。调用main不会创建任何对象
现在,当您在main(String[])中时,您正好在此处创建了一个对象:
XCopy x = new XCopy();
现在您有了一个类型为XCopy的新对象,该对象由主函数本地范围内的引用(对象指针)x指向。如果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;
}
}
在这个用其他语言语法编写的程序中,你可以看到你有一个函数,一个类和一个方法,还有这个类的一个实例
希望有帮助 这是一个很好的解释,只是为了确定。Main()只在程序启动时被调用,它可以在没有类实例的情况下使用,因为它是一个静态方法,对吗?是的,Main是静态的,所以JVM可以在没有类实例的情况下调用它。这非常有帮助。谢谢