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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海刚 黑马帝   /  2011-8-5 11:31  /  1787 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str1 ="abc";
                Class cls1 = String.class;
                Class cls2 = str1.getClass();
                Class cls3 = Class.forName("java.lang.String");
                Class cls4 = Class.class;
                System.out.println(cls1 == cls3);
                System.out.println(cls1 == cls4);


true;
false;

请问第二个为什么是false, Class.class代表什么意思 返回值是什么

3 个回复

倒序浏览
黑马网友  发表于 2011-8-5 12:08:41
沙发
System.out.println(Class.class); //打印class java.lang.Class
                  System.out.println(String.class); //打印class java.lang.String
JAVA中都是类,Class也是一个类,Class.class返回Class类的字节码,上三个都是String的字节码
Class类与String类都是直接继承自Object类

详情参看JDK文档的Class类
回复 使用道具 举报
黑马网友  发表于 2011-8-5 14:20:27
藤椅
Class 是另外一个类  这个类的字节码 根这里面的String 没有什么联系啊 为什么要相等

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

以下示例使用 Class 对象来显示对象的类名:


     void printClassName(Object obj) {
         System.out.println("The class of " + obj +
                            " is " + obj.getClass().getName());
     }
还可以使用一个类字面值(JLS Section 15.8.2)来获得命名类型(或 void)的 Class 对象。例如:


     System.out.println("The name of class Foo is: "+Foo.class.getName());
回复 使用道具 举报
黑马网友  发表于 2011-8-5 16:11:22
板凳
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class.



对比提问:Person类代表人,它的实例对象就是张三,李四这样的一个个具体的人,Class类代表Java类,它的各个实例对象又分别对应什么呢?

对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。

一个类被类加载器加载到内存中,占用一片存储空间,这个空间的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?



如何得到各个字节码对应的实例对象(Class类型)



类名.class,例如,System.class

对象.getClass(),例如,new Date().getClass()

Class.forName("类名"),例如,Class.forName("java.util.Date");



String str = "abc";  
  Class cls1 = String.class;
  Class cls2 = str.getClass();
  Class cls3 = Class.forName("java.lang.String");



System.out.println(cls1==cls2);  //true
  System.out.println(cls2==cls3);  //true



九个预定义Class实例对象

八个基本数据类型(boolean,byte,char,short,int,long,float,double)+void

参看Class.isPrimitive()方法的帮助

int.class = Integer.TYPE

数组类型的Class实例对象

Class.isArray()



总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如int[],void...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马