A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 永恒之翼网络 中级黑马   /  2012-4-29 08:55  /  2249 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Class类是描述java类的类,按照面向对象的思想,除Class类以外的java类是Class类的实例对象,但为什么说java类加载在内存中的字节码是Class类的实例对象?

3 个回复

倒序浏览
Java类编译后的.class文件时该java类的Class对象的实例。并不是说java类是Class类的实例对象,java类的文件时 类名.java文件   其编译后的文件时 类名.class文件,也就是你所属的加载到内存中的字节码文件。举个例子:
public class Person
{
        public static void main(String[] args)
        {
                Person person1 = null;
                Person person2 = null;
                Person person3 = null;
                for(int i = 0;i<3;i++)
                {
                        person1 = new Person();
                        person2 = new Person();
                        person3 = new Person();
                }
                System.out.println(person1.getClass() == person2.getClass());
                System.out.println(person1.getClass() == person3.getClass());
        }
}
打印结果为:
true
true
就是说Person类的所有对象拥有同一个Class对象,也就是Person类加载到内存中的.class文件是Person类所对应的Class类的一个个实例对象。
回复 使用道具 举报
Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
       Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
      虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
      基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。
      每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
回复 使用道具 举报
我对你们的理解不是很认同,以下是张老师对Class类的定义:
        “Java中的各个java类,是不是同一类事物呢?是不是可以用一个类来描述它们呢?
在java的API中,的确使用一个类来描述它们,这个类是Class”。
意思就是说Class类就是用来描述Java中的各个java类。下面是我自己的理解:
        java类(java中的类)本来就是抽象的,抽象的东西是没有实体的。当用Class类来描述java类,这时的java类相对于Class类来说,是它的实体对象。是对象就是一个实际存在的东西在程序中的映射,但是java类本生是抽象的东西,我们怎样把一个抽象的东西变成一个在计算机中实际存在的对象呢?我们用java类在内存中的字节码来代替java类作为Class的实例对象,因为java类的字节码在内存中是确实存在的(一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这说明字节码可以被一个类来描述,同时内存中的各个字节码可以成为该类的对象),java类的内容是以字节码的形式在内存中的,它拥有java类在程序中的所有功能,或者说java类在程序中的功能都是通过它实现的,比如new对象,所有它能代替它的类成为Class的对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马