`
qwxi_1
  • 浏览: 8524 次
  • 性别: Icon_minigender_1
  • 来自: 邯郸
最近访客 更多访客>>
文章分类
社区版块
存档分类

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判断一下,接下来要用的对象是否是我所需要的。这样 可以减少问题出现的次数。

以上是我的一点点理解,如果哪位大虾有不同观点,请您一定要指点,要不我还蒙在鼓里呢!哈哈哈哈

分享到:
评论
1 楼 ITeye管理员 2008-05-05  
图片看不见

相关推荐

Global site tag (gtag.js) - Google Analytics