Java结构
1.java源程序的基本组成单位为类。
2.只能有一个主类标识:public。
3.主类:类名就是文件名,又是编译器javac的入口。
4.虚拟机执行字节码文件(.class),main是jvm的入口方法,注意主方法不一定在主类中。
代码:
public class HelloWorld
{
//Java应用程序入口方法
public static void main(String[] args)
{ String s;
s="Hello World!";
//向控制台打印一条信息
System.out.println("s="+s);
System.out.println("args="+args[0]);
}
}
HelloWorld的具体执行过程:
执行HelloWorld.java文件,生成HelloWorld.class字节码文件;
虚拟机执行HelloWorld.class,将这个类加载到内存中(即方法区的类代码区中);
虚拟机通过类找到HelloWorld的主方法(程序的入口方法),访问权限为public(公有可用),虚拟机传递String类型参数的地址到主方法的args中去,并在栈区为args开辟内存空间,返回一个void的返回值;
定义一个String(标准类库中的)类型的变量(在栈区开辟空间)s,s的值不确定(垃圾值,编译无法通过);
s = “Hello World!”,对象“Hello World!”在方法区的常量数据区开辟空间,属性即为:Hello World!,方法即为:toString(),变量s存放对象“Hello World!”的地址;
虚拟机找到标准类库中的System.class类并加载到内存中(即方法区的类代码区中),System.out为标准字节输出流对象(),并调用println()方法将变量s的值打印到屏幕上。
通过HelloWorld理解java的流程(详解)
1: 编译成字节码文件:
文件名和主类名相同,通过javac编译HelloWorld.java,
Javac在安装目录的bean目录下,为什么一执行Tomcat,因为Path,
通过文件名找到主类名,1个类编译成一个字节码文件,编译器只认主类
2.用虚拟机执行java HelloWorld ,将字节码文件加载到内存,java的虚内存一般是3个区(方法区,堆区,栈区)(指令计数器的存储区、本地栈一般不用)
首先,Java虚拟机一执行后面的字节码文件,就把HelloWorld的字节码文件加载到方法区的类代码区;
加载完以后,去执行主方法;
(方法需要通过对象调用),通过类来调用方法,加一个static静态方法(目的:告诉虚拟机,通过类来找主方法),静态绑定,一加载类以后,虚拟机通过类找到它所绑定的静态方法;
虚拟机和主方法必须在同一个路径下,相同的包下,但是实际上并不在同一路径下,为使用主方法,加public(公有的,目的:能不能用主方法);
虚拟机告诉主方法有返回值,void,不处理返回值;
虚拟机向主方法传参数:形参:String[]类型,即字符串数组类型;没传参,则创建一个空数组对象,并传给主方法;
创建形参变量args(类型:String[])(存放在主方法main的栈帧),在方法的工作空间(栈)开辟空间,方法里的局部变量形参及异常断点和返回断点都会放在栈里;对应字节码文件(String[].class),加载在方法区的类代码段,虚拟机在堆里创建空数组对象(New String[0]);并将args指向空数组对象;
创建一个变量s,(在方法里定义的),在主方法的工作空间栈开辟空间,s的类型为String,
并加载String.class,s无确切的值,为垃圾值;HelloWorld在方法区的常量区开辟空间,创建一个对象,HelloWorld,s存放对象的地址、句柄;
三个流:标准字节输出流(System.out)、标准字节输入流(System.in)、标准字节错误流(System.error)通过System类创建并加载到内存中;虚拟机调用主方法时会创建这三个默认对象。
System.out.Println通过对象调用,对象名为标准字节输出流(System.out)调用println方法输出s的值(HelloWorld字符串对象的地址),toString()覆写了,自动调用toString()
源文件:1个 HelloWorld.java
类文件:5个 HelloWorld.class、String[].class、String.class、System.class、Object.class
对象:5个 空数组对象、标准字节输出流对象(System.out)、标准字节输入流对象(System.in)、标准字节错误流对象(System.error),常对象Hello World
方法:3个 主方法main()、println()、toString()
变量:2个 args、s