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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李光耀 于 2013-7-21 10:43 编辑

String str =new String("abc");
Method  methodCharAt = String.class.getMethod("charAt", int.class);
String s = (String)methodCharAt.invoke(str,1);
//要是打印s报错
//"main" java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String
//返回的是Object对象,转成(String)为啥不行呢
//直接打印就可以
System.out.println(methodCharAt.invoke(str,1));

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 楼主你好 如果帖子的问题已经解决,请把帖.

查看全部评分

4 个回复

倒序浏览
本帖最后由 zhouchao 于 2013-7-20 14:15 编辑

父类对象不能强制转化成子类对象,java中用类来实例化对象主要是因为类中含有这类实例中的共有属性,而类中集合了这些属性;父类与子类,子类是父类的扩展,子类比父类更具体,意思也就是说,子类比父类所拥有的方法属性更多,更具体,但子类中又包含有父类中的全部属性方法,所以当子类对象强制转化为父类对象是时允许的,因为子类对象中含有与父类对象相同的属性,但是当父类对象强制转化成子类对象时就不可能了 而Object是所有类的父类,所以不能强制转化成String类型
                Object obj = (Object)new String("sss");
                System.out.println(obj);
这个就可以打印的出来

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
..可以转,父类是可以转成子类的..报错是因为它本质是一个Character类型的对象,然后被转成了Object类对象。所以你把它强制转成String类型的对象就不对了,只能转成Character对象。把String换成Character就行
回复 使用道具 举报
  1. 一、反射的基石为class
  2. 下面我们用一个特别实际的例子来了解一下
  3. l
  4. Person类代表人,它的实例对象就是张三,李四这样一个个具体的人, Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?
  5. Ø       人-->Person
  6. Ø       Java类-->Class
  7. 我们在定义一个普通的Person对象的时候是这样来实现的
  8. Person p1 = new Person();
  9. Person p2 = new Person();
  10. 但是如果我们想定义一个class对象是不是也可以像这样扶植呢?
  11. Class cls1 = new Class();?这里我给出答案,是不能这样写的,在java里,是不允许这样赋值的的,同样也没有这种赋值的写法
  12. 那么我们该如何来实现呢?
  13. 我们来通过字节码来实现,如下
  14. Class cls1 = 字节码;
  15. 那么什么是字节码呢?每一个字节码都是一个class的对象
  16. 如果说这里有三个对象,分别是:Person,Math,Date
  17. 那么我们就可以用字节码来实现
  18. Class cls1 = Date.class;//Date.class代表Date类得字节码
  19. Class cls2 = Person.class;//Person.class代表Person类得字节码

  20. 那么又是如何得到各个字节码对应的实例对象

  21. Ø
  22. Ø     类名.class,例如,System.class
  23. Ø    对象.getClass(),例如,new Date().getClass()
  24. Ø    Class.forName("类名"),例如,Class.forName("java.util.Date");//做反射的时候做多使用第三种

  25. 现在可以说是该了解的都已经了解了,那么我们来通过一个小的程序段来更好的了解反射
  26. package cn.itcast.day1;
  27. import java.lang.reflect.Constructor;
  28. public class ReflectTest {

  29. public static void main(String[] args) throws Exception
  30. {
  31.   String str1 = "abc";
  32.   Class cls1 = str1.getClass();
  33.   Class cls2 = String.class;
  34.   Class cls3 = Class.forName("java.lang.String");
  35.   System.out.println(cls1 == cls2);
  36.   System.out.println(cls1==cls3);
  37.   
  38.   System.out.println(cls1.isPrimitive());//isPrimitive 判定指定的 Class 对象是否表示一个基本类型。打印结果为:false
  39.   System.out.println(int.class.isPrimitive());//输出结果为:true
  40.   System.out.println(int.class==Integer.class);//输出结果为false
  41.   System.out.println(int.class==Integer.TYPE);//TYPE表示基本类型 int 的 Class 实例,输出结果为:true
  42.   System.out.println(int[].class.isPrimitive());//输出结果为:false
  43.   System.out.println(int[].class.isArray());//isArray判定此 Class 对象是否表示一个数组类。输出结果为:true
  44.   
  45.   Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
  46.   String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
  47.   //String str2 = (String)constructor1.newInstance("abc");Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
  48.   System.out.println(str2.charAt(2));//输出abc中的第二个字符,输出结果为c
  49. }
  50. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
不是因为object对象不能转成String对象,而是因为这个object的引用指向的对象的本质不是String
类的对象。所以它才不能转成String对象,所以在强制转换的时候,父类转成子类对象时,一定得
确定子类对象的类型,要不然就转不了。所以只能转成object的子类对象Character!

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马