> 類對象概念: 所有的類,都存在一個類對象,這個類對象用于提供類本身的信息,比如有幾種構造方法, 有多少屬性,有哪些普通方法。
# 什么是類對象
在理解類對象之前,先說我們熟悉的對象之間的區別:
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公司所有";
}
}
```