Explorar o código

feat: 新增20260812课程内容——类加载机制(Demo01加载时机与执行顺序演示/静态代码块/代码块/构造方法)、类加载器(Demo02三种类加载器与双亲委派层级获取)、双亲委派模型(Demo03 getResourceAsStream加载prop.properties数据库配置+Properties解析),含课堂笔记

WanJL hai 1 semana
pai
achega
c0956d0805

+ 104 - 0
授课代码/c260812/src/course/Demo01.java

@@ -0,0 +1,104 @@
+package course;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo01
+ * @description 类的加载机制
+ * @create 2026/8/12
+ */
+public class Demo01 {
+    /*
+        java文件  -- 编译--> 字节码文件.class文件--解释-->二进制机器码--执行-->
+
+        类加载器
+        类加载器的作用就是将就是把.class文件加载到内存中
+
+            java文件  -- 编译--> class文件 --类加载器--> 内存 --> JVM(java虚拟机)--解释--> 二进制机器码--->执行
+
+        类加载的时机(什么时候会加载类):
+            1、创建类的实例对象的时候
+            2、调用类的static方法的时候
+            3、访问类或接口的static变量或者为该变量赋值的时候。
+            4、使用反射的方式强制创建某个类或接口对应的java.lang.Class类型的对象的时候。
+            5、初始化某个类的字类对象的时候
+            6、直接使用Java.exe命令运行某个主类的时候。
+
+            使用这个类的时候才会加载这个类,不使用的时候就不加载。
+        类的加载过程:
+            1、通过一个类的【全限定名(包名.类名,比如java.lang.Object)】获取这个类的二进制字节流
+            2、将这个字节流代表的静态存储结构转化为运行时数据结构。
+            3、在内存当中生成一个代表这个类的 java.lang.Class对象,任何类被使用的时候,系统都会为它建立一个java.lang.Class对象。
+
+
+        类的加载过程大体分为3步,也有分为5步:
+            1、加载
+            2、链接
+                |- 验证
+                |- 准备
+                |- 解析
+            3、初始化
+
+
+            1、加载
+            2、验证 -------|
+            3、准备        链接
+            4、解析 -------|
+            3、初始化
+
+
+            1、加载
+            通过包名+类名(全限定名)获取这个类,准备用流进行传输
+            把这个类加载到内存中
+            加载完毕后创建一个Class对象
+
+            2、链接
+                2.1 验证
+                    确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害到虚拟机自身的安全。
+                    说白了就是看文件的信息是否有安全隐患,是否符合虚拟机的规范
+                2.2 准备
+                    负责为类的类变量(static修饰的变量)分配内存,并且设置默认初始化值(初始化静态变量)
+                2.3 解析
+                    将类的二进制数据流中的[符号引用]替换为[直接引用],如果本类中使用了其他的类型,那么在这一步就会开始找了,即需要找到使用的那个类。
+                    没有就报错。
+            3、初始化
+                根据我们通过程序指定的主观计划去初始化变量和其他资源(给静态变量赋值以及初始化其他资源)
+
+            加载 的时候,加载的不一定是.class文件,也可能是某个jar包,jar包就是把Java文件/class文件封装成可以执行的程序包,让别人使用
+
+     */
+    private static int a;
+
+    private String str;
+
+    private Object obj;
+
+    public Demo01() {
+        a=10;
+        System.out.println(a);
+        System.out.println("构造方法...");
+
+        str=new String("hello");
+        obj=new Object();
+    }
+
+    {
+        a=100;
+        System.out.println(a);
+        System.out.println("代码块....");
+    }
+
+    static {
+        a=10000;
+        System.out.println(a);
+        System.out.println("静态代码块");
+    }
+
+    public static void main(String[] args) {
+        Demo01 demo01;
+        demo01= new Demo01();
+        System.out.println(demo01);
+    }
+
+
+}

+ 38 - 0
授课代码/c260812/src/course/Demo02.java

