天天看点

2020/2/25学习笔记-day05java-day5早上下午

java-day5

目录

java-day5

早上

第一节课

通过对API内的部分代码反编译查看

第二节课

回顾双亲委托内容

运行jar包的方式总结

第三节课

自定义类加载器

下午

JAVA是什么?

为什么会发明JAVA?

编译语言

垃圾回收器

1、java不需要自己分配内存

2、new关键字创建对象使用了内存,最终要把内存释放

3、垃圾回收器是什么?

4、我们是否能控制垃圾回收器去回收内存垃圾?

字节码验证

字节码验证规则

解释执行

JIT(Just InTime)即时编译

早上

第一节课

通过对API内的部分代码反编译查看

2020/2/25学习笔记-day05java-day5早上下午

第二节课

回顾双亲委托内容

2020/2/25学习笔记-day05java-day5早上下午

运行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); 
//[email protected]
​
ClassLoader extClassLoader = appClassLoader.getParent();
System.out.println(extClassLoader); 
//[email protected]
​
ClassLoader bootClassLoader = extClassLoader.getParent();
System.out.println(bootClassLoader);
//null
//注意:启动类加载在java中无法表示,因为它不是java语言实现的。所有这里输出null
           

下午

variables变量
           

JAVA是什么?

从jdk角度想,jdk提供什么?jdk能干嘛?
1、编程语言
2、开发环境 
3、运行环境
4、部署环境
           
2020/2/25学习笔记-day05java-day5早上下午

为什么会发明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中的热点代码直接编译成计算机可以运行的代码,这样接下来再调用这个热点代码的时候,就可以直接使用编译好的代码让计算机直接运行,这样子可以提高运行效率。
           
2020/2/25学习笔记-day05java-day5早上下午