标签:getname 地方 定位 out java程序 其他 path turn 报错
这里非常粗略的写一下大致过程(如有错误的地方,请及时联系博主^_^)
1.java程序的编译
①编译器将源文件(*.java)编译成字节码文件( *.class)。
java编译器会根据classpath路径找到对应的java文件(不存在,则报错),如果该类不依赖其他类,则直接将该类编译成.class文件,如若依赖其他类,
依赖的类已编译,则直接引用,否则先编译被依赖的类,再编译本类。
编译后的字节码文件主要包括字节:常量池和方法字节码;
常量池:存放 代码出现过的所有token(包名,类名,成员变量名等等)以及符号引用(方法引用,成员变量引用等等)。
2.java程序的运行
②JVM虚拟机解释运行字节码文件
(注意:JVM虚拟机只有在类第一次被使用的时候才会主动加载该类,而且只加载一次)
例子:(运行A.java)
//B.java
public class B { private String name; B(String name){ this.name = name; } public String getName(){ return name; } public void say(){ System.out.println("My name is "+name); } }
//A.java
public class A { public static void main(String[] args){ B b = new B();
b.say(); } }
a.JVM找到A.class后,把A的类信息加载到运行时数据区的方法区(A类的加载);
b.JVM找到A类的main函数入口,开始执行main函数;
c.new B()要创建一个B对象,但是这个时候方法区没有B类的信息,所以JVM类马上加载B类,把B的类信息放到方法区;
d.JVM在堆区为B实例分配空间,B实例持有指向方法区B的类信息的引用;
e.调用say()方法时,JVM根据b的引用找到B实例对象,再根据B实例的引用定位到方法区B类信息的方法表,获得say()的字节码地址;
g.执行say()方法;
参考资料: http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml
java程序的编译与运行------------------学习笔记(一)
标签:getname 地方 定位 out java程序 其他 path turn 报错
原文地址:http://www.cnblogs.com/javaliker/p/5998467.html