上一章主要介绍了编译器,在这里我想再补充一些。
1.程序在编译阶段主要侧重语法语义检测。有穷自动机根据DFA通过识别所输入的字符,从一种状态转换到另外一种状态,只要符合语法规则即可,并不在乎程序实际运行时的细节。举例如下
----------A.java-------
class B extends A{}
public class A{
static String[] a=null;
public static void main(String[] args){
System.out.println("main123");
B.main(a);
}
}
上面是一个非常糟糕的程序。编译非常正确,运行时开始疯狂打印main123,然后抛出异常,由于栈崩溃,JVM推出。
好了,Java编译器先说道这里。以后我还会继续写的。
2.关于JVM。他就比较细心,喜欢刨根问底。下面来看看在第一章程序的运行情况。
——> public static void main(String[] args)
——> Shuiguo sg1 = new Shuiguo()
-----> Pingguo pg = new Pingguo()
------> Shuiguo sg2 = new Pingguo()
------->sg1.display() 当执行这条语句的时候,JVM会根据sg1所引用的真实对象将所对应成员方法压入栈
执行完之后,方法出栈,局部变量字符串失效,但仍旧存留在常量池里面,
------> pg.display(); 同上。
-----> sg2.display(); 道理和上面的类似。由于调用方法时,JVM会去查看引用变量所引用的实际对象,然后找到这个方法,让他入栈。
上面的方法结束出栈
main也随之出栈,程序结束,JVM退出。
到此,JVM运行时,内存里面的活动如上所示。上面的问题主要是在多态中出现,在使用处理类似问题时,最好采用IS-A方式,用instanceof判断一下,接下来要用的对象是否是我所需要的。这样 可以减少问题出现的次数。
以上是我的一点点理解,如果哪位大虾有不同观点,请您一定要指点,要不我还蒙在鼓里呢!哈哈哈哈