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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值