你以为的HelloWorld
public class HelloWorld
{
//Java应用程序入口方法
public static void main(String[] args)
{ String s;
s="Hello World!";
//向控制台打印一条信息
System.out.println("s="+s);
}
}
//输出结果
s=HelloWorld!
实际上的HelloWorld
对象有5个: s,三个流对象,常对象hello World
方法3个:main(),println,toString()
变量两个:args ,s
类4个:Helloworld.class System.class String[].class String.class
java虚拟机执行的操作
首先jvm都是从主方法开始着手的,所以我们一条一条的看主方法
1.加载主类 HelloWorld.class,在方法区的类代码区
2.进入主方法main(),并将主方法压栈,这块内存实际上在主线程的主方法栈帧中
并加载String[] .class到方法区的类代码区
3.为主类的属性和方法开辟空间:
主类没有属性,但有方法:主方法mian(),并为其在方法区的共享代码区开辟空间,且在堆区保留该方法的引用.
4.
String s;
//此时在方法区的类代码区加载String.class
//并且在堆区为String类型的变量开辟对应大小的空间,且默认值为null
5.
s="HelloWorld !";
//此时会在方法区的常量池中创建一个String类型的对象 为"HelloWrorld !"
//并将此内存的地址指向s
6..
System.out.println("s="+s);
//加载System.class到方法区的类代码区
//在堆区创建三个流对象 标准字节输入流对象System.in ;标准字节输出流对象System.out ;标准字节出错流对象System.error ;
//调用了println()方法,在方法区的共享代码区加载println()
//调用了toString()方法,同样在方法区的共享代码区加载toString();