第一章 类加载器
1.1 类加载器介绍
作用:负责将.clss文件(存储的物理文件)加载到内存中。
1.2 类加载过程
类加载时机
创建类的实例(对象)
调用类的方法
访问类或接口的类变量,或者为该变量赋值
使用反射方法来强制创建某个类或接口对应的java.lang.Class对象
初始化某个类的子类
直接使用java.exe来运行某个主类
类加载的过程
1.加载
通过包名和类名,获取这个类,准备使用流进行传输
在这个类加载到内存中
加载完毕后创建一个class对象
2.链接
验证
确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全
准备
负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始值
解析
将类的二进制数据流中的符号引用替换为直接应用
3.初始化
根据程序员通过程序制定的主观计划去初始化变量和其他资源
1.3 类加载分类
分类
Bootstrap class loader:虚拟机的内置加载器,通常表示为null,并且没有父类
Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
System class loader:系统类加载器,负责加载用户类路径所指定的类库
类加载器的继承关系
System的父类加载器为Platform
Platform的父类加载器为Bootstrap
1.4 双亲委派模型
介绍
如果一个类加载器收到了类加载的请求,它不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类的加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载,如果父类可以完成加载,就返回成功,倘若父类加载器无法完成此加载任务,子类加载器才会尝试自己去加载,这就是双亲委派模式。
第二章 反射
2.1 反射概述
反射机制:
是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意属性和方法;
这种动态获取信息及动态调用方法的功能称为java语言的反射机制。
2.2 获取Class对象三种方式
三种方式分类
类名.class属性
对象名.getClass()方法
Class.forName(全类名)方法
2.3 获取构造方法使用
2.4 反射获取成员变量使用
2.5 反射获取成员方法使用
第三章 枚举
1.1 概述
为了间接的表示一些固定的值,Java给我们提供了枚举
是指将变量的值列出来,变量的值只限于列举出来的值的范围
1.2 定义格式
public enum s{
枚举项1,枚举项2,枚举项3;
}
注意:定义枚举项要使用关键字enum
1.3 枚举特点
所有枚举类都是Enum类的子类
可以通过“枚举类名.枚举项名称”去访问指定的枚举项
每一个枚举项其实是该枚举的一个对象
枚举也是一个类,也可以定义成员变量
枚举类的第一行必须是枚举项,最后一个枚举项后的分号可以省略,但是如果有枚举类有其他东西,这个分号就不能省略。
枚举类可以有构造器,但必须是private的,它默认的也是private的
枚举项的用法比较特殊:枚举(“”);
枚举类也可以有抽象方法,但是枚举项必须重写该方法
1.4 枚举方法
package com.wedu;
public class EnumDemo {
public static void main(String[] args) {
// 获取枚举项
System.out.println(S.SPRING);
// 获取枚举项名称
System.out.println(S.SUMMER.name);
// 返回枚举项在枚举类中的索引值
System.out.println(S.AUTUMN.ordinal());
// 比较两个枚举项,返回的是索引差值
System.out.println(S.SPRING.compareTo(S.WINTER));
// 返回枚举常量名称
System.out.println(S.SPRING.toString());
// 获取指定枚举类中的指定名称的枚举值
System.out.println(Enum.valueOf(S.class,"SPRING"));
// 获得所有枚举项
S[] s = S.values();
for (S value:s){
System.out.println(value);
}
}
}
enum S{
SPRING("春"){
@Override
public void show() {
System.out.println(this.name);
}
},SUMMER("夏"){
@Override
public void show() {
System.out.println(this.name);
}
},AUTUMN("秋"){
@Override
public void show() {
System.out.println(this.name);
}
},WINTER("冬"){
@Override
public void show() {
System.out.println(this.name);
}
};
public String name;
S(String name) {
this.name = name;
}
public abstract void show();
}