黑马程序员技术交流社区

标题: 求解惑,super和this到底是不是引用? [打印本页]

作者: 李建强    时间: 2012-9-24 19:35
标题: 求解惑,super和this到底是不是引用?
本帖最后由 李建强 于 2012-9-24 19:45 编辑
  1. class TestFu
  2. {
  3. public void show()
  4. {
  5. System.out.println("我是Test的父类!");
  6. }
  7. }

  8. public class Test extends TestFu
  9. {
  10. public void show()
  11. {
  12. System.out.println("我就是传说中的Test了。");
  13. }
  14. public void callOverridedMethod()
  15. {
  16. Object obj = this;
  17. System.out.println(obj.toString());//this是引用。
  18. super.show();//这一句正常
  19. //super不是引用。如果super是引用的话,那么为什么不可以把引用传给obj1?
  20. //下面这句不能编译。
  21. Object obj1 = super;
  22. }


  23. public static void main(String[] args)
  24. {
  25. Test t=new Test();
  26. t.show();
  27. t.callOverridedMethod();
  28. }

  29. }
复制代码
对于super,
《The Java Programming Language》上这样说:
In field access and method invocation, super acts as a reference to the current object as an instance of its superclass.
这里面super acts as a reference ,说super 只是acts as,但不是reference。如果不是引用是什么?

对于this.
JLS上这样说:
When used as a primary expression,
the keyword this denotes a value that is a reference to the object for which the instance method was invoked (§15.12),
or to the object being constructed.
这里说this is a reference。说this是一个reference。

这样理解可对?
还有,怎么使用它们就不要说了。
作者: 尤圣回    时间: 2012-9-24 19:37
super在语法层次,看上去就像父类对象的指针,但是事实却不是,在构造函数第一句的super指的是一个父类的构造方法,即使你不加super,那么虚拟机会自动添加super()在任何构造方法的第一句,也就是说父类构造方法一定会被执行。而普通方法中的super.xxx中的super也不是父类的对象,而是一个引用父类类型的一个指针,其实无论super还是this,把它理解为指向对象其实是并不太合适的。更好的理解应该是指向当前类型,因为无论怎么样,对象只有一个。
super是编译才有用的,是用来指导编译器的。
这里说明this是引用,而super不是

作者: 尤圣回    时间: 2012-9-24 19:42
这个问题我这几天正好也在研究 刚好帮你




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2