Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 引用到自身的类是如何工作的?_Java_Oop_Class_Object - Fatal编程技术网

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可以在没有类实例的情况下调用它。这非常有帮助。谢谢