黑马程序员技术交流社区

标题: 关于反射的一个小问题 [打印本页]

作者: 万宝东    时间: 2012-7-3 17:54
标题: 关于反射的一个小问题
本帖最后由 万宝东 于 2012-7-4 07:57 编辑

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class ReflectPoint {
private int x;
public int y;
public String str1 = "ball";
public String str2 = "baskball";
public String str3 = "itcast";
public ReflectPoint(int x, int y) {
  super();
  this.x = x;
  this.y = y;
}

public String toString(){
return str1 + ":" + str2+ ":" + str3;
//return x + ":" + y+ ":" + str3;
}
}

public class ReflectTest {
public static void main(String[] args) throws Exception{
  ReflectPoint pt1 = new ReflectPoint(3,5);
  
  changeStringValue(pt1);
  System.out.println(pt1);
  
}
private static void changeStringValue(Object obj) throws Exception{
  Field[] fields = obj.getClass().getFields();
  for(Field field : fields){
   //if(field.getType().equals(String.class))
   if(field.getType() == String.class){
    String oldValue = (String)field.get(obj);
    String newValue = oldValue.replace('b', 'a');
    field.set(obj,newValue);
   }
  }
  
}
}

这个是张老师视频中的一个小程序,我有一个疑问, changeStringValue(pt1);这句代码中传入的对象pt1,是通过ReflectPoint pt1 = new ReflectPoint(3,5); 创建的,但是ReflectPoint的构造方法中并没有调用str1,str2,str3,为什么最后编译完成后打印结果却是
aall:aaskaall:itcast   这个。难道就是因为重写了toString方法吗。我试验了一下,吧重写的toString方法换成return x + ":" + y+ ":" + str3;,就会打印x,y,str3的值。这是为什么呢。

作者: 万宝东    时间: 2012-7-3 19:19
{:soso_e132:}
作者: 黑马振鹏    时间: 2012-7-3 20:25
这个是张老师视频中的一个小程序,我有一个疑问, changeStringValue(pt1);这句代码中传入的对象pt1,是通过ReflectPoint pt1 = new ReflectPoint(3,5); 创建的,但是ReflectPoint的构造方法中并没有调用str1,str2,str3,为什么最后编译完成后打印结果却是
aall:aaskaall:itcast   这个。
打印肯定是调用toString()啊,这个跟构造函数没有直接关系。


难道就是因为重写了toString方法吗。我试验了一下,吧重写的toString方法换成return x + ":" + y+ ":" + str3;,就会打印x,y,str3的值。这是为什么呢。

这里就是toString()的具体应用,你想打印那些内容就修改return即可。这个方法是可以自己根据实际需求自定义的

作者: 王明明    时间: 2012-7-3 20:58
String newValue = oldValue.replace('b', 'a');
这里把Str1 2 3 b字符替换成了a
作者: 周朋飞    时间: 2012-7-3 21:06
这问题很简单啊 首先你重写了toString方法 要求输出str1  str2 str 3的值 ,这三个值是pt1 对象的属性啊 也就是field啊 那你在change方法当中把一个对象传进去,那对象是不是拥有这些属性值呢 是吧 ,然后你对属性值进行遍历 是String类型的话就将字符改变一下 ,这没什么问题啊 ,并且你声明的三个str都是public类型的 所以你同过getField方法肯定是能获得这三个的 ,然后改变之后你又将其的值给set了 所以结果肯定就是你输出的啊 对象一创建就会初始化,如果你没有显示初始化,引用类型的会初始化为null基本类型为0,而你这里已经付了初值,所以就算你构造方法中没有这三个参数的重载,也已经有值了啊 所以还是把构造函数那一块弄明白吧
作者: 李靖    时间: 2012-7-3 22:16
Field[] fields = obj.getClass().getFields();
这句代码的意思是获得obj对象的成员变量的值。这就是问题的关键,toString只是对父类方法的重载而已。
Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.

The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

getClass().getName() + '@' + Integer.toHexString(hashCode())
通过上面的英文就很好理解toString方法了

作者: 黑马-王言龙    时间: 2012-7-3 23:40
本帖最后由 黑马-王言龙 于 2012-7-3 23:51 编辑

System.out.println(pt1);  相当于System.out.println(pt1.toString());
即打印对象会自动调用对象的toString()方法
所以你说的中正确的

具体实现:
public void println(Object x) {
        String s = String.valueOf(x);    //调用了valueOf(Object, obj)方法
        synchronized (this) {
            print(s);    //将s得到的信息打印
            newLine();    //换行
        }
    }

public static String valueOf(Object obj) {   
    return (obj == null) ? "null" : obj.toString();    //valueOf(Object, obj)方法又用到了obj.toStirng()方法
}
作者: 万宝东    时间: 2012-7-4 07:54
哦 明白了 谢谢楼上各位的帮助




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2