`
haibin369
  • 浏览: 59770 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

第十四章-类型信息(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
分享到:
评论

相关推荐

    第十四章 类型信息

    在"chapter14"这个压缩包文件中,可能包含了关于如何获取和利用类型信息的具体示例,涵盖上述各种情况。学习这部分内容,开发者可以提升对程序内部运作的理解,编写更健壮、更易于维护的代码,并且能够更有效地利用...

    计算机应用基础--第一章--项目1-认识和使用计算机.pptx

    计算机的应用领域 过程控制 计算机应用基础--第一章--项目1-认识和使用计算机全文共142页,当前为第14页。 2.计算机的应用领域 计算机辅助技术 (CAD、CAM、CAI、CIMS) 计算机应用基础--第一章--项目1-认识和使用...

    数据库6版讲稿第十四章---基于对象的数据库.ppt

    【数据库6版讲稿第十四章---基于对象的数据库】主要探讨了如何通过引入面向对象的概念和处理新的数据类型来扩展传统的关系模型,以更好地适应复杂数据的存储和管理需求。这一章的内容主要包括嵌套关系、复杂数据类型...

    电子技术原理基础--第十四章--时序逻辑电路.ppt

    《电子技术原理基础--第十四章--时序逻辑电路》主要介绍了时序逻辑电路的基本概念、分类、描述方法以及分析和设计的过程。时序逻辑电路是一种具有记忆功能的数字电路,它的输出不仅取决于当前的输入,还依赖于电路的...

    PL/SQL经典介绍

    第一章 PL-SQL一览 第二章 PL-SQL基础 第三章 PL-SQL数据类型 第四章 PL-SQL的控制结构 第五章 PL-SQL集合与记录(1) ...第十一章 PL-SQL对象类型 第十二章 本地动态SQL 第十三章 PL-SQL应用程序性能调优

    第四十章-文件系统实现1

    第四十章-文件系统实现的预备知识主要涉及文件系统的基础概念和如何使用工具`vsfs.py`来观察文件系统状态的变化。这个工具用于模拟文件系统的操作,如创建文件、目录、读写文件、链接和删除等,以理解这些操作如何...

    推选文档第四章-Visual-Basic-程序设计基础Programme-Design-PPT.ppt

    第四章的焦点是Visual Basic程序设计基础,涵盖了各种基本数据类型的理解和应用。在VB编程中,数据类型是定义变量可以存储何种类型数据的关键概念。 首先,字符串(String)是编程中常见的一种数据类型,用于存储一...

    visual c++6.0mfc类库参考手册第14章-第22章.rar

    《Visual C++ 6.0 MFC类库参考手册第14章至第22章》是一份关于Microsoft Foundation Classes (MFC) 的详细指南,它涵盖了MFC库的广泛内容,从高级控件到数据库编程,再到网络编程。MFC是微软为简化Windows应用程序...

    推选文档第十三章-UNIX系统程序设计-上海交通大学panPPT.ppt

    【推选文档】第十三章-UNIX系统程序设计主要涵盖了UNIX操作系统中系统程序设计的核心概念,特别是关于系统调用的返回值处理以及高级进程间通信(IPC)中的消息通信机制。以下是这些知识点的详细说明: 1. **系统...

    电脑维修技术大全(图文并茂)第13章-第14章.pdf

    【电脑维修技术大全(图文并茂)第13章-第14章.pdf】是一部深入浅出的电脑维修教程,涵盖了计算机硬件维护和软件故障排查的丰富内容。本概述将聚焦于第13章和第14章的核心知识点,帮助读者理解和掌握关键的电脑维修...

    Java 语言程序设计 基础版 第十版 第一章--第五章 课后编程练习题答案

    Java语言程序设计基础版第十版的第一章至第五章课后编程练习题答案涵盖了Java编程的基础概念和关键技能。这些章节的题目旨在帮助学习者深入理解Java语法、数据类型、控制结构、类与对象以及异常处理等核心概念。下面...

    Java编程思想第十四章类型信息之反射与代理.pptx

    Java编程思想第十四章类型信息之反射与代理.pptx

    Python基础案例教程-第2章-基本数据类型.ppt

    这些数据类型包括数字、字符串和布尔型,它们分别用于处理不同的信息。本章深入探讨了Python的这些基本数据类型及其操作。 1. **数字类型** - **整数(Integer)**:整数是不包含小数部分的数值,如20、89、-30等...

    JAVA习题库#第四章-方法.doc

    "JAVA习题库#第四章-方法" 本章节主要讲解了Java语言的方法相关知识点,包括方法的调用、方法的返回值、递归方法、方法重载、基本数据类型类等。 一、方法的调用 在Java语言中,方法可以通过方法名和参数来调用,...

    第3章 PL-SQL数据类型

    - **SIGNTYPE**:取值范围限于 -1、0 和 1,适用于表示三态逻辑。 ##### 2. NUMBER - **定义与用途**:`NUMBER` 类型可以存储定点或浮点数,取值范围非常广泛,从 1E-130 至 10E125。如果数值超出此范围,系统会...

    Python基础案例教程-第2章-基本数据类型.pptx

    例如,`14 + 5`的结果是19,`14 - 5`的结果是9,`14 * 5`是70,`14 / 5`约等于2.8,`14 % 5`是4,`14 // 5`是2,而`2 ** 3`则是8。在进行运算时,需要注意运算符的优先级,通常遵循先乘除后加减的原则。 在实际应用...

    第2章--数据类型、常量和变量练习题答案-华中社《C语言程序设计上机指导与练习》.doc

    * 整型常量:例如 10,-1 等。 * 浮点型常量:例如 3.14,-0.5 等。 * 字符常量:例如 'a','\n' 等。 * 字符串常量:例如 "hello","goodbye" 等。 五、变量 * 变量的声明:例如 int a;,float b; 等。 * 变量的...

    03307 21世纪高级营销主管培训--第十四章-设计和管理服务(PPT 13).ppt

    在21世纪的高级营销主管培训中,第十四章的主题聚焦于设计和管理服务。这一章节探讨了服务的本质,服务的分类,以及如何通过差异化和质量提升来优化服务。服务的定义强调其不可分离性、易消失性、无形性和可变性这四...

    数据库程序设计(共22章-PPT格式),内容很不错

    第1章 SQL Server 概述 ...第14章 创建和维护索引 第15章 实现视图 第16章 实现存储过程 第17章 实现用户定义函数 第18章 实现触发器 第19章 多服务器编程 第20章 优化查询性能 第21章 分析查询 第22章 管理事务和锁

Global site tag (gtag.js) - Google Analytics