public class Object {
..............
public String toString()
..............
}object是所有类的父类,假设这是我们第一次编译java,刚写第一个类object,但是写道这个函数返回String时,由于String是object的子类,所以此时string类并不存在,所以就无法编译,那么如果object都无法生成,那么string也就没有办法写,然后整个就进行不下去了..
很困惑...也没有搜索到什么有用的资料..请高手解答,谢谢..

解决方案 »

  1.   

    这个理解的顺序错了吧……
    java的运行流程里面说JVM启动的时候是一次性装载进来需要的类库
    我觉得这个不用考虑先后顺序吧?用的时候这些类已经存在在JVM中了。
    再说了,java是高级语言,它的JVM底层也是要面对机器码的
    用高级语言逻辑考虑底层机器码运作似乎不大现实吧!!
      

  2.   

    楼主啊!
    Object 类是系统实现的默认类,你可不能再定义一个Object了!
      

  3.   

    可能是我說的不清楚,我說的是java的源代碼,而不是我重新定義這些類.我上邊所寫的就是java的源代碼,我的意思是假設由我們自己來寫java類庫和框架,也不是說的運行時或者載入時問題,而是編譯時問題..
    或者換個說法:
    假設我有個想法,定義一個類A,一個繼承與A的類B,而類A中的某一個方法卻需要返回B的類型
    如下
    一開始我什么都沒有,開始編,
    class A{
      ...
      public B lllllll()             //lllllll是某個函數名
      {
      ...
      }
      ...
    }
    然后定義B
    class B extends A{
    ...
    }
    我javac編譯,編譯器順序編譯,假設編譯器先編譯A這個類,編譯到public B lllll()的時候就會發現因為B的class沒有生成,也就意味著javac認識不了B這個標識符,那我放棄編譯A,我先編譯B,又會發現A是一個不可認識的標識符,然后就無法進行下去了..
    這跟object和string的關系是類似的..所以我很奇怪java的開發人員是怎么把object的class文件弄出來的..
    再說,父類方法返回子類類型,真的可以這樣做麼?可是java類庫就是這么做了,還是最基本的類中object
      

  4.   

    楼主的意思好像是在Object里引用了String,好像是违反先定义再引用的。
    感觉上是怪怪的。但是很可能JRE特殊对待了String类。
    既然是JDK自带的基本类,所以可能JRE早就认识它了,也知道怎么实现native的数据结构。所以可以这么用。
      

  5.   

    找JDK自带的JAR包吧,肯定能找到Object.class与String.class既然能找到他们俩,那编译也就不会出错了.
      

  6.   


    呵呵, 有点意思。做了个实验.  步骤:涉及到两个类  MyObject(对应java Object), MyString(对应 java String)
    1. 写个自己的 Object. 先不写toMyString() 方法。  因为还没有定义 MyString 类.
    public class MyObject {
    }
    2.写MyString
    public class MyString{
    }3.MyObject 添加 toMyString() 方法.
    public class MyObject {
    public MyString toMyString(){
    return new MyString();
    }
    }
    4. 结论编译没问题。
    5.推理一下,可以认为javac在编译一个类时,
      a.
      只会确认一下检查一下他所引用的类存不存在,不存在的话记是会打出异常。
     检查通的话应该不会去编译他所引用的类,而是继续编译当前的类(否则上面的问题会引起无穷递归)。 
     引用的类会在当前类编译完毕后再进行编译。
      
      b.或者去编译引用的类,但是javac会记录引用过程。防止出环引用。 (个人觉得不大会这么做,麻烦,大的工程还不得搞死).  c.javac 编译当前类 时不需要把引用类的class代码写到当前类的class中。 只需要用到引用的包名类名方法名就可以了。
        这点可去看看 JVM 的原理方面的书。 里面有讲 class 结构的。