SCJP(310-055)学习之旅———Java编译器和Jvm的小脾气(续)
上一章主要介绍了编译器,在这里我想再补充一些。
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判断一下,接下来要用的对象是否是我所需要的。这样 可以减少问题出现的次数。
以上是我的一点点理解,如果哪位大虾有不同观点,请您一定要指点,要不我还蒙在鼓里呢!哈哈哈哈![]()
发表评论
- 浏览: 1305 次
- 性别:

- 来自: 邯郸

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
SCJP(310-055)学习之旅— ...
我晕 看着是实例化了抽象类,实际上是实例化了一个抽象类的 ...
-- by whitenegro -
SCJP(310-055)学习之旅— ...
谢谢大家的支持!我会努力的!
-- by qwxi_1 -
SCJP(310-055)学习之旅— ...
总结的不错
-- by changxin -
SCJP(310-055)学习之旅— ...
呵,行啊。
-- by zhouzhao21 -
SCJP(310-055)学习之旅— ...
谢谢你的回答,如果可能的话,我想和你成为朋友
-- by qwxi_1






评论排行榜