第十四章-类型信息(1)

一、Class对象

      Class对象是一种特殊的对象,它包含了与类有关的信息。事实上,Class对象就是用来创建类的所有“常规”对象的。每个类都有一个Class对象,换言之,每当编写并编译了一个新类,就会产生一个Class对象(保存在一个同名的.class文件中)。为了生成这个类的对象,运行这个程序的Java虚拟机将使用“类加载器”。

      所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态成员引用时,就会加载这个类。这证明了构造器也是类的静态方法,即使在构造器之前并没有使用static关键字。因此,使用new创建类的新对象也会被当作对类的静态成员的引用。

      类加载器首先检查这个类的Class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件。在这个类的字节码被加载时,它们就会接收验证,以确保其没有被破坏,并且不包含不良的Java代码。

      一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

      Class对象中,forName()是取得Class对象引用的一种方法。它是用一个包含目标类的文本名(区分大小写)的String作为输入参数,返回的是该类的Class对象的引用,使用该方法会显式的要求JVM加载该类的.class文件并初始化该类。

class A
{
	static
	{
		System.out.println("From A!");
	}
}

class B extends A
{
	static
	{
		System.out.println("From B!");
	}
}

public class Test 
{
	public static void main(String[] args)
	{
		System.out.println("---------Using 'new'---------");
		//创建对象之前,根据继承关系,需要首先加载A.class,然后加载B.class
		B b = new B();
		System.out.println("-----------------------------");
		
		System.out.println("---Using 'Class.forname()'---");
		try
		{
			//显式要求加载B.class,但是B.class已经加载,所以不会重新加载
			Class.forName("B");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		System.out.println("-----------------------------");
	}
}

输出

---------Using 'new'---------
From A!
From B!
-----------------------------
---Using 'Class.forname()'---
-----------------------------

 

class A
{
	static
	{
		System.out.println("From A!");
	}
}

class B extends A
{
	static
	{
		System.out.println("From B!");
	}
}

public class Test 
{
	public static void main(String[] args)
	{

		System.out.println("---Using 'Class.forname()'---");
		try
		{
			//显式要求加载B.class,发现B.class和A.class都没加载
			//所以根据继承关系会先加载A.class然后加载B.class
			Class.forName("B");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		System.out.println("-----------------------------");
		
		System.out.println("---------Using 'new'---------");
		//B.class已经加载,可以创建对象
		B b = new B();
		System.out.println("-----------------------------");
	}
}

 

输出

---Using 'Class.forname()'---
From A!
From B!
-----------------------------
---------Using 'new'---------
-----------------------------

 

二、类字面常量

      Java提供了另一种方法来生成对Class对象的引用,即使用“类字面常量”:例如B.class。

      这样做不仅更简单,而且更安全,因为它在编译时就会受到检查(因此不需try&catch),并且它根除了对forName()方法的调用,所以更高效。

      需要注意的是,当使用该方式创建对Class对象的引用时,不会自动初始化该Class对象。为了使用类而做的准备工作实际上包含三个步骤:

      1.加载,这是由类加载器执行的。该步骤将查找字节码,并从这些字节码中创建一个Class对象。

      2.连接。在连接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用。

      3.初始化。如果该类有超类,则对其初始化,执行静态初始化器和静态初始化块。

       使用类字面常量时初始化被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才执行。

class A
{
	static
	{
		System.out.println("From A!");
	}
}

class B extends A
{
	static
	{
		System.out.println("From B!");
	}
}

public class Test 
{
	public static void main(String[] args)
	{
		System.out.println("-----using '.class'------");
		//只加载.class而不初始化,所以无输出
		Class c = B.class;
		System.out.println("-------------------------");

		System.out.println("--using Class.forName()--");
		try
		{
			//虽然已经加载,但是还未初始化,因此会初始化
			Class.forName("B");
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		System.out.println("-------------------------");
	}
}

输出

-----using '.class'-----
-------------------------
--using Class.forName()--
From A!
From B!
-------------------------

 

三、instanceof

      instanceof的语法:[某个对象] instanceof [某个类或接口]

      它返回一个布尔值,用来告诉我们某个对象是否是某个类的实例,或者是某个类的子类的实例;当第二个参数是接口时,表示某个对象是否是该接口的某个实现的实例。它考虑了类的继承体系。

class A
{}

class B extends A
{}

interface C
{}

class D implements C
{}

public class Test 
{
	public static void main(String[] args)
	{
		B b = new B();
		System.out.println("b instance of B: " + (b instanceof B));
		System.out.println("b instance of A: " + (b instanceof A));
		
		D d = new D();
		System.out.println("d instance of D: " + (d instanceof D));
		System.out.println("d instance of C: " + (d instanceof C));
	}
}

输出

b instance of B: true
b instance of A: true
d instance of D: true
d instance of C: true

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值