1. 闲话不说,抛出问题:
代码及运行结果如下:
Base.java
package xiaoyu.test;
class Base {
String a = "Base1";
private String showMe() {
return "Base2";
}
public void print() {
System.out.println(this.showMe() + " " + this.a + " " + this + " " + super.toString());
}
}
Sub.java
package xiaoyu.test;
public class Sub extends Base {
String a = "Sub";
public static void main(String[] args) {
Sub sub = new Sub();
sub.print();
}
}
运行结果:
2. 运行结果分析
先明确基础知识:
- 继承:首先,Public 类型的 Sub 类继承了 Base 类,也就拥有了 Base 类的所有变量和方法,但是如果Sub类能直接访问的必须是 Public 类型的变量和方法,如果Sub类想要访问 Base 类的私有变量和方法,则必须借助公有接口(方法)。
- this关键字:两个用途:一是引用隐式参数,二是调用该类其他的构造器。
- super关键字:两个用途:一是调用父类的方法,二是调用父类的构造器。
运行结果分析:
首先,由于 Sub 类没有重写父类的print() 方法,所以这里调用的print()方法是从父类中继承的,所以这里实质上执行的是父类的方法。那么,问题来了:
- 既然是正在执行父类的方法,那么this关键字打印出来的为何是子类 Sub 的一个实例对象?如果this是子类Sub的一个引用对象的话,this 是没有权限调用父类的私有方法showMe()的。
- super.toString() 的打印结果为何是Sub类的一个实例?