this指针应该代表被实力化的对象。
如果调用的是一个子类对象继承了父类方法,那么this指针应该仍然代表子类对象。这种情况下如果子类复写了父类方法,调用的应该是覆盖之后的子类方法。
例如:class Father {
public String s() {
return "Father";
}
public void show() {
System.out.print(this.s()); // this代表子类对象?
}
}class Son extends Father {
public String s() { // 复写了父类同名方法
return "Son";
}
}
Son s = new Son(); // 创建子类对象
s.show(); // 调用子类继承的父类方法,此时this仍然表示子类对象,所以s()是子类复写的方法!java输出Son.但是如果将函数改为属性会出现不同的结果:class Father {
public String s = "Father";
public void show() {
System.out.print(this.s); // this代表子类对象?
}
}class Son extends Father {
public String s = "Son";
}
Son s = new Son(); // 创建子类对象
s.show(); 此时将输出Father
我的问题就是为什么第二种情况不会出现子类覆盖父类的情况,是因为this区分对待方法和属性,还是因为java不覆盖属性?
如果调用的是一个子类对象继承了父类方法,那么this指针应该仍然代表子类对象。这种情况下如果子类复写了父类方法,调用的应该是覆盖之后的子类方法。
例如:class Father {
public String s() {
return "Father";
}
public void show() {
System.out.print(this.s()); // this代表子类对象?
}
}class Son extends Father {
public String s() { // 复写了父类同名方法
return "Son";
}
}
Son s = new Son(); // 创建子类对象
s.show(); // 调用子类继承的父类方法,此时this仍然表示子类对象,所以s()是子类复写的方法!java输出Son.但是如果将函数改为属性会出现不同的结果:class Father {
public String s = "Father";
public void show() {
System.out.print(this.s); // this代表子类对象?
}
}class Son extends Father {
public String s = "Son";
}
Son s = new Son(); // 创建子类对象
s.show(); 此时将输出Father
我的问题就是为什么第二种情况不会出现子类覆盖父类的情况,是因为this区分对待方法和属性,还是因为java不覆盖属性?
看看你能不能等到正确的解释吧。
http://community.csdn.net/Expert/TopicView3.asp?id=5513661
然后再编译子类的方法。第一例从重写了父类的方法。
所以只有子类的方法
而后一例没有重写所以就实质上是你类的方法
这就好像构造方法一样你不写构造方法系统就给你一个默认的
你写了他就把那个默认搞掉了。当然我是说参数和类型完全一样
不知道说的对不对 呵呵
ps2: 不好意思,最近没怎么上网,不过帖子肯定会结。谢谢大家帮我解答。
那么你可以记得,如果事例化吊用,那么是调用子类的方法(重写父类的),或者调用父类的成员变量(就是父类的属性)楼主的THIS指针可以充分的证明这点。其实有些东西是记住就行。如果你想知道为什么不是调用子类的属性,但他又用子类的方法,其实是想不大通的。
PS:面试题很容易出这个题目。
PS:不知道这样解释对不对?