JVM内存中的两大对象

在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>) 当对象被回收时可以得到通知

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值