java 中 Class 对象详解

本贴最后更新于 2100 天前,其中的信息可能已经渤澥桑田

java 中把生成 Class 对象和实例对象弄混了,更何况生成 Class 对象和生成 instance 都有多种方式。所以只有弄清其中的原理,才可以深入理解。首先要生成 Class 对象,然后再生成 Instance。那 Class 对象的生成方式有哪些呢,以及其中是如何秘密生成的呢?

Class 对象的生成方式如下:

1.Class.forName("类名字符串") (注意:类名字符串必须是全称,包名 + 类名)

2.类名.class

3.实例对象.getClass()

通过一段小程序,来观察一下 Class 对象的生成的原理。

/** * 2012-2-6 * Administrator */ /** * @author: 梁焕月 * 文件名:TestClass.java * 时间:2012-2-6上午10:01:52 */ public class TestClass { public static void main(String[] args) { try { //测试Class.forName() Class testTypeForName=Class.forName("TestClassType"); System.out.println("testForName---"+testTypeForName); //测试类名.class Class testTypeClass=TestClassType.class; System.out.println("testTypeClass---"+testTypeClass); //测试Object.getClass() TestClassType testGetClass= new TestClassType(); System.out.println("testGetClass---"+testGetClass.getClass()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class TestClassType{ //构造函数 public TestClassType(){ System.out.println("----构造函数---"); } //静态的参数初始化 static{ System.out.println("---静态的参数初始化---"); } //非静态的参数初始化 { System.out.println("----非静态的参数初始化---"); } }

null

测试的结果如下:

---静态的参数初始化---

testForName---class TestClassType

testTypeClass---class TestClassType

----非静态的参数初始化---

----构造函数---

testGetClass---class TestClassType

根据结果可以发现,三种生成的 Class 对象一样的。并且三种生成 Class 对象只打印一次“静态的参数初始化”。

我们知道,静态的方法属性初始化,是在加载类的时候初始化。而非静态方法属性初始化,是 new 类实例对象的时候加载。

因此,这段程序说明,三种方式生成 Class 对象,其实只有一个 Class 对象。在生成 Class 对象的时候,首先判断内存中是否已经加载。

所以,生成 Class 对象的过程其实是如此的:

当我们编写一个新的 java 类时,JVM 就会帮我们编译成 class 对象,存放在同名的.class 文件中。在运行时,当需要生成这个类的对象,JVM 就会检查此类是否已经装载内存中。若是没有装载,则把.class 文件装入到内存中。若是装载,则根据 class 文件生成实例对象。

转自:http://blog.csdn.net/yuebinghaoyuan/article/details/7244123

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 61 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 1 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖 • 1 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 90 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 9 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    291 引用 • 4495 回帖 • 663 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 84 关注
  • 印象笔记
    3 引用 • 16 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 650 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖 • 1 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    172 引用 • 1538 回帖
  • 叶归
    12 引用 • 56 回帖 • 22 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 487 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖 • 1 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 59 回帖 • 2 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • abitmean

    有点意思就行了

    36 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 827 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 1 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 4 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • Follow
    4 引用 • 12 回帖 • 1 关注
  • OnlyOffice
    4 引用 • 17 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖
  • 996
    13 引用 • 200 回帖 • 1 关注