@@ -0,0 +1,38 @@
+package course;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo02
+ * @description 类加载器
+ * @create 2026/8/12
+ */
+public class Demo02 {
+    /*
+            类在加载的时候,是需要使用类加载器进行加载的,大概的分类有三种:
+            BootstrapClassLoader:虚拟机内置的类加载器,一般表示为null,并且没有父null。
+            PlatformClassLoader:平台类加载,负责加载JDK中一些特殊的模块
+            SystemClassLoader:系统类加载器,负责加载用户类路径上所指定的类库。
+
+            SystemClassLoader  继承 PlatformClassLoader 继承 BootstrapClassLoader
+
+
+
+
+     */
+    public static void main(String[] args) {
+        //获取系统类加载器
+        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
+        //获取系统类加载器的父类加载器 平台类加载器
+        ClassLoader platformClassLoader = systemClassLoader.getParent();
+        //获取平台类加载器的父类加载器 虚拟机类加载器
+        ClassLoader bootstrapClassLoader = platformClassLoader.getParent();
+
+
+        System.out.println("系统类加载器:"+systemClassLoader);
+        System.out.println("平台类加载器:"+platformClassLoader);
+        System.out.println("虚拟机类加载器:"+bootstrapClassLoader);
+        //虚拟机类加载器 没有父类加载器,而且不为null,直接就是空指针异常
+        System.out.println("虚拟机类加载器还有没有父类加载器?"+bootstrapClassLoader.getParent());
+    }
+}

+ 68 - 0
授课代码/c260812/src/course/Demo03.java

@@ -0,0 +1,68 @@
+package course;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo03
+ * @description 双亲委派模型
+ * @create 2026/8/12
+ */
+public class Demo03 {
+    /*
+        如果一个类加载器收到了类加载的请求,它并不会自己先去加载,而是把这个请求委派给父类加载器去执行,如果父类加载器还存在父类加载器就会进一步委派,
+        依次递归,请求最终会委派到最顶层的类加载器,如果顶层的类加载器能过完成加载任务,就成功返回。如果无法完成,子类加载器才会尝试自己去加载,这种模式就是双亲委派模型。
+
+        getSystemClassLoader() 获取系统类加载器
+        getResourceAsStream() 加载某一个资源文件
+
+
+        为什么需要双亲委派模型?
+            避免类被重复加载:同一个类在整个JVM中只有一个Class对象(类的唯一性是由 类+类加载器 共同决定的),双亲委派机制可以保证任意一个类都只被加载一次。
+            保证核心类库的安全:防止用户编写一个假的 核心类 混入到系统中,双亲委派机制会依次把请求交给最顶层的类加载器,
+                比如 java.lang.String类只能由顶层的启动类加载器进行加载,用户自定义的同名类永远不会被加载。
+            保证类的唯一性:
+                即使我们自定义了类加载器,加载了 自定义的 java.lang.String类,但是由于双亲委派机制,实际上加载的还是最顶层的类加载器加载的核心类,
+                避免了出现多份不同的String类型的导致的类型混乱。
+
+     */
+    public static void main(String[] args) throws IOException {
+        // --- 下面代码的过程 ,其实是编写代码加载资源配置文件的过程
+        //获取系统类加载器
+        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
+
+        //利用类加载器加载一个指定文件
+        //参数:文件的路径
+        //返回值:字节流
+        InputStream inputStream = classLoader.getResourceAsStream("prop.properties");
+
+        //创建解析properties文件的对象 Properties-它的父类是Hashtable 是Map集合接口的另一个实现类 底层是数组
+        Properties pro=new Properties();
+        //加载输入流对象 -- 其实就是加载我们指定的文件
+        pro.load(inputStream);
+
+        //获取指定的配置信息
+        String driver = pro.getProperty("db.driver");
+        String url = pro.getProperty("db.url");
+        String username = pro.getProperty("db.username");
+        String password = pro.getProperty("db.password");
+
+        //调用连接数据库的方法,执行连接数据库的操作....
+        链接数据库的方法(driver,url,username,password);
+
+
+        //输出
+        System.out.println(pro);
+        //关闭流
+        inputStream.close();
+
+        // xml  / json / yaml
+    }
+    public static void 链接数据库的方法(String driver,String url,String username,String password){
+
+    }
+
+}

+ 5 - 0
授课代码/c260812/src/prop.properties

@@ -0,0 +1,5 @@
+# 教学演示示例:以下配置均为占位符,不包含任何真实账号密码信息
+db.driver=com.mysql.cj.jdbc.Driver
+db.url=jdbc:mysql://localhost:3306/your_database
+db.username=your_username
+db.password=********

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
课堂笔记/01-JavaSE基础-笔记/20260812-笔记.md


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio