前提引入
在JavaSE的系列中,将从第一个Java程序开始叙述,系统的把JavaSE的内容总结一次。毕竟这是第二次学习JavaSE的内容,因此感触也相对比较深一些。在JavaSE的初步计划中,大概有十一到十三篇文章,大致有:第一个Java程序、变量与运算符、流程控制、面向对象(封装、继承、多态)、异常、常用API、泛型、输入输出流、反射以及注解等。
Java开发环境
在第一个Java程序引入之前,先对Java的开发环境进行一个简单的介绍,毕竟有了开发环境,才可以进行代码的书写:
JDK:Java开发者工具;
JRE:Java运行时环境;
JVM:Java虚拟机。
上述表明,JDK是程序员开发时需要的工具,因此要先安装一下JDK。JDK现在是每半年发行一个版本,因为刚开始学习不必要使用最新版本,可以使用11或者17甚至8也是可以的。
JDK = JRE + 开发者工具集 (例如Java编译工具等);
JRE = JVM + JavaSE标准类库。
即三者具有如图关系:
Java核心机制:JVM
在Java开发环境中,最重要的组成部分就是JVM了。如果是第一次接触Java的同学可能对此没啥感觉,但是当对编程有了一定的了解之后,再回来重新学习,那么就会认识到JVM的重要性。
JVM,即Java Virtual Machine,Java虚拟机;它是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行命令、管理数据、内存以及寄存器等。
功能一
实现Java程序的跨平台性
指令集
Java语言属于高级编程语言,要经过编译器编译成可执行程序,而对于最底层来说,即机器指令序列,也就是大家所熟知的二进制编码;也就是说,软件最终都会成为机器熟悉的一些指令,而这些指令又形成了一个集合,自然又会出现不同的指令集。
假若现在有n种语言,m种指令集;如果再出现一种语言,那么势必要有m种对应关系去对应m种指令集;如果新出现一种指令集,那么势必要有n种对应关系去对应n种语言。但是,JVM的出现,大大减少这种关系的存在,如果出现一种新的语言,JVM直接去进行对应;如果出现一种新的指令集,那么也是JVM直接去进行对应,本来m * n的关系现在变成了m + n的关系,如下图:
功能二
实现内存管理(内存分配,内存回收)
内存泄漏和内存溢出
内存泄漏:所谓内存泄漏,即某块内存,在使用完成之后,本该进行回收,但是确并没有回收走,依旧处在被使用的状态中。
内存溢出:所谓内存溢出,即某程序约定的只有2G的内存空间,但是在运行过程中,使用的内存超过2G,也就是超过规定的内存空间,导致程序被挂掉。
- Java程序在运行过程中,涉及到运算数据的分配、存储等都由JVM来完成;
- Java消除了程序员回收无用内存空间的职责,提供了一种系统级线程跟踪存储空间的分配情况,在存储空间达到相应阈值时,检查并释放可被释放的存储器空间;
- GC的自动回收,提供了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而引起的内存泄漏。
Java程序开发步骤
- 编写程序:将Java代码编写到以.java为扩展名的源文件中;
- 编译:使用javac命令对该java程序进行编译,生成一个或者多个字节码文件;
- 运行:使用java命令对生成的.class文件进行运行。
第一个Java程序
在学习编程的过程中,无论是哪一种语言,一般都是先编写一段“hello world”程序,以此来入门某种语言,Java当然也不例外。
a. 编写代码
创建一个后缀为.java的文件,将Java代码编写到文件中。
如果创建好的文件中没有发现后缀名,那么就点击“查看”中的“文件扩展名”进行勾选即可,如图:
上述操作完成之后,将后缀名修改,改成如图所示即可(由于我的电脑上安装了一个插件,因而图标进行了转换,但是不安装也无伤大雅,最后都会使用IDEA等进行代码书写):
上述操作全部完成之后,进行代码书写:
public class helloworld {
public static void main(String[] args) {
System.out.println("hello world");
}
}
在上述代码中,public是一种限定符,使用大白话就好像你的日记只能给自己看,其他人不能看,而获得一个好成绩之后所有人都可以看的这种情况,而public表示的就是所有代码都可以用public包含的所有代码。
class表示一个类,这个是在面向对象中会仔细讲解,大致和C语言中的结构体类似。
helloworld就是类名。
其中的就算main函数,和C语言的main函数相同,表示程序的入口,在main函数前面的public、static以及void等都是一些修饰符,在后续学习中会慢慢接触到。
b. 编译
当代码书写完成之后,使用javac命令进行编译,就会生成.class字节码文件。
上述图中可以发现,当使用javac命令之后,就会生成一个.class文件。
生成.class文件之后,只要电脑上安装有JVM,那么就可以运行该java程序,无需再次编译,这就是java的口号:一次编译,到处运行。
c. 运行
当生成.class文件,使用java命令就可以对java程序进行运行。
注意
1. 一个java文件中可以声明多个类,但是最多只能有一个类使用public进行声明,且要求声明的类名与文件名相同。
2. 在使用javac命令时,注意后面跟着的是该程序的文件名,而非类名;当一个java程序中有多个类时,就会生成多个字节码文件。
如上图所示,java程序的文件名是helloworld,因而javac命令后面跟着的就是该名字;而编译完成之后,该文件会生成两个.class文件,而.class文件的名字则是跟java程序中的类名相同。
3. 编译完成之后,使用java程序进行运行时,就不再是以前的文件名,而是.class对应的文件名,但是也有例外,第四条中进行叙述。
4. 在Java中是严格区分大小写的,而windows并不具体区分大小写,因此如果两个类名相同咋办?请看如下例子:
上述例子表明,在windows系统中,如果一个java文件中有大小写不同但字母相同的程序,最后编译时只会生成一个字节码文件,并且文件名是以第一个类名命名的;但是通过java命令发现,使用helloworld是无法运行的,只有使用HelloWorld才可以运行,因此表明了如果存在两个命名相同的类,那么生成的字节码文件名是以第一个类命名,但是其中的内容确是第二个类的内容。
在本篇文章中,是第一个java程序的书写,下篇文章是对变量与运算符的简单介绍;刚入门时,建议大家可以配合视频观看,而并非只看一些书籍,毕竟书籍虽然深度比较深,但还是比较晦涩难懂,这篇文章到这里就结束了,感谢各位的观看。