java-day5
目录
早上
第一节课
通过对API内的部分代码反编译查看
第二节课
回顾双亲委托内容
运行jar包的方式总结
person.jar是一个可执行jar包,里面有com.xxx.Person.class
同时Person类运行需要依赖hello.jar和commons.jar中的类
这时候有两种方式运行:
1、修改MF文件(配置Class-Path:.....)
2、以运行java类的方式去运行person.jar中的Person类
MF文件不需要配置,只需在外面配置系统环境变量
set classpth=jar/person.jar;jar/hello.jar;jar/c.jar;
将三个包都放在ext文件下,通过双亲委托机制运行
第三节课
自定义类加载器
调用API流程
ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(appClassLoader);
//sun.misc.Launcher$AppClassLoader@2a139a55
ClassLoader extClassLoader = appClassLoader.getParent();
System.out.println(extClassLoader);
//sun.misc.Launcher$ExtClassLoader@7852e922
ClassLoader bootClassLoader = extClassLoader.getParent();
System.out.println(bootClassLoader);
//null
//注意:启动类加载在java中无法表示,因为它不是java语言实现的。所有这里输出null
下午
variables变量
JAVA是什么?
从jdk角度想,jdk提供什么?jdk能干嘛?
1、编程语言
2、开发环境
3、运行环境
4、部署环境
为什么会发明JAVA?
1、提供解释的环境(Java不是真正的编译语言)
*加速我们的开发
*一次编写到处运行(跨平台)
不同平台:操作系统不同
操作系统内核不同
操作支持的机器语言不同
真正的编译语言一般只是针对当前系统中的内核来编译
换个平台就不行了
java语言为什么可以跨平台?
java在不同平台有针对该平台的不同虚拟机
*支持多线程
*动态支持升级(JRE)
2、java提供更加简单的编程方式
*代码更加强壮:
a、没有指针
(程序员不需要自己控制指针来针对不同数据的操作)
b、代码中没有内存指针管理
(程序员不需要自己控制内存的分配使用和释放。
避免了操作不当导致的内存溢出或泄露,这些JVM会搞定)
c、纯正的面向对象编程
(在java中一切皆为对象,做任何操作都是需要对象:
例如:调用方法、访问属性都是通过对象来操作的。
但是static修饰的方法和属性除了对象也可以用类名来访问)
编译语言
hello... --编译--> xxx(计算机直接执行)
例如:C语言
但是java并不是真正的编译语言
Hello.java--编译-->Hello.class-->JVM
--解释字节码-->计算机执行
垃圾回收器
1、java不需要自己分配内存
JAVA有一个关键字:new
同时他也代表了一个操作:创建对象的操作
使用new关键字就表示我们要在java中创建对象,在创建对象之前new关键字
内存中自动为我们申请一块空间,用来存放即将创建来的对象,同时我们要用
的数据也在这个内存中
例如:Person p = new Person(1,"Tom",20);
使用new关键字来创建Person类的一个对象,也称一个实例
同时在内存中从JVM申请一块内存空间存放这个对象,把对象的数据也存进来
2、new关键字创建对象使用了内存,最终要把内存释放
(不用程序员管理)JVM有一个叫垃圾回收器
作用:回收内存中使用过,现在已经不用了的内存空间
3、垃圾回收器是什么?
其实垃圾回收器也是JVM中的一对代码,它运行之后可以帮助我们回收不再使用的内存空间,以便让接下来要使用的代码继续使用。
4、我们是否能控制垃圾回收器去回收内存垃圾?
不能,我们只能通过调用相关的API建议垃圾回收器去清理内存垃圾。
但是是不是立刻清理,程序员控制不了。需要根据当前内存使用情况
和垃圾回收器的内置算法来决定的。
对应的API:
java.1ang.System.gc();
java.1ang.Runtime.gc();
字节码验证
一个class文件被加载到JVM内存之后,实现要经过字节码验证,验证通过后再确定哪些代码是解释执行的,那些代码是JIT及时编译执行的
字节码验证规则
1、检查当前class文件的版本和JVM的版本是否兼容
高版本的JDK编译出的class文件,使用低版本的JDK[无法]运行
低版本的JDK编译出的class文件,使用高版本的JDK[可以]运行
2、坚持代码是否破坏系统的完整性
3、检查当前代码是否有栈的溢出的情况
4、检查当前代码的参数类型是否正确
5、检查当前代码中的类型转换是否正确
解释执行
是java并不是真正的编译语言,编译成的class文件需要JVM文件
进行解释,解释成计算机可以执行的代码。解释一行代码就执行一
行代码。
如果全是如上方法,效率不高。
JIT(Just InTime)即时编译
它是JVM中执行java代码的一种方式,JVM可以使用JIT把java中的热点代码直接编译成计算机可以运行的代码,这样接下来再调用这个热点代码的时候,就可以直接使用编译好的代码让计算机直接运行,这样子可以提高运行效率。