在java中可以将对象分为两大体系: 字节码对象和实例对象
说明: 字节码对象是一种特殊的实例对象
1. 字节码对象
每个类在被读到内存时, 都会为其创建一个字节码对象, 类型为Class类型, 且这个对象在一个JVM内存中是唯一的, 此对象中存储的是类的结构信息(元数据信息)
字节码对象获取常用三种方式
a)类名.class
b)Class.forName("包名.类名")
c)类的实例对象.getClass()
说明: 字节码对象是获取类结构信息的入口, 同时也是应用反射的入口
package com.bingo.frame.oop.cls;
public class TestClassLoader {
public static void main(String[] args) throws Exception {
Class<?> cls3 = Object.class;
Class<?> cls2 = new Object().getClass();
Class<?> cls1 = Class.forName("java.lang.Object");
//字节码对象唯一性验证
System.out.println(cls1 == cls2);//true
System.out.println(cls2 == cls3);//true
}
}
package com.bingo.frame.oop.cls;
import com.bingo.frame.oop.cls.Outer.Inner01;
class Outer{
class Inner01{}
static class Inner02{}
}
public class TestClassLoader02{
public static void main(String[] args) throws Exception{
//通过外部类创建内部类, 两个类会同时被加载
new Outer().new Inner01();
//下面方式获取内部/外部类的字节码对象并不会导致另一个被加载
//Class<?> cls0 = Outer.class;
//Class<?> cls1 = Outer.Inner01.class;
//Class<?> cls2 = Outer.Inner02.class;//隐式加载,当内存中不存在时去加载
//Class<?> cls3 = Class.forName("com.bingo.frame.oop.cls.Outer$Inner01");//显式加载
}
}
======================================================
2. 类的实例对象
如何理解类的实例对象
!)客观事物在内存中的实现(堆或栈)
2)类的实例对象在同一个JVM内存中可以有多份
Java中实例对象的创建方式
1)通过new关键字创建(前提条件是在编译时即可确定此类的存在)
2)通过反射创建(首先获取类的字节码对象)
java中对象的引用方式
1)强引用(通过对象类型的变量直接引用, Object obj = new Object();)
2)弱引用(WeakReference<T>) 只要有GC,弱引用引用的对象就会被回收
3)软引用(SoftReference<T>) 一般是full gc,软引用引用的对象会被回收
4)虚引用(PhantomReference<T>) 当对象被回收时可以得到通知