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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yuchunfeng1221 中级黑马   /  2013-9-27 17:14  /  1925 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yuchunfeng1221 于 2013-10-15 00:41 编辑

String s= "abc";Constructor constructor1 = String.class.getConstructor();
System.out.println(constructor1.newInstance());

为什么没有结果呢,运行后什么也没有?

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
因为语法写错了,LZ好像还没有理解反射
Constructor constructor1 = String.class.getConstructor();
上面通过反射获取了String的空参数构造函数,其实是没有意义的。
应该写成这样
Constructor constructor1 = String.class.getConstructor(String.class);
表示我要拿到有一个String参数的构造函数。
然后用newInstance获取这个反射的新实例。
System.out.println(constructor1.newInstance("asd"))
打印这个实例。
回复 使用道具 举报
yxz 发表于 2013-9-27 18:28
因为语法写错了,LZ好像还没有理解反射
Constructor constructor1 = String.class.getConstructor();
上面 ...

你说的传参数的,我懂,但是我就是想知道,空参的构造函数,通过反射建立对象之后,是什么?不是能建立对象吗?为什么什么也打印不出来呢?
回复 使用道具 举报
yuchunfeng1221 发表于 2013-9-27 19:08
你说的传参数的,我懂,但是我就是想知道,空参的构造函数,通过反射建立对象之后,是什么?不是能建立对 ...

我是这么想的,不知道对不对
你代码
Constructor constructor1 = String.class.getConstructor();
得到的是String的空参构造函数,
你的代码中的
String s= "abc";
根本没有什么实际意义,
当你实例化对象
constructor1.newInstance() 的时候,相当于
String string = new String();
就算是运行没问题你让他打印什么出来呢?本来就没有可打印的字符串.

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
yuchunfeng1221 发表于 2013-9-27 19:08
你说的传参数的,我懂,但是我就是想知道,空参的构造函数,通过反射建立对象之后,是什么?不是能建立对 ...

可以建立对象的,System.out.println会掉用toString然后打印出内容来。但由于你实例化的字符串内容是"",所以结果就是什么都没被打印。
其实就跟LS说的一样。
回复 使用道具 举报
你这写法是调用了String类的空参构造函数,调用肯定是成功的,但是String类的空参构造函数是这样的:
  1. public String() {
  2.         this.offset = 0;
  3.         this.count = 0;
  4.         this.value = new char[0];
  5.     }
复制代码
这里面就几个赋值的操作并没有打印什么东西或者返回什么东西,所以肯定不会在控制台有输出了
回复 使用道具 举报
我理解楼主的意思理解错了,楼主的意思应该是这样的吧,为什么我们自己新建一个类,创建一个类的空参对象后打印出来的时候是该对象的内存地址,比如类似于:Test@131e2e
但是使用反射,调用String类的构造函数为什么打印的不是String类的内存地址,而是什么都没有,是这个意思吧?

经过测试我们会发现,自己新建的类,无论是直接new一个对象,还是通过反射的方式调用newInstance()方法,打印出来的都是对象的内存地址,这是因为自己新建的类默认继承Object类,当我们调用System.out.println打印的时候,对象会默认调用toString方法,Object的toString方法返回的是:
  1. getClass().getName() + '@' + Integer.toHexString(hashCode())
复制代码
所以打印的结果是我们看到的内存地址;

但是String类却没有,通过查看String类的源码可以得知,String类重写了Object的toString方法,返回的是this,源码如下:
  1. public String toString() {
  2.         return this;
  3.     }
复制代码
既然我们调用的是String的空参构造函数,也就是说我们传了一个空的对象给String,所以打印的是空,这么说楼主能理解了吗?

评分

参与人数 1技术分 +2 收起 理由
黄文伯 + 2 赞一个!

查看全部评分

回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
黄文伯 发表于 2013-10-14 15:03
亲,如问题已解决请将分类的“未解决”改为“已解决”。以后的问题贴也要及时更改分类哦~ ...

谢谢
我能问一下怎么改分类吗?怎么改成已经解决啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马