黑马程序员技术交流社区
标题: Class类的问题 [打印本页]
作者: 张雪磊 时间: 2012-7-13 22:04
标题: Class类的问题
本帖最后由 张雪磊 于 2012-7-13 22:07 编辑
- class Demo
- {
- private int num;
- Demo(int num)
- {
- this.num = num;
- }
- }
- class ObjectDemo
- {
- public static void main(String[] args)
- {
- Demo d1 = new Demo(4);
- <font color="#ff0000">Class c = d1.getClass()</font>
- System.out.println(c.getName());
- }
- }
复制代码这段代码红色部分有点不理解。是毕老师的视频第八天的。一开始毕老师写到Class c这里的时候我以为是要创建Class这个类的对象,可是后面并不是我想的那样。这句好像是直接调用了d1的getClass方法然后赋给了c,但是这个c可以直接这么写吗?老师说这个Class也是个类,难道不应该先创建Class类的对象c?否则这个c是哪来的呢?这个有点彻底蒙了。
作者: 丁二跃 时间: 2012-7-13 22:15
张老师视频中提到一句话:反射就是把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:16
本帖最后由 黑马高明辉 于 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();
作者: 全海波 时间: 2012-7-13 22:17
红色部分,这个不需要创建,因为JavaApi中就有这个以Class为类名的类,该类中有获取getclass这个方法(用来获取类名的)
作者: 邱国 时间: 2012-7-13 22:20
本帖最后由 邱国 于 2012-7-13 22:21 编辑
java反射的知识点:
首先理解d1.class(),返回的是什么?
在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类
所以,d1.class(),返回的就是类似一个类变量,
类似这样:
int c = 5;,右边这个5,用了一个方法返回,上面的也是这个道理
作者: 耿立刚 时间: 2012-7-13 22:36
注意没有啊这个Class的首字母是大写的这就说明他是个类,他是在这里java.lang.Class。你注意到没有这个包是以java开头的,所以他是jdk中自带的一个类,这就可以直接拿来用了。getName就是Class下的一个方法可以得到包名字和类名字
作者: 丁朋 时间: 2012-7-13 22:37
Class c = d1.getClass()这个东西在 黑马程序员_毕向东_Java基础视频教程第06天-09-面向对象(单例设计模式)这里有,你再看下就懂了!
作者: 黑马-王言龙 时间: 2012-7-13 22:44
Class c = d1.getClass();
这里的getClass()方法返回的是一个Class类型的类对象,由Class类型的引用变量c指向是正确的。
作者: 周刚 时间: 2012-7-13 22:55
每一个对象都有自己的一些属性,比如他是属于哪个类。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 对象。
作者: 柯玲 时间: 2012-7-14 18:58
此程序实现的功能是获得该Class对象所表示的实体名称。
它这里的确是调用Demo对象d1的getClass()方法,因为得到java类字节码有一种方式就为:对象.getClass();
那么d1.getClass()就是字节码对象,其返回类型也就是字节码类型,而字节码类型用Class表示,由此定义变量c接收字节码对象
综上所述,Class c是根据等号后面的返回值定义,而不是自己创建的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |