黑马程序员技术交流社区
标题:
关于反射中构造函数的一个问题
[打印本页]
作者:
张先龙
时间:
2013-4-12 11:28
标题:
关于反射中构造函数的一个问题
张孝祥老师的基础加强的19集里面的一个例子:
import java.lang.reflect.Constructor;
public class ConTest {
public static void main(String[] args) throws Exception {
Constructor<String> con=String.class.getConstructor(StringBuffer.class);
String str=(String)con.
newInstance(new StringBuffer("abc"));
System.out.println(str);
}
}
和我自己写的一个程序
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class PrintClass{
private String s;
public PrintClass(String s){
this.s=s;
}
public void print(){
System.out.println(s);
}
}
public class Test5 {
public static void main(String[] args) throws Exception{
Class clazz=PrintClass.class;//获得字节码对象
Constructorconstructor=clazz.getConstructor(String.class);
PrintClassprintclass=
(PrintClass)constructor.
newInstance("abc");}}
这两个程序都能运行成功
这两个程序调用newInstance()的方法:
第一个程序中用构造函数创建实例:
String str=(String)con.newInstance(new StringBuffer("abc"));
第二个程序中用构造函数创建实例:
PrintClass printclass=(PrintClass)constructor.newInstance("abc");
我试过,第一个程序用第二种方式出错,第二个用第一种方式也是出错,但是两个类几乎是一样的啊?我的疑问就是红色的那部分代码为什么不一样呢?
作者:
杨玉辉
时间:
2013-4-12 11:55
public String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。由于 String 是不可变的,所以无需使用此构造方法,除非需要 original 的显式副本
API 是上述定义的,除非需要original 显示副本,否则,就没有用到该构造方法String s = new String(“abc”);只是适用于普通的方法
要获取该字符串的构造方法 ,就必须有original 显示的副本
因为String的组成单位是char 你可以通过 char[] 数组将字符串传入,或者通过StringBuffer ,这只是演示获取该Constructor 的,有就可以获取,但是你得最好查一下API 看看有什么限定条件,就是这么定义的,为什么呢?
援引张老师的一句话,你不要问为什么,等你搞懂了,哪还有时间做更多有意思的事情?
作者:
张先龙
时间:
2013-4-12 12:16
杨玉辉 发表于 2013-4-12 11:55
public String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换 ...
关于我的问题,你的回答帮助蛮大的 ,,对这个问题来说,不搞懂下次还是over啊 我自己写的第二个就是看了老张的视频编的 结果把自己折腾得够呛
作者:
打工人
时间:
2013-4-12 23:16
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2