自我实例化机制/概念如何在java中运行?

时间:2011-12-20 23:56:27

标签: java oop

我是Java和OOP的新手,所以下面的一些内容可能听起来很愚蠢,但是......

我理解的情况是,我有两个类(两种不同的类型),一个用另一个类的实例做任何想做的事情,比如

class A { ... }

class B { 
   ...
   public A someMethod() { 
      return new A;
   }
   ...
}

当B的方法声明一些代码与A一起工作时,A类型已经非常明确并且完整,因此有一件事可以使用/与另一个做出一些东西。在这一点上,这对我来说非常符合逻辑。

但我正在考虑这样一种情况,即类声明中有一个方法可以使用它自己类型的实例。怎么可能?我可能会想象一些'循环',但它不是循环。该方法如何能够获得有关在编写代码时不完整或完全已知的内容的代码。

对不起,如果我做了一些混乱的描述,我就找不到更好的词来解释这个。绝对不能把这个概念融入我的脑海。有人可以解释一下吗?

更新:我找到了一些可以帮助您理解我的问题的片段。下面的类中的代码不会创建自身的实例,但它会将绝对其他对象强制转换为其(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和/或其附属公司。版权所有。使用须遵守许可条款。

3 个答案:

答案 0 :(得分:4)

在编译期间,这是通过在处理单个语句之前首先分析类和方法签名的multi-pass compiler来完成的。

在运行时,类首次使用时会发生类加载和初始化,通常在执行任何代码之前。因此,当执行类的方法时,它 整个结构和代码已初始化。

但你是对的,可以在类初始化期间执行的代码混乱,例如静态初始化程序块和静态字段的初始分配。如果这些类的调用方法,这些方法在尚未完全初始化的类上下文中执行,这可能会导致意外行为。

答案 1 :(得分:2)

编译器足够聪明,他们可以处理一个作用于自身实例的类。

我不确定它是如何完成的,但我想首先编译器只是获得该类的概述并列出该类的方法。然后详细查看每个方法的代码,如果其中一个方法在类的实例上调用另一个方法,则编译器可以判断它是否有效。

答案 2 :(得分:0)

当您编写代码以在otherRect.getArea()内调用isLargerThan时(并且在该代码执行之前),编译器已经读取了RectanglePlus的定义,因此意识到该类的实例可以访问名为getArea的方法。

实例化的对象与调用所在的类型相同并不重要。这必然意味着操作的某些顺序(即编译器必须在 >它试图阅读他们的身体。)

以这种方式思考:如果编译器没有做这种事情,那么你怎么能从同一个类中的另一个内部调用一个方法(因为那个类不会'用你的术语来说,在你写这个电话的时候是“完整的”)?