企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> 类对象概念: 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。 # 什么是类对象 在理解类对象之前,先说我们熟悉的对象之间的区别: garen和teemo都是**Hero对象**,他们的区别在于,各自有不同的**名称,血量,伤害值**。 然后说说类之间的区别 Hero和Item都是类,他们的区别在于有**不同的方法**,**不同的属性**。 **类对象**,就是用于描述这种类,都有什么属性,什么方法的 # 获取类对象 获取类对象有3种方式 1. Class.forName 2. Hero.class 3. new Hero().getClass() 在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。 > 注: 准确的讲是一个ClassLoader下,一种类,只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader。因为还没有引入ClassLoader概念, 所以暂时不展开了。 ``` package com.dodoke.reflection; import charactor.Hero; public class TestReflection { public static void main(String[] args) { String className = "charactor.Hero"; try { Class pClass1 = Class.forName(className); Class pClass2 = Hero.class; Class pClass3 = new Hero().getClass(); System.out.println(pClass1 == pClass2); System.out.println(pClass1 == pClass3); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } ``` # 获取类对象的时候,会导致类属性被初始化 为Hero增加一个静态属性,并且在静态初始化块里进行初始化。 ``` static String copyright; static { System.out.println("初始化 copyright"); copyright = "版权由Riot Games公司所有"; } ``` 无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。(除了直接使用 `Class c = Hero.class` 这种方式,这种方式不会导致静态属性被初始化) Hero.java ``` package charactor; import java.io.Serializable; public class Hero implements Serializable { public String name; public float hp; public int damage; public int id; static String copyright; static { System.out.println("初始化 copyright"); copyright = "版权由Riot Games公司所有"; } } ``` # TestReflection.java ``` package charactor; import java.io.Serializable; public class Hero implements Serializable { public String name; public float hp; public int damage; public int id; static String copyright; static { System.out.println("初始化 copyright"); copyright = "版权由Riot Games公司所有"; } } ```