在父类中访问子类的成员变量

ihrthk Boss直聘 Android开发工程师  2012-11-29 12:20:29

public class Father {

private String father;

public Father() {
Field fs[] = this.getClass().getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
System.out.println(f.getType().getName() + " " + f.getName());
}
}

}


public class Son extends Father {

private int age;
private String name;

public Son() {
super();
// TODO Auto-generated constructor stub
}

}


public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Son son = new Son();
}

}

这个是打印结果:
int age
java.lang.String name

请重点分析Father的构造方法this变量,解释一下打印出来的为什么是上面的结果?

我觉得的结果是:
java.lang.String name
...全文
221 点赞 收藏 11
写回复
11 条回复
画水 2012年11月29日
引用 4 楼 ihrthk 的回复:
引用 1 楼 huntor 的回复:“你觉得”才搞笑,既然Son声明的name应该输出,声明的age为什么就不该输出? this指的是当前的这个实例,main方法里就是一个Son,Son声明了两个成员变量。 不好意思,我说错了 我觉得的结果这个是, java.lang.String fahter
getFields()获得某个类的所有的公共(public)的字段,包括父类。 getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced, 但是不包括父类的申明字段。
回复 点赞
suciver 2012年11月29日
引用 6 楼 ihrthk 的回复:
引用 3 楼 hwhzw02 的回复: this.getClass().getDeclaredFields(); 这里的this指的是子类的实例吧,他除了自己的变量还包括父类的变量。你把子类的变量name去掉,结果一样的。 private String father; 改为 protected String father; 输出结果还是: int age java.lang.Stri……
为啥会这样呢,是因为getDeclaredFields()方法造成的 getDeclaredFields这个方法能获取到这个类本身的所有字段不论是private还是其它的。继承的就不行了。必须要是在本类中声明的。而反射中还提供了一个getFields方法这个方法可以得到继承的但是必须是public修饰的
回复 点赞
ihrthk 2012年11月29日
引用 5 楼 suciver 的回复:
楼主肯定是受了父类构造方法的影响。其实不然在类的构造时确实要先调用父类中的构造方法。但是父类的构造方法中用的是this,this代表的是当前对象的实例,而你是new Son自然this就代表Son了打印出Son类的成员变量一点也不奇怪
恩,这个this指的是当前对象,在运行的时候并不一定是当前类的一个实例。可以这么理解吧?
回复 点赞
ihrthk 2012年11月29日
引用 3 楼 hwhzw02 的回复:
this.getClass().getDeclaredFields(); 这里的this指的是子类的实例吧,他除了自己的变量还包括父类的变量。你把子类的变量name去掉,结果一样的。
private String father; 改为 protected String father; 输出结果还是: int age java.lang.String name 而没有 java.lang.String father 何解?
回复 点赞
suciver 2012年11月29日
楼主肯定是受了父类构造方法的影响。其实不然在类的构造时确实要先调用父类中的构造方法。但是父类的构造方法中用的是this,this代表的是当前对象的实例,而你是new Son自然this就代表Son了打印出Son类的成员变量一点也不奇怪
回复 点赞
ihrthk 2012年11月29日
引用 1 楼 huntor 的回复:
“你觉得”才搞笑,既然Son声明的name应该输出,声明的age为什么就不该输出? this指的是当前的这个实例,main方法里就是一个Son,Son声明了两个成员变量。
不好意思,我说错了 我觉得的结果这个是, java.lang.String fahter
回复 点赞
画水 2012年11月29日
this.getClass().getDeclaredFields(); 这里的this指的是子类的实例吧,他除了自己的变量还包括父类的变量。你把子类的变量name去掉,结果一样的。
回复 点赞
YECHWNG 2012年11月29日
Field fs[] = this.getClass().getDeclaredFields(); for (int i = 0; i < fs.length; i++) { 数组循环输出,结果是对的
回复 点赞
失落夏天 2012年11月29日
我是看题目才进来的,这明明是子类访问父类的成员变量。 子类被实例化的时候调用父类的构造方法。 另外给你一个简历可以看得更直观。你输出一下子类对象的地址,父类对象的地址,然后输出一下this的地址。看看this和哪一个一样。
回复 点赞
huntor 2012年11月29日
“你觉得”才搞笑,既然Son声明的name应该输出,声明的age为什么就不该输出? this指的是当前的这个实例,main方法里就是一个Son,Son声明了两个成员变量。
回复 点赞
H_devil 2012年11月29日
学习了!!!!!!谢谢各位
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告