Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 - Fatal编程技术网

自实例化机制/概念在java中是如何工作的?

自实例化机制/概念在java中是如何工作的?,java,oop,Java,Oop,我不熟悉Java和OOP,所以下面的一些事情听起来可能很傻,但是 我理解这样一种情况:我有两个类(两种不同的类型),其中一个对另一个的实例做它想做的任何事情,比如 class A { ... } class B { ... public A someMethod() { return new A; } ... } 当B的方法声明一些代码与A一起工作时,A类型是非常定义和完整的,因此一个东西可以与另一个东西一起使用/制作。在这一点上,这一切对我来说都很合

我不熟悉Java和OOP,所以下面的一些事情听起来可能很傻,但是

我理解这样一种情况:我有两个类(两种不同的类型),其中一个对另一个的实例做它想做的任何事情,比如

class A { ... }

class B { 
   ...
   public A someMethod() { 
      return new A;
   }
   ...
}
当B的方法声明一些代码与A一起工作时,A类型是非常定义和完整的,因此一个东西可以与另一个东西一起使用/制作。在这一点上,这一切对我来说都很合乎逻辑

但是我在考虑这样一种情况,当一个类声明中有一个方法可以处理它自己类型的实例时。这怎么可能?我可能会想象一些“循环”,但它不是一个循环。在编写代码时,该方法如何拥有一个关于一些不“完整”或不完全已知的内容的代码

很抱歉,如果我做了一些混乱的描述,我只是找不到更好的词来解释这一点。绝对不能把这个概念放进我的脑子里。有人能解释一下吗

更新:我发现了一些可以帮助您理解我的问题的代码片段。下面类中的代码不创建自身的实例,但它将绝对其他对象强制转换为its(RectanglePlus')类型

公共类矩形加号
实现相关{
...
//四个建设者
公共矩形加号(){
原点=新点(0,0);
}
...
//需要实现的方法
//相关接口
公共国际岛国(相关其他){
矩形加其他矩形
=(矩形加)其他;
if(this.getArea()otherRect.getArea())
返回1;
其他的
返回0;
}
}

版权所有©2008、2010 Oracle和/或其附属公司。版权所有。使用受许可条款约束。

编译器足够智能,可以处理作用于自身实例的类


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

在编译过程中,这是通过在处理单个语句之前先分析类和方法签名的方法来完成的

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


但您是对的,在类初始化期间执行的代码可能会使事情变得混乱,例如静态初始值设定项块和对静态字段的初始赋值。如果类的这些调用方法,则这些方法将在尚未完全初始化的类上下文中执行,这可能会导致意外行为。

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

被实例化的对象是否与调用所在的类的类型相同并不重要。这必然意味着某些操作的顺序(即编译器必须先读取类的方法签名,然后再尝试读取它们的主体)


这样想:如果编译器没有做这类事情,那么你怎么能从同一个类的另一个内部调用一个方法呢?

我感觉你把类和类的实例混在一起了。你能给出一些示例代码来说明你在说什么吗?@DmitryBerdnikov:请编辑你的问题,把这些代码包括进去。@OliCharlesworth,对不起,添加了示例可能重复的您的答案帮助我重新表述了我想要了解的内容:当我编写初始问题时,我认为编译器会分析类型,然后分析其方法中的代码,然后查看!又是那种类型!在…内它需要把它当作某种东西,但是它已经在分析它的中间了。这就是我在上面使用“循环”一词的原因。我只是想了解编译器(或jvm,或其他任何东西)在分析该类型中包含该类型的某些部分时,对该类型的理解…@Dmitry:问题是,当编译器遇到方法中使用的类型时,类型的结构是完成所有操作所需的全部。好的,但是在分析同一类型(其中包含该类型)的方法iside的代码时,它在类型下理解了什么?对不起,我不确定我是否理解这个问题。
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;               
    }
}