JavaSE成神之路 - 编译Java程序

简介: JavaSE成神之路 - 编译Java程序

本章开始,我们需要下苦功打基础,目标是完成一个会员管理系统哦!如何运行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。如果不知道怎么改后缀名,文件框左上角点击组织,选择文件夹和搜索选项,把隐藏文件扩展名的选项去掉就可以啦。


21.png


文件扩展名在这里设置:


20.png


然后,创建一个Demo.java。


19.png


这就是一个java文件了,如果到这一步没有问题,那么恭喜你,你已经向前迈进了一大步!


javac命令


java文件是无法直接执行的,我们需要借助Java虚拟机来执行java程序。而java虚拟机也无法直接运行运行.java的文件,我们需要把java文件编译成.class文件,这个编译的过程,就是用javac命令。之前已经安装好了环境变量,所以这边可以直接调用javac命令吧。


打开控制台,windows系统可以直接Shift+右键,从此处打开命令窗口。输入命令:javac Demo.java


18.png


结果,文件夹里面啥也没发生?为什么,因为我的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命令。


17.png


得到


16.png


你会发现多了两个class文件,编译成功了,这个是java虚拟机的功劳。


怎么运行class文件?


我们要运行java程序,其实就是用java命令执行某一个class文件,运行的前提是,这个class文件的“前身” ,即java文件,它里面的class必须有一个main方法。于是,我们在Demo.java中再加一个App类。

class App {
   public static void main(String[] args){
     System.out.println("程序启动了...");
   }
}


现在是这样的:


15.png


保存文件,重新javac一下,


14.png


注意每次修改了Demo.java,都要重新编译,确保class文件是最新版本。


这时候你会发现又多了一个App.class,


13.png


我们用java命令去运行它。


命令是java App


12.png


这样就执行成功了!


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。


相关文章
|
2月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
53 1
|
2月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
94 1
|
3月前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
253 5
|
3月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
500 2
|
3月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
182 1
|
3月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
98 1
|
3月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
64 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
3月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
51 0
|
8天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
48 17
|
19天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者