请问类对象到底是什么啊?用Class t=Class.forname("java.lang.Thread")返回的是Thread的类对象是什么意思?到底有什么用啊

解决方案 »

  1.   

    打个比方,比如说,人是一个类(Human Class),张三,李四是具体的人的对象(Human instance),即 Human 张三 = new Human("张三"),Human 李四 = new Human("李四"),这时我把张三挑出来,我要判断张三是什么类,比如调用 张三.getClass(),那么,getClass返回值应该是一个特殊的类的对象,而不是人的对象,对不对?也就是Class c = 张三.getClass(),而不是 Human c = 张三.getClass(), 因为张三,李四这样的才算是人的对象。那么这个特殊的类的对象c就是你所说的类对象。同样的,Class.forname( "Human"),返回的就应该是人的类的对象而不是人的对象。再打个比方,比如你有一个配置文件,就用porperties文件吧,里面有这样的设置
    classname=Human (根据不同的需求可以设置需要用不同的类)
    这时候,你想从配置文件中读出类的名字,然后想通过这个名字去生成实例,而读出文件时,得到的是"Human"这样的字符串,你要怎么用它生成实例呢,总不能 "Human" 张三 = new "Human"("张三")吧,字符串是不能当作类使用的,对不对?你也不可能在配置文件中设置一个类,然后从文件中读出来就是一个类,你只能在文件中设置classname=Human这样的字符串(文件里的内容都算是字符串),你从文件里读出来的也只能是字符串,对不对?那么这时候,你要生成实例,就必须通过这个特殊的类对象,即 Class c = Class.forName("Human");这样你得到这个类对象c以后,就可以通过相应的方法去创建人对象或者改变某个人对象的属性和方法。这个类对象到底有什么用?这里就是主要的用处了。
      

  2.   

    “我要判断张三是什么类,比如调用   张三.getClass(),那么,getClass返回值应该是一个特殊的类的对象”它返回的是 张三这个实例的一个模板,返回的应该是一个类,正是这个类的瞬间状态实例化了 张三,为什么你说返回的是"特殊的类的对象"呢?能不能用书面语解释下,我理解不了,既然你说是特殊的类的对象,也就是说,存在这样一个类,这个类的实例是一个类?不是一个对象.而不是人的对象,张三.getClass()返回的就是一个实例化张三的类,当然不是一对象了..我认为每个对象才内存空间,既然static成员是有空间的,那么static成员应该属于这个类的类对象,而普通的的成员是属于这个类的实例对象,类的类对象,类的实例对象,在层次上到底是怎样的?我还是不明白,你能不能说的更详细点,最好只用精确的书面语说明一下,因为每个人具的例子都贯注了每个人独特的想法,我有点看不懂。
      

  3.   

    也就是说,存在这样一个类,这个类的实例是一个类?
    ---------------------
    就是这个意思,就是存在这样一个类,这个类就是Class,这个类的实例是一个类对象。
    首先你要知道,类是用户定义的一种数据类型,对于java来说,所有的程序都是基于类来实现的,那么,我要知道某个类是什么样的数据类型,比如这个类是什么名字,在哪个包里面,有些什么属性和方法等等,这样是不是就要定义一个类,专门用于记录某个类是什么样的数据类型?在java里就提供了这样一个类,这个类就是java.lang.Class,既然它是一个类,那么是不是也应该可以实例化呢?如果可以实例化,那么实例化的对象是不是也是一个对象?如果这个对象记录的是Class A的信息,那么就说它是A类的类对象,如果是记录Class B的信息,那就是B类的类对象,等等。至于你说的
    我认为每个对象才内存空间,既然static成员是有空间的,那么static成员应该属于这个类的类对象,而普通的的成员是属于这个类的实例对象
    对于static而言,通常都说类属性或类方法,或者说是某个类的静态属性或静态方法,而不会说static成员属于这个类的类对象,static没有对象一说,只有类一说。至于给static成员分配的内存空间,那是属于静态域的空间,常量也是被分配在这个空间里,其他类的static属性也分配在这片空间,所以static分配的内存空间也没有特别的说是static内存空间属于某个类的类对象,没有这样的说法
    ,只有说这片static内存空间属于这个类。不是说存在内存的就算是对象,否则,对于int这样的数据,也需要内存,你也因为它分配了内存而非要说它属于XXX对象吗?
      

  4.   

    简单的说类本身也是一种事物,那么各种各样的类也是可以被抽象成类的,就是Class类
    Class 类的实例表示正在运行的 Java 应用程序中的类或者接口。
    Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
    得到没各类对应的Class对象的常用方法:
    1.Class.forName(String className)方法返回一个对应类的Class对象,如Class.forName("java.lang.String")
    2.className.class,如java.lang.String.class等价于Class.forName("java.lang.String"),每个类都会有这个public属性
    3.此外还可以用某个对象本身得到相应的Class对象,如Object str = new Object(...); str.getClass()等价于前两者,每个对象实例都有这个方法,用以返回表示对象所属类对应的Class对象
    1.public static Class<?> forName(String className) throws ClassNotFoundException----不多解释
    2.public String getName()----以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称
    3.public boolean isInstance(Object obj)----判定指定的 Object 是否与此 Class 所表示的对象赋值兼容(是赋值兼容,不需完全一样)
    4.public T newInstance()----建此 Class 对象所表示的类的一个新实例。
      

  5.   

    哦两位的解释很详细了,我受益匪浅。
       JAVA所处理的单元都是一个实体,这个实体被叫做对象,JAVA所处理的都是对象;
    类生成了自己的一个实体,这个实体被叫做类的实例,这就是JAVA所处理的一种对象,称为【类的实例对象】,这种实例对象JVM利用代码块控制PC行为的桥梁,其中包含了类的所有非静态成员,普通成员被synchronization,实际上JVM为实例对象分配的实例对象锁锁住了其管辖范围的全部非静态成员或部分非静态成员。
    但是生成【类的实例对象】的这个类,也必须被JVM识别,JVM在加载所有的类的时候,为每个类生成了一个记录该类所有信息的实体(有点像备份),这个实体是每个类所独有的,也就是JVM为每个类生成的Class对象,这个Class对象里记录了该类所用到的其他类的信息,记录了该类的名字,该类所在的包,这个对象还包含了该配套类中的所有静态成员,静态成员被synchronization,实际上是JVM为类的Class对象分配的Class对象锁锁住了其管辖范围的全部静态成员或部分静态成员。
       一个用户定义的类被加载时,用到的其他所有类包括用户类,和标准类,JVM都为其生成了一个Class对象,在一个应用程序被正确执行之前,这个程序所涉及到的每个类都会在JVM的类装载器中生成唯一一个配套的Class对象,JVM就是通过这个Class对象来识别所用到的所有类,一旦出现异常就意味着无法对某个类生成Class对象, ClassNotFoundException,JVM无法识别这个类,在识别了这个类之后,再通过【类的实例对象】,控制PC行为
       JAVA处理的对象就是这两种对象,类的实例对象,类的Class对象,即类的类对象.
      

  6.   

    我理解的对吗?每个类的Class对象主要是后台处理所需要的,
    类的实例对象.getClass()   就是返回这个实例对象所属于的类的Class对象.
    类的实例对象.getClass().getName() 就是返回于这个Class对象配套的类的名字而已.
    获得每个类的Class对象,可以用 forNAME方法,  .getClass方法  以及直接用 Class c =类名.class 
    感觉人为的编写这些代码没什么用?有那些位置必须要用到类的Class对象呢?反正JVM都可以为正确存在的类生成Class对象.
      

  7.   

    这样吧,给LZ你几个问题思考,那你就知道这样的代码有没有用了
    比如有这样一个类
    class A {
        private name;
        public A() {
            this("A");
        }
        public A(Sring name) {
            this.name = name;
        }
        private viod showName() {
            System.out.println("name=" + name);
        }
    }1 现在我有个方法
    Object createInstance(String className, Class[] params, Object[] args) {
        //LZ试试看这里应该怎么写代码最方便,扩展性也最好
    }
    根据传入的类名字和参数,来生成不同的类实例,例如调用createInstance("A", new Class[]{}, new Object[]{})能够实现和new A()一样的结果,调用createInstance("A", new Class[]{String.class}, new Object[]{"ABC"})能够实现和new A("ABC")一样的结果,调用createInstance("B", new Class[]{}, new Object[]{})能够实现和new B()一样的结果,等等2 我现在有个方法
    public Object invokeMethod(A a, String methodName, Class[] params, Object[] args) {
        //LZ看看这里应该怎么写代码能让其实现根据传入的某个方法名和参数而调用a对象相应的方法,比如调用invokeMethod(a, "showName", new Class[]{}, new Object[]{}); 能实现和调用a.showName()一样的结果,其中a是A的实例
    }当然,这些方法也是我随手编出来,但是类似的方法实际中也没少用,具体为什么需要这样的方法,那就等你深入项目以后去慢慢体会吧,我上面也提了一下,这里也不多说了。
      

  8.   


    阿宝.....
    那你能不能解释下,我用JDBC连接数据库的时候,开头必须得带一句: 
    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    这是什么意思啊?
    还有能不能解释下API,就是说我们平时写程序的时候那里都绝对涉及到了JAVA API
      

  9.   

    加载sqlserver数据库驱动,也就是加载实现JDBC中接口的类。
    每个数据库实现JDBC的接口的类到不同,比如ORACLE,就是Class.forName("oracle.jdbc.driver.OracleDriver");
    API这个问题,怎么回答呢?只能这么说什么写程序都需要API,特别是使用一些工具时,例如Hibernate,Servlet,Spring等