如何运行Java程序?
答:用java命令即可,一定不要忘了写main方法哦,一个java文件里面可以写很多个class。
问大家一个问题,你认为java文件是java类吗?
你可以用记事本写一个Demo.java的文本文件,编码是ansi,如果你的windows系统是简体中文的,那么所谓的ansi,其实就和GBK是一样的。
在这个文件里,你可以写很多的class,但是声明为public的class只能有一个。
这就说明,java文件不等于java类。java文件可以是一大堆class的集合体,每一个class都可以通过new关键字,或者反射变成实例对象。所以,你也可以说,一个java文件就是一个程序,这个程序如果跑起来,就是一大堆对象的集合。
每一个对象可以互相通信,各司其职,共同完成程序的任务。
有点绕,反射又是什么鬼,看不懂?没关系,下面我们会一步一步,慢慢学习到的。现在,请放轻松。
java文件本质上就是txt文本
现在,我们找一个地方,比如 D:\java ,创建一个普通的文本文件,后缀名改成.java。如果不知道怎么改后缀名,文件框左上角点击组织,选择文件夹和搜索选项,把隐藏文件扩展名的选项去掉就可以啦。
文件扩展名在这里设置:
然后,创建一个Demo.java。
这就是一个java文件了,如果到这一步没有问题,那么恭喜你,你已经向前迈进了一大步!
javac命令
java文件是无法直接执行的,我们需要借助Java虚拟机来执行java程序。而java虚拟机也无法直接运行运行.java的文件,我们需要把java文件编译成.class文件,这个编译的过程,就是用javac命令。之前已经安装好了环境变量,所以这边可以直接调用javac命令吧。
打开控制台,windows系统可以直接Shift+右键,从此处打开命令窗口。输入命令:javac Demo.java
结果,文件夹里面啥也没发生?为什么,因为我的Demo.java文件本来就是一个空文件啊,里面啥也没有。所以这是正常的,但是,你刚才已经完成了编译!这是很重要的一步。
什么是Java虚拟机?
我们在上一节下载了JDK的安装包,解压后又配置了环境变量。这个时候,我们可以说,我们的电脑上已经安装了Java虚拟机,也叫做JVM。
说到底,Java虚拟机就是一个软件,和你电脑上的QQ是一回事。这个软件的作用,就是编译和运行某一个.java文件。
就是这么回事啦,虚拟机并不神秘,在操作系统的角度看来,它只是一个普通进程。
JVM可以编译和运行某一个java文件,比如Demo.java。
刚才我们使用了javac命令,虽然啥也没发生,但是cmd窗口也没有报错,这是好事,这说明编译成功了。
java文件里面要写什么呢?答案是很简单的,那就是我们要写class,即java类。我们先考虑一下,做一个会员管理系统,需要什么?会员的前提是客户,会员就是VIP客户。这就引入了两个概念,分别是客户和会员。每一个客户都是潜在的会员,这就是业务需求。
不管是客户还是会员,都是我们日常生活的概念,现在我们要做的事情,把这两个概念都放到程序中去。我们用记事本打开Demo.java,输入
class Customer{}
class Vip {}
class是java的关键字,代表要声明一个类,右边紧跟着一个大小字母开头的单词,就是类名称,然后是一对{},这是java类的主体。现在,重复javac命令。
得到
你会发现多了两个class文件,编译成功了,这个是java虚拟机的功劳。
怎么运行class文件?
我们要运行java程序,其实就是用java命令执行某一个class文件,运行的前提是,这个class文件的“前身” ,即java文件,它里面的class必须有一个main方法。于是,我们在Demo.java中再加一个App类。
class App {
public static void main(String[] args){
System.out.println("程序启动了...");
}
}
现在是这样的:
保存文件,重新javac一下,
注意每次修改了Demo.java,都要重新编译,确保class文件是最新版本。
这时候你会发现又多了一个App.class,
我们用java命令去运行它。
命令是java App
这样就执行成功了!
javac的时候发生了什么?
javac的时候,JVM会启动java的编译器程序,对指定扩展名的.java文件进行解析,然后按照一定的规则编译成字节码,生成一个.class文件。这个class文件是可以被JVM的类加载器读取和执行的。至于内部的深层次原理,我们暂时不用关心,我们只需要知道java文件必须要编译成class文件,才可以被JVM执行,这就行了。
java的时候发生了什么?
刚才我们运行了App.class文件,用的命令是这样的,注意,不需要写class。
java App
那为什么不能写成 java App.class呢?这是因为,java规定如果执行的class文件名里面有 “.” 号,就会认为是有文件夹嵌套,有一个包含关系。
java App.class 会被认为要去编译App目录下的class.class文件,这是不正确的。
java命令到底发生了什么?其实就是去那个类里面寻找 public static void main 方法,如果有,就去执行这个方法。
这个main方法是什么?
public是java语法中的访问权限修饰符,代表公共的,谁都可以访问。
static代表这个方法是静态的,静态的意思就是不需要实例化对象就可以直接访问,结合上面的JVM图,我们可以知道这个main方法在class被加载的时候,就会被存放到方法区,JVM想调用就调用。
void代表方法没有返回值,这是程序的主方法,不需要返回值,也没有谁可以去接收这个返回值。
main代表这是主入口,JVM会去寻找一个叫做main的方法去执行,这是规定。
综上,这个main()方法的声明为:public static void main(String args[])。必须这么定义,这是Java的规范。
如果不这么设置,执行就会报错,main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类型必须String[]。
System.out.println是什么?
这个语句是java打印数据到控制台的方法,调试的时候我们可以经常使用,但是因为它的内部实现采用了同步代码块,会极大影响运行效率,所以如果项目要上线,请删除或者注释掉所有的System.out.println,转而采用异步的日志处理方案,比如logback。
本文由mdnice多平台发布