黑马程序员技术交流社区

标题: 关于反射中构造函数的一个问题 [打印本页]

作者: 张先龙    时间: 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