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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张雪磊 中级黑马   /  2012-7-13 22:04  /  2012 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张雪磊 于 2012-7-13 22:07 编辑
  1. class Demo
  2. {
  3.         private int num;
  4.         Demo(int num)
  5.         {
  6.                 this.num = num;
  7.         }
  8. }
  9. class ObjectDemo
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 Demo d1 = new Demo(4);
  14.                 <font color="#ff0000">Class c = d1.getClass()</font>

  15.                 System.out.println(c.getName());


  16.         }
  17. }
复制代码
这段代码红色部分有点不理解。是毕老师的视频第八天的。一开始毕老师写到Class c这里的时候我以为是要创建Class这个类的对象,可是后面并不是我想的那样。这句好像是直接调用了d1的getClass方法然后赋给了c,但是这个c可以直接这么写吗?老师说这个Class也是个类,难道不应该先创建Class类的对象c?否则这个c是哪来的呢?这个有点彻底蒙了。

9 个回复

倒序浏览
张老师视频中提到一句话:反射就是把java类中的各种成分映射成相应的java类,
而 Class 类 作为反射的基石,代表的就是各个java 类的字节码文件。

获得一个java类 Class 对象有3中方法:
  1.  通过 类名.class   象你的例子   Demo.class
   2.  通过 实例名.getClass()   象你的  d1.getClass()
3, 通过 Class.forName("classname")    eg: Class.forName("Demo")
回复 使用道具 举报
本帖最后由 黑马高明辉 于 2012-7-13 22:17 编辑

Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
但是,这段代码如果用在其他类型上,就相当于一下代码:
                String str = new String();
                str = "sfadsf";
                String str2 = str.toLowerCase();
--------------但是下面这么写就是错的了,理由就是前面说的,不能显示声明一个Class对象。

//        Class c = new Class();
         Class c=  d1.getClass();
回复 使用道具 举报
红色部分,这个不需要创建,因为JavaApi中就有这个以Class为类名的类,该类中有获取getclass这个方法(用来获取类名的)
回复 使用道具 举报
本帖最后由 邱国 于 2012-7-13 22:21 编辑

java反射的知识点:

首先理解d1.class(),返回的是什么?
在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类
所以,d1.class(),返回的就是类似一个类变量,
类似这样:
int c = 5;,右边这个5,用了一个方法返回,上面的也是这个道理
回复 使用道具 举报
注意没有啊这个Class的首字母是大写的这就说明他是个类,他是在这里java.lang.Class。你注意到没有这个包是以java开头的,所以他是jdk中自带的一个类,这就可以直接拿来用了。getName就是Class下的一个方法可以得到包名字和类名字
回复 使用道具 举报
丁朋 中级黑马 2012-7-13 22:37:58
7#
Class c = d1.getClass()这个东西在 黑马程序员_毕向东_Java基础视频教程第06天-09-面向对象(单例设计模式)这里有,你再看下就懂了!
回复 使用道具 举报
Class c = d1.getClass();
这里的getClass()方法返回的是一个Class类型的类对象,由Class类型的引用变量c指向是正确的。
回复 使用道具 举报
周刚 中级黑马 2012-7-13 22:55:54
9#
每一个对象都有自己的一些属性,比如他是属于哪个类。Object是所有对象的父类,它对getClass的描述如下:
getClass
public final Class<?> getClass()返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
实际结果类型是 Class<? extends |X|>,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass。 例如,以下代码片段中不需要强制转换:

Number n = 0;
Class<? extends Number> c = n.getClass();


返回:
表示此对象运行时类的 Class 对象。
另请参见:
The Java Language Specification, Third Edition (15.8.2 Class Literals)
--------------------------------------------------------------------------------------------------
对Class的说明:
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
此程序实现的功能是获得该Class对象所表示的实体名称。
它这里的确是调用Demo对象d1的getClass()方法,因为得到java类字节码有一种方式就为:对象.getClass();
那么d1.getClass()就是字节码对象,其返回类型也就是字节码类型,而字节码类型用Class表示,由此定义变量c接收字节码对象
综上所述,Class c是根据等号后面的返回值定义,而不是自己创建的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马