我是Java和OOP的新手,所以下面的一些东西可能听起来很傻,但是…
我理解一种情况,当我有两个类(两种不同的类型),其中一个做任何它想与另一个的实例,像
class A { ... }
class B {
...
public A someMethod() {
return new A;
}
...
}
当B的方法声明一些代码与A一起工作时,A类型已经定义好了,并且是完整的,因此一个东西可以与另一个东西一起使用/制作东西。在这一点上,这一切对我来说都是非常合乎逻辑的。
但是我正在考虑当一个类声明中有一个方法与它自己类型的实例一起工作时的情况。这怎么可能呢?我可能会想象一些"循环",但这不是一个循环。在编写代码时,方法如何包含关于某些内容的代码,而这些代码是不"完整"或完全未知的。
抱歉,如果我做了一些混乱的描述,我只是找不到更好的词来解释这个。我脑子里完全装不下这个概念。有人能解释一下吗?
更新:我发现了一些片段,可以帮助你了解我的问题。下面类中的代码不创建自身的实例,但它将绝对其他对象强制转换为its (RectanglePlus')类型…
public class RectanglePlus
implements Relatable {
...
// four constructors
public RectanglePlus() {
origin = new Point(0, 0);
}
...
// a method required to implement
// the Relatable interface
public int isLargerThan(Relatable other) {
RectanglePlus otherRect
= (RectanglePlus)other;
if (this.getArea() < otherRect.getArea())
return -1;
else if (this.getArea() > otherRect.getArea())
return 1;
else
return 0;
}
}
版权所有©2008,2010 Oracle和/或其关联公司。版权所有。
在编译期间,这是通过使用一个多通道编译器来完成的,该编译器在处理单个语句之前首先分析类和方法签名。
在运行时,类的加载和初始化发生在类第一次被使用的时候,通常在它的任何代码被执行之前。因此,当类的一个方法被执行时,它的整个结构和代码已经初始化。
但是您是对的,在类初始化期间执行的代码可能会混淆,例如静态初始化块和对静态字段的初始赋值。如果这些调用类的方法,这些方法将在尚未完全初始化的类上下文中执行,这可能会导致意外行为。
编译器足够智能,它们可以处理作用于自身实例的类。
我不确定它是如何完成的,但我猜首先编译器只是得到一个类的概述,并使该类的方法列表。然后,它详细查看每个方法的代码,如果其中一个方法调用类实例上的另一个方法,编译器可以判断它是否有效。
当您编写代码在isLargerThan
中调用otherRect.getArea()
时(并且在该代码执行之前),编译器将已经读取了RectanglePlus
的定义,因此意识到该类的实例可以访问称为getArea
的方法。
被实例化的对象与调用所在的类的类型相同并不重要。这必然意味着一些操作的排序(即编译器必须在试图读取类的方法体之前读取类的方法签名)。
这样想:如果编译器不做这种事情,那么你怎么能从同一个类中的另一个方法内部调用一个方法(因为那个类在你写那个调用的时候还没有"完成")?