编译java程序过程:
1.构建后缀名为.java的文件
2.在源文件中写准备类等程序
3.把源文件编译成字节码文件
javac+ 源文件名字
-------> ***.class
eg:
javac hello.java
java hello
字节码文件是运行在jvm虚拟机上的
4.java 运行的字节码文件中的程序名字
1.java特性
1.跨平台:
java能够跨平台指的是一个操作做系统中书写的程序编译成class文件可以拿到其他操作系统中进行的。
为什么java语言可以跨平台?
答:java语言本身不跨平台的
jvm:java虚拟机
虚拟出一个你可以能够运行的环境,我们的Java代码是运行在我们的虚拟机里面的,每个操作系统都有相应的虚拟机。
2.java不需要我们管理内存:
java中存在垃圾回收器
垃圾回收器:java中一个特定的线性控制的,每隔一段时间根据算法计算出哪块内存不用,回收掉,我们虽然可以控制调用垃圾回收器,但是垃圾回收器不一定工作。
System.gc(); //启动java垃圾回收器
Runtime.gc();
3.安全:
提供了字节码验证
4.多线程:
语言级别,只需要一个方法开启/关闭线程。
2.java的基本语法
1.类的定义语法
[public]+class 类名{
//属性;方法;构造器;代码块;内部类;静态代码块.
}
2.JVM怎么找到需要运行的类:
环境变量值CLASSPATH找到我们所需要的类,classpath指定在哪,jvm就会去找哪并且加载相应的类。
每次改CLASPATH太麻烦,因此java提供了option 用-cp查找
-cp :指定当前java命令的时候【临时】指明类加载器去哪个位置【加载】我们的程序
3.书写程序时注意事项:
1.java程序和他所在文件之间的关系
一个java源文件中可以包含很多个Java程序但是只能有一个使用public修饰的程序
使用public 修饰的程序,必须保持文件名和类名相同
不加public修饰的程序,文件名和类名就可以不相同
public只能有一个类。
一个源文件中定义了多个类,如果都没有使用PUBLIC ,则文件和类名则没关系
2.java的类和main方法的关系,
main方法可以放在任意一个类中,不管这个类有没有使用public修饰。
如果一个类中没有主方法,但是要想执行则必须在main方法中调用。
3.java源程序中有三个顶级元素:
Class:定义类(必须出现)
package:定义包(可写可不写)
package是为了区分同名的类
//package注意事项:
1.只要出现必须放在程序第一行,要不就不要出现
2.可以出现好几个层级,代表具有层级关系的文件夹,并且使用 . 进行区分例如:com.briup.day2
3.package一旦出现,源码编译过后的class文件必须放在指定package所需要的结构下面,将来确定这个class文件时,
包名+类名作为当前的标识,进行区分!
4.使用 Javac -d path ##.java
编译源文件,默认不会生成包结构
1.如果程序中有package,自动根据package构建相应目录,将编译过后的class放在这个包结构中,将包+class放在指定的位置中.
-d相当于下列三行内容
mkdir -p com/briup/day2
mv person.class com/briup/day2
mv com .
-d的用法:
javac -d path ##.java
java -cp ## //##是程序名字
-cp 就是告诉你path的位置
package 包名;
package:区分同名的类
import:导入包 (可写可不写)
5.加载:
加载程序程序所需要的资源
加载我们需要执行的程序
6.import:
导包;可以出现也可以不出现
在自己的类中使用别人书写的类,如果使用的类不在Java.lang中,同时这个类和你书写的类也不在同一个包下面,这时必须要执行导包操作使用import.
注意:只有使用的类和现在你所在main放的类, 不在一个包中才可以使用import导入外来的包中的类;
import位于package 和class中
3.jar(压缩命令)
根据之前书写的类打一个jar包出来:
1.jar:class变成jar
jar -cvf hello.jar hello.class
1.打包(打包的内容是class)
jar -cvf 名字.jar
2.运行jar
Java -jar hello.jar
3.找到 meta-inf 最后一行添加Main-Class:空格+主程序所在类名
eg:Main-Class: hello
主清单权限
rt.java:就是runtime的缩写,表示运行时环境的意思。
4.执行程序
java -jar ##.jar
制作jar包过程:
vim ##.java 编译成##.class
制作jar包:
jar -cvf ##.jar ##.class
然后继续运行程序:
java -jar ##.jar
有package例外:
4.类加载
:从指定位置将所需要的程序连同需要进行的程序加载到CPU
1.类加载器负责加载类
启动类加载器:jre/lib/#.jar eg: rt.jar 就是启动类加载器加载的
扩展类加载器:jre/lib/ext/#.jar
应用类加载器(本地类加载器):
CLASSPATH指定的位置
-cp 和CLASSPATH 一样,只是对当前的命令【临时】加载去需要加载的内容
2.双亲委托(推卸责任)机制:
由本地类到扩展类再到启动类一层一层地推脱加载。