super和this都是引用,指向同一个内存地址,不一样的是对这两个东西的解释,这要从类的内存布局说起。
一个class,如果继承于其他类,那么前面的内存部分是父类的东西,后面部分才是自己的,当你访问父类,只要能把this转成父类引用,编译器根本不会意识到目前在操作的是子类,super = (father)this。 upcast.
为了RTTI,需要downcast,编译器会对这两个类作内部作一些处理,使他们能表现正确的行为,比如多重继承,虚拟继承等,先忽略这些,父类和子类就是一个简单的内存空间堆叠关系,并没有真正“产生”一个父类。
class Super {
}
class SubClass extends Super{
public void foo() {
System.out.println(this.getClass());
System.out.println(super.getClass());
}
}
在这段代码里,
this就是class SubClass这个类(的对象的引用)
super就是class Super这个类(的对象的引用)
而
System.out.println(this.getClass());
System.out.println(super.getClass());
的执行结果完全看用哪个对象在调用getClass()这个方法
比如实例化了一个SubClass的对象sub
sub.foo();
那this.getClass()的结果完全能理解
应该是sub这个对象对应的类——SubClass
那super.getClass()的结果呢?
一般的想法可能是这样——Super
但是这是不对的,
因为这里仅仅是在sub这个对象里调用了父类中的getClass()这个方法
而这个方法的意义是返回当前对象对应的类
所以super.getClass()的结果
应该是sub这个对象(当前对象)对应的类——SubClass