首先,我们创建一个父类 Father 和子类 Son:
public class Father {
public void age() {
say();
System.out.println("我 50 岁啦!!!");
}
public void say() {
System.out.println("我是父亲!!!");
}
}
public class Son extends Father {
@Override
public void age() {
super.age();
}
@Override
public void say() {
System.out.println("我是儿子???");
}
}
例1
创建一个子类实例 son,并调用其 age() 方法:
public static void main(String[] a) throws Exception {
Son son = new Son();
son.age();
}
输出为:
我是儿子???
我 50 岁啦!!!
可以发现,虽然子类的 age() 方法的实现是调用了父类 age() 方法,但 say() 方法实际上调用的还是子类重写后的 say()。
例2
尝试修改父类 age() 方法,将 say() 改成 this.say():
public class Father {
public void age() {
this.say(); // 之前是 say()
System.out.println("我 50 岁啦!!!");
}
public void say() {
System.out.println("我是父亲!!!");
}
}
输出结果:
我是儿子???
我 50 岁啦!!!
发现输出结果仍旧是一样的,这说明这里的 this,所指的对象仍旧是子类对象 son,因此调用的还是子类重写后的 say() 方法。
例3
去掉子类重写的 say() 方法:
public class Son extends Father {
@Override
public void age() {
super.age();
}
//@Override
//public void say() {
// System.out.println("我是儿子???");
//}
}
再次执行 main 方法,发现输出变成了:
我是父亲!!!
我 50 岁啦!!!
此时 this 指代的是父类对象。