A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 全海波 中级黑马   /  2012-7-13 19:25  /  1431 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 全海波 于 2012-8-4 09:43 编辑
  1. class FuZi
  2. {
  3. public static void main(String[] args)
  4. {
  5. Zi z = new Zi();
  6. z.function();
  7. //z.show();
  8. //Fu f = new Zi();
  9. //f.show();
  10. //f.function();
  11. }
  12. }
  13. class Fu
  14. {
  15. void show()
  16. {
  17. System.out.println("fu show");
  18. }
  19. }
  20. class Zi extends Fu
  21. {
  22. void function()
  23. {
  24. super.show();
  25. this.show();
  26. }
  27. void show()
  28. {
  29. System.out.println("zi show");
  30. }
  31. }
  32. 为何super与this可同存呢?
复制代码

7 个回复

正序浏览
你这只是一般的继承函数调用,你函数中的super.show();是调用父类的show()方法。this.show()是调用子类的show()方法。如果你在子类中这样写构造函数:
Zi(int xx)
{
super();
this();
}
这样就会编译报错了。

子类的构造函数如果要引用super的话,必须把super放在函数的首位。(这里引用的是构造函数)
同样,子类的构造函数如果要引用thisr的话(即本类中的其他构造函数),必须把this放在函数的首位。
在一个构造函数中this、super的构造函数引用是不能同时存在的。
回复 使用道具 举报
陈冲 中级黑马 2012-7-13 20:21:13
7#
本帖最后由 陈冲 于 2012-7-13 20:25 编辑

void function()
{
super.show();
this.show();
}

如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中的哪个构造函数,
同时子类构造函数中如果使用了this调用了本类构造函数时,那么super()就没有了,因为super和this都只能定义在第一行,
所以只能有一个,但是可以保证的是,子类中肯定会有其他的构造函数防伪父类的构造函数。


这里的show()方法不在构造函数内部,所以可以存在父类、子类的不同调用
回复 使用道具 举报
不能同存是指的构造方法,new一个对象时都会调用与之对应的构造方法,假如有以下代码,(this和super共存了)
class Person
{
        String name = null;
        int age = 0;
        Person()
        {}
}

class Student extends Person
{
        String name = null;
        int age = 0;
        Student()
        {
               super();
                this();
        }
}
当new Student();时调用的是student的构造方法,super()又调用父类的构造方法,然后执行this(),调用的是studnet的构造方法,等于又执行了一次父类的构造方法,然后又要this(),如此程序就不断循环调用子父类的构造方法,这样编译就不能通过。
而super.show();this.show();只是调用父类和子类的show()方法,不存在上面所述的问题。
回复 使用道具 举报
忽略了!
回复 使用道具 举报
在--------构造函数-------里面this()和super()二者只能有其一。

this和super用法几乎一样,this.代表的是本类引用,this()调用的是本类的构造方法,而super.代表的是父类引用,sper()调用的是父类的构造方法


帅哥是构造函数哦  你的这个
void function()
{
super.show();
this.show();
}

不是构造方法  当然可以用哦
回复 使用道具 举报
这个我知道呀,不是说不能同时出现super与this吗?有super就不能有this,反之亦然
回复 使用道具 举报
一个是子类的引用,一个是父类引用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马