Object类的源代码中,public String toString(),既然String是Object的子类,Object编译时就会发现String没有定义,很糊涂了,请专家解答

阿琥 2008-01-24 11:45:24
public class Object {
..............
public String toString()
..............
}

object是所有类的父类,假设这是我们第一次编译java,刚写第一个类object,但是写道这个函数返回String时,由于String是object的子类,所以此时string类并不存在,所以就无法编译,那么如果object都无法生成,那么string也就没有办法写,然后整个就进行不下去了..
很困惑...也没有搜索到什么有用的资料..请高手解答,谢谢..
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kwlbtdlt 2009-07-09
  • 打赏
  • 举报
回复
学习了!
coder_sunny 2008-01-25
  • 打赏
  • 举报
回复
这个理解的顺序错了吧……
java的运行流程里面说JVM启动的时候是一次性装载进来需要的类库
我觉得这个不用考虑先后顺序吧?用的时候这些类已经存在在JVM中了。
再说了,java是高级语言,它的JVM底层也是要面对机器码的
用高级语言逻辑考虑底层机器码运作似乎不大现实吧!!
cn12592 2008-01-25
  • 打赏
  • 举报
回复
找JDK自带的JAR包吧,肯定能找到Object.class与String.class

既然能找到他们俩,那编译也就不会出错了.
cyberpeng 2008-01-25
  • 打赏
  • 举报
回复
楼主的意思好像是在Object里引用了String,好像是违反先定义再引用的。
感觉上是怪怪的。但是很可能JRE特殊对待了String类。
既然是JDK自带的基本类,所以可能JRE早就认识它了,也知道怎么实现native的数据结构。所以可以这么用。
阿琥 2008-01-25
  • 打赏
  • 举报
回复
可能是我說的不清楚,我說的是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
老紫竹 2008-01-25
  • 打赏
  • 举报
回复
楼主啊!
Object 类是系统实现的默认类,你可不能再定义一个Object了!
Yanbin_Q 2008-01-25
  • 打赏
  • 举报
回复
楼主的描述确实很能看懂
hcmsxy 2008-01-25
  • 打赏
  • 举报
回复

呵呵, 有点意思。

做了个实验. 步骤:

涉及到两个类  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 结构的。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