public class Object {
..............
public String toString()
..............
}object是所有类的父类,假设这是我们第一次编译java,刚写第一个类object,但是写道这个函数返回String时,由于String是object的子类,所以此时string类并不存在,所以就无法编译,那么如果object都无法生成,那么string也就没有办法写,然后整个就进行不下去了..
很困惑...也没有搜索到什么有用的资料..请高手解答,谢谢..
..............
public String toString()
..............
}object是所有类的父类,假设这是我们第一次编译java,刚写第一个类object,但是写道这个函数返回String时,由于String是object的子类,所以此时string类并不存在,所以就无法编译,那么如果object都无法生成,那么string也就没有办法写,然后整个就进行不下去了..
很困惑...也没有搜索到什么有用的资料..请高手解答,谢谢..
java的运行流程里面说JVM启动的时候是一次性装载进来需要的类库
我觉得这个不用考虑先后顺序吧?用的时候这些类已经存在在JVM中了。
再说了,java是高级语言,它的JVM底层也是要面对机器码的
用高级语言逻辑考虑底层机器码运作似乎不大现实吧!!
Object 类是系统实现的默认类,你可不能再定义一个Object了!
或者換個說法:
假設我有個想法,定義一個類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
感觉上是怪怪的。但是很可能JRE特殊对待了String类。
既然是JDK自带的基本类,所以可能JRE早就认识它了,也知道怎么实现native的数据结构。所以可以这么用。
呵呵, 有点意思。做了个实验. 步骤:涉及到两个类 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 结构的。